以下文章来源ldtd博客,回复666“接受面试的宝典来源: http://blog.leapoahead.com/2015/09/07/user-authentic ation-with-jwt /
用户身份验证八步是一种使用户登录并在随后的一段时间内访问站点时无需再次登录即可使用该帐户的身份验证(Authentication )机制。
小知识:请不要混淆用户认证和用户授权(Authorization )。 用户批准是指规定并允许用户使用自己的权限,包括发布帖子、管理站点等。
首先,服务器APP应用程序(以下称为“APP应用程序”)允许用户通过Web表单将用户名和口令发送到服务器界面。 这个过程通常是HTTP POST请求。 建议使用SSL加密的传输(https协议),以避免混淆敏感信息。
然后,APP应用程序和数据库将用户名和口令进行匹配。
用户名和密码匹配成功后,APP将用户的id (图中的user_id )作为JWT Payload的一个属性,对其头部分别进行Base64编码并拼接签名,形成一个JWT。 这里的JWT是与lll.zzz.xxx相同的字符串。
APP应用程序将JWT字符串作为请求Cookie的一部分返回给用户。 请注意,此处必须使用HttpOnly属性来防止将cookie导入到JavaScript中,从而避免跨站点脚本攻击(XSS攻击)
每次用户访问APP应用程序时,在cookie过期或删除之前,APP应用程序都会接受包含jwt的cookie。 APP应用可以从请求中提取JWT。
APP通过一系列任务检查JWT的有效性。 例如,检查签名是否正确; 检查Token是否过期; 检查Token的接收者是否是自己(可选)。
在确认JWT有效后,JWT可能会进行Base64解码,并在上一步中完成应用。 然后,Payload读取用户的id值,即user_id属性。 这里的用户id是1025。
APP应用从数据库获取1025个用户的信息,将该信息加载到存储器中,以及初始化诸如ORM之类的一系列基础逻辑。
APP应用程序根据用户的请求进行响应。
与Session存储标识的区别Session用户标识存储的最大缺点是它消耗大量的服务器内存,并且在大型APP应用程序中需要保存许多状态。 一般来说,大型APP应用需要使用几个KV数据库和一组缓存机制来实现Session的存储。
JWT方式可以将用户的状态分散到客户端,明显减轻服务器端的内存压力。 除了用户id外,还可以存储有关用户的其他信息,如用户是否为管理员,以及用户所在的时段
JWT方法会在服务器上施加加密、编码和解码等计算负载,但这些负载可能是磁盘I/O的一半。 具体是否招聘,需要在不同的场景下用数据说话。
单点登录方法存储用户id,最初用户的Session只存储在一台服务器上。 对于具有多个子域名的站点,每个子域名至少对应一个不同的服务。 例如:
www.taobao.com
nv.taobao.com
nz.taobao.com
login.taobao.com
因此,必须在多台服务器上同步Session,才能在登录到login.taobao.com后仍在其他子域名下检索Session。
使用JWT的方式没有这个问题,因为用户的状态已经被传输到了客户端。 因此,您只需将包含jwt cookie的domain设置为顶级域名即可。 例如
Set-Cookie:jwt=lll.zzz.xxx; 仅http; max-age=980000; 请注意,domain=.taobao.comdomain必须设置为点加顶级域名. Taobao.com。 现在,taobao.com和*.taobao.com可以接受该cookie并检索JWT。
人气内容: IntelliJ IDEA官方发布中文汉化包正式发布二维码yyds再见Spring! 下一个开源框架更香! Spring发布新成员: Spring GraphQL! 高调登场的GraphQL能生火吗? 哗啦啦的Java系列实战项目! 最近面试了BAT,整理了面试资料《Java面试BAT通关手册》,涵盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等。 获取方式:点击“查看”,关注公众号回复666领取,将陆续提供更多内容。明天见()