[Lv1] JWT 的结构是什么?
面试官常会接着问:「JWT 长什么样子?为什么要这样设计?」搞清楚结构、编码方式与验证流程,就能快速回答。
1. 基本轮廓
JWT(JSON Web Token)是一种 自包含(self-contained) 的 Token 格式,用来在双方之间安全地传递信息。内容由三段字符串构成,使用 . 串接:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphbmUgRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
拆开来看就是三个 Base64URL 编码的 JSON:
- Header:描述 Token 使用的算法、类型。
- Payload:存放用户信息与声明(claims)。
- Signature:用密钥签章,确保内容未被篡改。
2. Header、Payload、Signature 详解
2.1 Header(标头)
{
"alg": "HS256",
"typ": "JWT"
}
alg:签章算法,例如HS256(HMAC + SHA-256)、RS256(RSA + SHA-256)。typ:Token 类型,通常为JWT。
2.2 Payload(载荷)
{
"sub": "1234567890",
"name": "Jane Doe",
"iat": 1516239022,
"exp": 1516242622,
"role": "admin"
}
- Registered Claims(官方保留,但非必填):
iss(Issuer):签发者sub(Subject):主题(通常是用户 ID)aud(Audience):接收对象exp(Expiration Time):到期时间(Unix timestamp,秒)nbf(Not Before):在此时间前无效iat(Issued At):签发时间jti(JWT ID):Token 唯一识别码
- Public / Private Claims:可加入自定义字段(例如
role、permissions),但要避免过度冗长。
2.3 Signature(签章)
签章生成流程:
signature = HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
- 使用密钥(
secret或私钥)对前两段进行签名。 - 服务器收到 Token 后重新计算签章,如果一致,代表 Token 未被篡改且确实由合法来源签发。
注意:JWT 只保证数据完整性(Integrity),不保证机密性(Confidentiality),除非额外加密。
3. Base64URL 编码是什么?
JWT 使用 Base64URL 而非 Base64,差异在于:
- 把
+改成-,/改成_。 - 移除结尾
=。
这样做的好处是 Token 可以安全地放在 URL、Cookie 或 Header 中,不会因为特殊字符造成问题。
4. 验证流程简图
- 客户端在 Header 带入
Authorization: Bearer <JWT>。 - 服务器收到后:
- 解析 Header、Payload。
- 取得
alg指定的算法。 - 使用共享密钥或公开密钥重新计算签章。
- 比对签章是否一致,并检查
exp、nbf等时间字段。
- 验证通过后才能信任 Payload 内容。
5. 面试回答框架
「JWT 由 Header、Payload、Signature 三段组成,用
.串接。 Header 描述算法与类型;Payload 存放用户信息与一些标准字段,例如iss、sub、exp;Signature 则是用密钥对前两段签名,用来确认内容没有被改动过。 内容是 Base64URL 编码的 JSON,但并没有加密,只是转码,所以敏感数据不能直接塞进去。服务器拿到 Token 后会重新计算签章比对,如果一致且没过期,就代表 Token 有效。」
6. 面试延伸提醒
- 安全性:Payload 可被解码,请勿放密码、信用卡等敏感信息。
- 到期与更新:通常会搭配短效 Access Token + 长效 Refresh Token。
- 签章算法:可提到对称式(HMAC)与非对称式(RSA、ECDSA)的差别。
- 为什么不能无限长?:Token 太大会增加网络传输成本,也可能被浏览器拒绝。