JWT 能被解码不代表有效。排查无效 Token 时,应先确认三段结构和时间字段,再检查签名算法、密钥、受众、签发方和服务端时钟。

先区分过期、未生效和签名失败

接口返回 401、invalid token、token expired 或 signature verification failed 时,先不要只看 Payload。JWT 的 Header、Payload 和 Signature 分别对应算法、声明和签名校验,错误来源可能完全不同。

如果错误只在部分用户、部分服务器或某个时间段出现,还要记录请求时间、服务器时间、Token 签发时间和接口返回的错误码。

  • expired:通常和 exp 字段或刷新逻辑有关
  • not before:通常和 nbf 字段或时钟偏差有关
  • signature failed:通常和算法、密钥或签名输入有关

快速检查清单

先用 JWT 解析器读取 Header 和 Payload,确认是否为三段结构,alg 是否符合服务端允许列表,exp、nbf、iat 是否为秒级 Unix 时间戳。

再用时间戳工具把 exp 和当前时间对齐。很多误判来自把毫秒当秒,或把 UTC 时间重复加上本地时区。

  • 检查 Token 是否完整复制,点号数量是否为两个
  • 确认 exp 是否早于当前服务端时间
  • 确认 nbf 是否晚于当前服务端时间
  • 确认 aud、iss 是否与当前接口配置一致

签名问题不要用解码结果代替验签

JWT 前两段只是 Base64URL 编码,任何人都可以构造看起来合理的 Header 和 Payload。真正判断 Token 是否可信,必须由服务端使用允许的算法和正确密钥验签。

排查签名失败时,重点检查密钥版本、算法白名单、Header 中 alg 是否被拒绝、服务端是否使用了错误环境的密钥,以及网关是否替换或截断了 Authorization 头。

修复后如何验证

修复后应分别验证正常 Token、过期 Token、未生效 Token、签名被篡改 Token 和错误 aud/iss Token。只用一个成功样例无法覆盖真实接口中的失败路径。

如果系统包含刷新令牌,还要验证刷新后旧 Token 的行为、并发刷新、退出登录后的失效策略和服务端缓存时间。

立即处理

使用相关工具

常见问题

关于这个问题

JWT 能解析出来是否代表没有问题?

不能。解析只能读取内容,是否有效必须经过签名、时间、签发方和受众校验。

exp 字段应该用秒还是毫秒?

JWT 标准声明中的 exp 通常使用秒级 Unix 时间戳。若误用毫秒,校验结果会明显偏离预期。