为什么需要JWT?

  • 我们之前学到的Session认证机制需要配合Cookie才能实现,且由于Cookie是不支持跨域访问的, 因此,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域 Session 认证
  • 注意
    • 前端请求后端接口不存在跨域问题的时候,推荐使用 Session 身份认证机制。
    • 前端需要跨域请求后端接口的时候,不推荐使用 Session 身份认证机制,推荐使用 JWT 认证机制。

什么是JWT?

  • JWT(英文全称:JSON Web Token)是目前最流行的跨域认证解决方案
  • 它遵循JSON格式(因此不存在跨域问题),将用户信息加密到token里,服务器不保存任何用户信息,只保存密钥信息,通过使用特定加密算法验证token,通过token验证用户身份。基于token的身份验证可以替代传统的cookie+session身份验证方法。

JWT的工作原理:

image

总结

  • 用户登录提交信息到服务器 , 服务器将用户提交的信息通过特定的密钥加密成一个token字符串, 随后相应给客户端, 客户端再将响应回来的token字符串主动的保存到浏览器当中(localstorage,localsession), 今后凡是需要进行身份验证的时候, 客户端就会通过请求头里面的Authorization这个字段, 将token发送给服务器, 服务器就会将这个token还原成用户的信息对象, 从而对用户的身份进行认证

JWT的组成部分

  • JWT 通常由三部分组成,分别是 Header(头部)、Payload(有效荷载)、Signature(签名)。
  • 三者之间使用英文的“.”分隔(这个.号只有分隔的作用),格式如下:
Header.Payload.Signature
  • 生成的Token示例如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

这三个部分的作用

  • Payload 部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串。
  • HeaderSignature安全性相关的部分,只是为了保证 Token 的安全性,来防止别人破解token里面的信息。
    image

JWT的使用方式

  • 客户端收到服务器返回的 JWT 之后,通常会将它储存在 localStoragesessionStorage 中。
  • 此后,客户端每次与服务器通信,都要带上这个 JWT 的字符串,从而进行身份认证。推荐的做法是把 JWT 放在 HTTP 请求头的 Authorization 字段中,格式如下:
fetch('api/user/1', {
headers: {
'Authorization': 'Bearer ' + token
}
})