JWT
JWT本质就是一个字符串,它将用户信息保存在一个json字符串中,编码后就得到JWT token。 JWT Token带有签名信息,后端接收到后可以校验此JWT token是否被篡改,所以用在各个端将数据安全地以json形式传输。
流程
- 前端通过POST请求发送自己的用户名和密码,一般通过SSL加密的形式传输,从而避免敏感信息被嗅探。
- 后端通过数据库比对用户名和密码成功后,把用户信息作为JWT的Payload部分,然后与JWT Header编码拼接后再加上签名,形成JWT Token。形式就如aaa.bbb.ccc的字符串。
- 后端将JWT Token字符串返回给前端,前端将结果保存在浏览器中,退出登录时,删除已保存的JWT Token。
- 此后,前端每次请求时将JWT Token放在HTTP请求头中的Authorization中。
- 后端检查前端传输过来的JWT Token,通过比较签名是否正确、是否过期等来验证其有效性。
- 验证通过后,后端解析出JWT Token中包含的用户信息,然后进行逻辑操作,将结果返回。
优点
传统Session认证存在不足 HTTP本身是一种无状态协议,用户向后端提交了用户名和密码进行用户认证后,HTTP不会记录认证后的状态,下一次请求时,用户要再一次进行用户认证。 session认证是当用户首次登录成功后,服务器存储一份用户登录信息,登录信息会在服务器响应时传递给浏览器,浏览器保存为cookie,下次请求后携带cookie,服务器就能识别请求来自哪个用户了。
- 每个用户登录信息都保存在服务器session中,随着用户增多,服务器开销增大。
- session存在于服务器物理内存中,在分布式系统中便会失效。虽然可以将session统一保存到redis中,但增加了系统复杂性,对于不需要redis的应用也会白白引入一个缓存中间件。
- 对于非浏览器的客户端、手机移动端不适用,因为session依赖于cookie,而移动端经常没有cookie。
- session认证本质是基于cookie,若cookie被截获,用户容易受到跨站请求伪造攻击。但如果浏览器禁止cookie,此方法也将失效。
- 前后端分离系统中不适用,后端部署复杂,前端请求往往经过多个中间件到达后端,cookie中的session信息会转发多次。
- cookie无法跨域,所以session认证无法跨域,对单点登录不适用。
JWT优势
- JWT token数据量小,传输速度快。
- JWT Token是以JSON加密形式保存在客户端,所以JWT是跨语言的,任何web形式都支持。
- 不需要再服务器端保存会话信息。
JWT结构
Header Payload Signature
|