2. JWT 结构解析:Header、Payload、Signature 的组成与作用
JWT(JSON Web Token)是一种紧凑的、自包含的、基于 JSON 的开放标准(RFC 7519),用于在各方之间以安全的方式传输信息。一个完整的 JWT 由三个独立的部分通过 .(点号)连接而成,其通用格式如下:
xxxxx.yyyyy.zzzzz
这三部分分别对应:Header(头部)、Payload(载荷) 和 Signature(签名)。每一部分都经过 Base64URL 编码,最终组合成一个紧凑的字符串。
核心特征:JWT 是自包含的,意味着所有必要的用户信息和元数据都编码在 Token 内部,服务端无需查询数据库即可验证用户身份。
2.1 三部分结构总览
下表展示了 JWT 三个组成部分的核心功能与编码方式:
| 组成部分 | 英文名称 | 编码方式 | 核心作用 | 是否加密 |
|---|---|---|---|---|
| 头部 | Header | Base64URL | 声明 Token 类型和签名算法 | 明文(仅编码) |
| 载荷 | Payload | Base64URL | 携带用户身份、权限及自定义声明 | 明文(仅编码) |
| 签名 | Signature | 算法生成 | 验证 Token 完整性与防篡改 | 密文(不可逆) |
⚠️ 安全警示:Header 和 Payload 仅经过 Base64URL 编码,并非加密。任何持有 Token 的人都可以解码并读取其中的内容。切勿在 Payload 中存放密码、密钥等敏感信息。
2.2 Header(头部)—— 算法与类型声明
Header 通常由两部分组成:Token 类型(typ)和签名算法(alg)。它是 JWT 的第一段,用于告知解析方如何验证签名。
标准字段:
typ(Type):固定为JWT,表示这是一个 JWT 令牌。alg(Algorithm):签名算法,如HS256(HMAC-SHA256)、RS256(RSA-SHA256)等。
示例 Header(解码前):
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
示例 Header(解码后):
{
"alg": "HS256",
"typ": "JWT"
}
2.3 Payload(载荷)—— 声明与数据载体
Payload 是 JWT 的核心数据部分,包含三类声明(Claims):注册声明、公共声明 和 私有声明。这些声明构成了 Token 携带的用户信息。
| 声明类型 | 标准字段 | 说明 |
|---|---|---|
| 注册声明 (预定义) |
iss (Issuer) |
签发者,标识 Token 的签发方 |
sub (Subject) |
主题,通常为用户的唯一标识(如 user_id) | |
exp (Expiration Time) |
过期时间,Unix 时间戳格式,过期后 Token 失效 | |
iat (Issued At) |
签发时间,Unix 时间戳格式 | |
| 公共声明 | 自定义字段 | 在 IANA JSON Web Token Claims 注册表中定义的公开字段 |
| 私有声明 | 自定义字段 | 服务端与客户端约定的自定义数据,如 role、permissions |
示例 Payload(解码后):
{
"sub": "1234567890",
"name": "张三",
"role": "admin",
"iat": 1516239022,
"exp": 1516242622
}
2.4 Signature(签名)—— 防篡改核心
Signature 是 JWT 安全性的基石。它通过将 编码后的 Header、编码后的 Payload 与一个 密钥(Secret) 组合,使用 Header 中指定的算法计算得出。
签名生成公式:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
签名验证流程:
- 服务端收到 JWT 后,提取前两段(Header 和 Payload)。
- 使用相同的密钥和算法重新计算签名。
- 将计算出的签名与 Token 中的第三段签名进行比对。
- 如果一致,则 Token 未被篡改;否则拒绝请求。
💡 设计要点:签名机制确保了 JWT 的完整性,但不提供机密性。如果需要对 Payload 内容进行加密,应使用 JWE(JSON Web Encryption)标准。
2.5 JWT 结构示意图
下图展示了 JWT 三部分的编码关系与签名生成流程:
2.6 完整 JWT 示例
以下是一个完整的 JWT 示例,包含三个部分及其解码后的内容:
原始 JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IuW8oOS4iSIsImlhdCI6MTUxNjIzOTAyMiwiZXhwIjoxNTE2MjQyNjIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
解码后各部分:
| 部分 | 解码后内容 |
|---|---|
| Header | {"alg":"HS256","typ":"JWT"} |
| Payload | {"sub":"1234567890","name":"张三","iat":1516239022,"exp":1516242622} |
| Signature | 由 Header + Payload + 密钥计算得出,不可逆 |
2.7 常见算法对比
| 算法 | 类型 | 密钥 | 性能 | 适用场景 |
|---|---|---|---|---|
| HS256 | 对称加密 | 单一密钥 | 高 | 单体应用、内部服务 |
| RS256 | 非对称加密 | 公钥/私钥对 | 中 | 分布式系统、第三方认证 |
| ES256 | 非对称加密 | 公钥/私钥对 | 高 | 移动端、IoT 设备 |
💡 选型建议:在微服务架构中,推荐使用 RS256 或 ES256。服务端使用私钥签发 Token,其他服务使用公钥验证,无需共享密钥,安全性更高。