JWT 风险集中在哪
JWT 本身的结构(头部、载荷、签名)是公开标准,问题几乎都出在服务端的校验环节:算法是否固定、密钥是否足够强且各环境隔离、过期与签发者是否校验。历史问题集中在算法混淆(服务端信任头部 alg 字段)与弱密钥被离线破解;检查方式以代码走查与自有环境复现为主,而不是构造混淆令牌去打生产。
基本信息
| 适用平台 | 所有使用 JWT/JWS 的应用与网关(Java、Node、Go、Python 均有实现) |
|---|---|
| 代码走查 | 校验代码是否写死算法、是否校验 exp/iss/aud |
| 密钥管理 | 长度与随机性、是否多环境复用、是否可轮换 |
| 参考标准 | RFC 8725(JWT 最佳实践)、OWASP JWT Cheat Sheet |
典型使用场景
- 单点登录与开放平台鉴权方案的评审
- 排查“令牌可被伪造”类安全事件根因
- 核查密钥是否在测试与生产环境中复用
- 评估令牌有效期与刷新机制的合理性
- 微服务间使用 JWT 传递身份时的边界检查
核查方式(以代码走查为主)
核查方式(以代码走查为主)
1. 查看令牌校验代码:算法是否写死为预期值,是否拒绝未知算法
2. 核对密钥来源与长度:是否来自配置中心、是否各环境独立、是否可轮换
3. 确认 exp、iss、aud 是否逐项校验,时钟偏移是否有明确上限
4. 检查头部扩展字段(如 kid、jku、x5u)是否被用于动态获取密钥
5. 动态验证仅使用自有账号令牌做对照,不构造混淆令牌对生产验证风险点与加固方向
| 风险点 | 说明 | 加固方向 |
|---|---|---|
| 算法未固定 | 服务端信任头部 alg 字段 | 校验时指定允许的算法集合 |
| 密钥强度不足 | 短密钥可被离线暴力破解 | 使用足够长度的随机密钥并定期轮换 |
| 密钥复用 | 测试环境密钥泄漏影响生产 | 按环境隔离密钥与配置 |
| 声明未校验 | 过期与签发者被忽略 | 逐项校验 exp/iss/aud |
| 头部注入 | kid 被拼接进查询或路径 | 白名单校验头部取值 |
不构造算法混淆或伪造令牌对生产环境验证:这类测试一旦生效会影响其他会话与审计记录,统一以代码走查加自有环境复现来支撑结论。
令牌有效期与业务风险挂钩:管理面与高敏操作建议更短的访问令牌配合一次性刷新,避免长期令牌泄漏后难以回收。