认识Json Web Token

定义

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

header 部分

header 本身是一个 json 对象:

1
2
3
4
{
"alg": "hs256", // 加密算法
"typ": "JWT" // 签名类型:就是jwt
}

将这个 json 对象用 base64url 算法编码为字符串,放入 jwt 中。

payload 部分

同样是 json 对象,可以用于保存不敏感的数据。例如:

1
2
3
{
"userName": "dongyuanxin"
}

除此之外,这个 JSON 对象中还有其他 JWT 规定的字段。

和 header 部分一样,用 base64url 算法编码为字符串,放入 jwt 中。

sign 部分

将 header 部分和 payload 部分进行加密所得。伪代码如下:

1
2
3
const data = base64url.encode(header) + "." + base64url.encode(payload);
const sign = hash.hs256(secret, data).toString(); // 得到签名

代码中出现的 secret 是加密所需的密钥,存放在服务端,不能泄漏。工程上一般通过配置中心下发。

场景

JWT 用于分布式用户身份认证。因为服务器是无状态的,所以非常方便扩展。

007S8ZIlgy1giyp7nr9ujj30m80fata9.jpg

上图是交互流程:

  • 用户携带 user 和 pwd 登录
  • 登录成功后,服务端签发 JWT
  • 之后用户每次请求都携带 JWT(通过headers字段)
  • 服务端对前端传来的 JWT 进行校验

校验逻辑:

  • 解出 header、payload 和 sign
  • 将 header 和 payload 加密,将加密结果与 sign 比较

参考链接