一、登录模式
在介绍JWT之前,我要先介绍一下常见的几种登录模式。
1、单一服务器模式(Session)
我们登录认证成功之后,将用户信息就存放在服务端(Session)
,然后将其对应的session_id存储在客户端(Cookie)
,从Cookie中取出session_id,服务端就可以根据这个session_id获取对应的Session,从而获取存储用户信息。
其优点是:Session自动续期,用户体验较好
其缺点是:
①没有分布式架构,无法支持横向扩展。即分布式架构的情况下,其他服务器是没有办法获取到用户信息的。当然,可以使用Session共享的方式来解决这个问题。或者,可以将用户信息存储在Redis里,用一个透明令牌(字符串)作为key,并把这个令牌存储到本地(cookie、localStorage),然后通过令牌去Redis取用户信息。
②Session依赖Cookie,如果客户端禁用了Cookie,那么Session无法正常工作。其解决方法就是,可以在请求的url后面拼接上session_id,如:http://www.liuchengyin.com/test?session_id=xxx
,其安全性和用户体验感较差。
③ Session依赖Cookie,Cookie无法防止CSRF(Cross Site Request Forgery):跨站请求伪造
。Session认证中,Cookie是通过浏览器发送到服务端的,借助这个特性,攻击者可以通过让用户误点攻击连接(攻击者通过cookie拿到你的session_id就可以代替你的身份访问系统)达到攻击效果。
2、SSO模式(单点登录模式)
用户只需要在身份认证服务器上登录一次,你就可以访问这个单点登录中其他关联系统的应用软件的权限,同时这种实现是不需要管理员对用户登录状态或其他信息进行修改的,这意味着多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。
**优点:**用户身份信息独立管理,可以更好的分布式管理,可以自己扩展安全策略。
**缺点:**认证服务器访问压力会比较大