认识Json Web Token

Tags
身份鉴权
JWT
CreatedTime
Aug 18, 2022 11:26 AM
Slug
2020-08-16-jwt
UpdatedTime
Last updated August 18, 2022

定义

其实就是一个 token,由 3 部分组成:header.payload.sign

header 部分

header 本身是一个 json 对象:
{ "alg": "hs256", // 加密算法 "typ": "JWT" // 签名类型:就是jwt }
将这个 json 对象用 base64url 算法编码为字符串,放入 jwt 中。

payload 部分

同样是 json 对象,可以用于保存不敏感的数据。例如:
{ "userName": "dongyuanxin" }
除此之外,这个 JSON 对象中还有其他 JWT 规定的字段。
和 header 部分一样,用 base64url 算法编码为字符串,放入 jwt 中。

sign 部分

将 header 部分和 payload 部分进行加密所得。伪代码如下:
const data = base64url.encode(header) + "." + base64url.encode(payload); const sign = hash.hs256(secret, data).toString(); // 得到签名
代码中出现的 secret 是加密所需的密钥,存放在服务端,不能泄漏。工程上一般通过配置中心下发。

场景

JWT 用于分布式用户身份认证。因为服务器是无状态的,所以非常方便扩展。
notion image
上图是交互流程:
  • 用户携带 user 和 pwd 登录
  • 登录成功后,服务端签发 JWT
  • 之后用户每次请求都携带 JWT(通过headers字段)
  • 服务端对前端传来的 JWT 进行校验
校验逻辑:
  • 解出 header、payload 和 sign
  • 将 header 和 payload 加密,将加密结果与 sign 比较

参考链接