两次阿里面试总结出来的登录问题,我来教你这么回答
前言
面试的时候,总是被问到登录问题,看到很多面经,基本上都是点到为止,其实关于这方面的话,面试官总是在我简单的答完之后,继续抛出一个问题或者讲明出现的一种情况,由此来判断你的深度,你的全局关,你的项目的层次等。
下面我将讲一下两次面试的时候我的答案和总结
First
登录问题
- 用户第一次输入用户名和密码之后,会向服务器发送一个post请求,服务器接收到请求的时候会生成一个session,然后会把sessionid复制一份,也就是JESSONID,接着会把JESSONID返回给浏览器,浏览器会把JESSONID存储在Cookie里面
- 用户再次访问服务器的时候,会携带JESSONID,在服务端与sessionid进行对比,如果匹配则允许访问,如果不匹配则拦截
sessionid存储在哪里?
- 一般来说存储在服务器的内存中
如果有多台服务器呢?
PS:其实这里也是看你做过的项目是单服务器运用还是多服务器的情况,由此判断分水岭
- 多台服务器的情况的话,只是简单的提到这里需要实现服务器之间的共享问题,至于这么操作就是没有答出来,
Second
多台服务器的情况
PS:其实是有实现过,但是对于所学知识平常更多的了解这么去实现,没有去多了解技术本身,细节处没有做好,这也是大多数程序员的通病
- 第一种是中心化的操作,就是我们依旧和上面讲的一样,知识这里我们的共享问题,可以使用MYSQL数据库、文件等实体化操作来实现共享,可以使用Redis数据库来进行优化,类似黑名单的情况
- 第二种是去中心化的操作,我们不在使用session来存储,而是使用token令牌来处理
关于token
- 用户第一次输入用户名和密码之后,会向服务器发送一个post请求,服务器接收到请求的时候会比对用户名和密码是否正确,如果正确的话,会生成token令牌,服务器会把token返回个浏览器,浏览器会存储在localStorage或者sessionStorage里面
- 用户再次访问的时候会携带这个token令牌,服务器会先进行验签的操作,根据token令牌的Header和Paylod进行base64的转码之后使用header中声明的加密方式加密加盐secret组合加密,这样与第三部分的signature签名进行对比,如果匹配则允许访问,如果不匹配则拦截
对比
session的操作就是需要去查询数据库,增加了我们数据库的负担和系统的操作
token则是无状态化,可扩展性好
总结
其实,到这里就已经答得很好了,但是一个问题的抛出总是会引来下一个问题的的引入的,比如token的生成方式,有兴趣话可以自己去了解JWT(json web token),翻看我之前的文章,编写不易,点赞、关注、收藏,支持一下。其实还有很多可以讲的,但是程序员的学习更多的是需要自己去摸索出来的。