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):非对称算法,私钥签名,公钥验证。适合微服务网关与多服务间鉴权。
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 完整鉴权拦截决策树
后端鉴权拦截器在处理每个请求时,按以下顺序执行决策:
- 提取 Token:从请求头
Authorization: Bearer <token>中截取。 - 结构校验:检查是否包含两个句点,三段均非空。
- 签名验证:使用服务端密钥重新计算签名,比对一致性。
- 过期校验:解析
exp字段,判断是否已过期。 - 载荷提取:通过后,将用户信息(如 userId、role)注入请求上下文。
🧪 测试验证要点:
- 篡改测试:修改 Payload 中任意字段,验证签名校验是否拦截。
- 过期测试:使用已过期 Token 请求接口,验证是否返回 401。
- 算法混淆测试:将 Header 中 alg 改为
none,验证服务端是否拒绝。 - 空 Token 测试:不携带 Authorization 头,验证是否返回 401。