4、JWT鉴权原理:Token结构、签名验证、过期机制

JWT(JSON Web Token)是目前分布式架构与前后端分离场景下最主流的鉴权凭证。理解其内部结构、签名验证流程以及过期处理策略,是正确实现后端鉴权拦截的前提。本章从Token的物理结构出发,逐步拆解其防篡改原理与生命周期管理。

4.1 JWT Token 三段式结构

一个标准的JWT由三个Base64URL编码的片段组成,以英文句号(.)连接:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
段位 名称 内容说明 是否加密
Header 头部 签名算法(alg)与令牌类型(typ) 仅Base64编码,明文
Payload 载荷 声明(Claims):用户标识、角色、过期时间等 仅Base64编码,明文
Signature 签名 对前两段+密钥的哈希摘要 防篡改,不可伪造
⚠ 安全警示:Payload 仅做 Base64 编码,并非加密。任何持有 Token 的人都可以解码查看内容。严禁在 Payload 中存放密码、身份证号等敏感明文信息。

4.2 签名验证机制

签名是JWT防篡改的核心。服务端使用密钥对 Header 和 Payload 进行哈希运算,生成 Signature。验证时,服务端用相同密钥重新计算签名,并与 Token 携带的签名比对。

🔑 签名算法分类:
  • HS256(HMAC + SHA256):对称算法,签名与验证使用同一个密钥。适合单一服务内部使用。
  • RS256(RSA + SHA256):非对称算法,私钥签名,公钥验证。适合微服务网关与多服务间鉴权。
JWT 签名验证流程 JWT 签名验证流程 客户端 服务端 发送 JWT(Header.Payload.Signature) 服务端验证步骤 1. 解析 Header,获取算法 alg 2. 用密钥 + Header + Payload 重新计算签名 3. 比对计算签名与 Token 携带签名 4. 一致 → 通过;不一致 → 拒绝 返回 200 / 401

4.3 过期机制与时间戳校验

JWT 本身是无状态的,服务端不存储 Token 记录。过期控制完全依赖 Payload 中的时间声明:

声明字段 全称 含义 校验逻辑
exp Expiration Time Token 过期时间戳 当前时间 > exp → 拒绝
iat Issued At Token 签发时间 用于计算 Token 已存活时长
nbf Not Before Token 生效时间 当前时间 < nbf → 拒绝
💡 开发建议:在 Development 环境下,建议将 exp 设置为 1-2 小时,并配合 Refresh Token 机制实现无感续期。调试时可通过缩短过期时间(如 30 秒)快速验证过期拦截逻辑。

4.4 完整鉴权拦截决策树

后端鉴权拦截器在处理每个请求时,按以下顺序执行决策:

  1. 提取 Token:从请求头 Authorization: Bearer <token> 中截取。
  2. 结构校验:检查是否包含两个句点,三段均非空。
  3. 签名验证:使用服务端密钥重新计算签名,比对一致性。
  4. 过期校验:解析 exp 字段,判断是否已过期。
  5. 载荷提取:通过后,将用户信息(如 userId、role)注入请求上下文。
后端鉴权拦截决策树 后端鉴权拦截决策树 收到请求 ① 提取 Token ② 结构校验 返回 401 格式错误 ③ 签名验证 返回 401 签名不匹配 ④ 过期校验 返回 401 Token 过期 ⑤ 放行 / 注入上下文
🧪 测试验证要点:
  • 篡改测试:修改 Payload 中任意字段,验证签名校验是否拦截。
  • 过期测试:使用已过期 Token 请求接口,验证是否返回 401。
  • 算法混淆测试:将 Header 中 alg 改为 none,验证服务端是否拒绝。
  • 空 Token 测试:不携带 Authorization 头,验证是否返回 401。