JWT 小册

JWT(JSON Web Token) 是一种分布式、跨域的单点登录方式,他开销很小而且天然支持分布式。

十分实用呐![0]

结构

JWT 以 . 作为分割,储存以下内容

  • Header:标识 JWT 的基本信息,比如算法等
  • Payload:负载,在这里会承载 JWT 的基础要素
  • Signature:签名,当 JWT 被恶意修改时将会无法验证,此时判定 JWT 失效

举个例子,典型的 JWT 应该是长成下面这样子

1
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

这里的字段是相对固定的:算法和 Token 类型

举个例子,使用 HS256 的算法的 JWT 的 Header 应该是如下样式

1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

Payload

常见的 Payload 字段有 7 个,所有的字段名都尽可能缩减为 3 个字母

如下表格即是 7 个标准 Payload 字段的定义以及是否可选

字段名备注是否可选
exp过期时间
iss发布者
sub主题
aud接收者
nbf在此之前不生效
iat发布时间
jtiJWT 的 ID

除此之外还有很多其他的常用字段[1]

Signature

对于一串 Payload,我们使用密钥计算出他的签名,若是 Payload 被篡改那么签名也会不一致

如果签名不一致,那么就可以认为 Token 被篡改了

签名算法

一般情况下使用 HMAC 足矣,但是有些为了特别安全的情况可以使用 RSA 或者 ECDSA

传输与储存方式

JWT 可以储存在 HTTP 请求的 Header 里,这是最方便的:

1
Authorization: Bearer <token>

当然,HTTP 是明文传输这是十分不安全的,所以应该是有加密层的传输最好。

除此之外,也可以填入在请求体的某个字段里,不过这不是推荐的方式:

1
2
3
4
{
"jwt": <token>,
...
}

JWT 小册
https://blog.krysztal.dev/2024/02/21/JWT-小册/
作者
Krysztal
发布于
2024年2月21日
许可协议