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
)

签名验证流程:

  1. 服务端收到 JWT 后,提取前两段(Header 和 Payload)。
  2. 使用相同的密钥和算法重新计算签名。
  3. 将计算出的签名与 Token 中的第三段签名进行比对。
  4. 如果一致,则 Token 未被篡改;否则拒绝请求。
💡 设计要点:签名机制确保了 JWT 的完整性,但不提供机密性。如果需要对 Payload 内容进行加密,应使用 JWE(JSON Web Encryption)标准。

2.5 JWT 结构示意图

下图展示了 JWT 三部分的编码关系与签名生成流程:

JWT 三部分结构与签名生成流程 Header(头部) {"alg":"HS256","typ":"JWT"} → Base64URL 编码 Payload(载荷) {"sub":"123","role":"admin"} → Base64URL 编码 Signature(签名) HMACSHA256(…) → 不可逆密文 密钥(Secret) 服务端保管,不泄露 签名算法计算 HMACSHA256 / RSASHA256 最终 JWT:Header.Payload.Signature

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,其他服务使用公钥验证,无需共享密钥,安全性更高。