Uvlio

Command Palette

Search for a command to run...

返回文章列表
技术文章

JWT 解释:解码 Claims 不等于验证 Token

JSON Web Token 很容易检查,因为它的大部分内容经过 Base64URL 解码后可读。这对调试有用,也导致一个常见误区:解码后看到内容,就以为 token 有效。JWT 应分两层阅读:第一层看 token 声称了什么,第二层判断应用是否应该信任它。
limitcool 维护的 Uvlio 编辑团队2026-05-177 分钟阅读
主题封面开发工具JWTClaims

JWT 解释:解码 Claims 不等于验证 Token

解释 JWT 结构、claims、Base64URL、签名,以及为什么解码 token 不代表可以信任它。

文章主题预览
header.payload.signature
"aud":"app-web"
check exp / iat / nbf
关联工具
JWT 解析工具
阅读重点
1理解原理
2检查边界
3使用工具

原创流程图

JWT 解释:解码 Claims 不等于验证 Token

这张图由 Uvlio 为本文工作流生成,用来说明从输入检查到输出判断的基本路径。
1

理解原理

检查后再进入下一步

2

检查边界

检查后再进入下一步

3

使用工具

检查后再进入下一步

维护与复核
维护者:limitcool。阅读时可重点关注技术原理、处理边界、隐私风险和可验证事实。
三个可见部分

常见 JWT 由 header、payload 和 signature 三段组成,以点号分隔。header 通常说明类型和签名算法,payload 保存 subject、issuer、audience、expiration 和应用字段,signature 用来保护前两段不被篡改。前两段是编码,不是加密。

Claim 是声明,不是证明

claim 是 payload 里的陈述。subject 可能标识用户,audience 可能标识 API,expiration 说明过期时间。但攻击者可以写出任意 payload。信任来自签名验证、issuer、audience、时间检查和应用授权规则。

过期问题常是单位和时钟问题

exp、iat、nbf 通常是以秒为单位的 NumericDate。JavaScript 常用毫秒时间戳,混用会让日期偏离一千倍。调试过期或未生效 token 时,先转 UTC,再和服务器时间及策略比较。

Audience 和 issuer 防止跨服务误用

issuer 表示谁签发 token,audience 表示 token 给谁用。它们能防止 staging token 进入生产,或 profile API 的 token 被 billing API 接受。许多 JWT 问题不是密码学失败,而是缺少 issuer 或 audience 检查。

算法和密钥应由验证方控制

验证方不应盲信 header 里写的算法。应用配置应定义允许算法和密钥。公钥轮换、key id 和 JWKS 能提高灵活性,也会引入缓存过期和密钥配置错误等失败模式。

JWT 往往是 bearer 凭据

很多 JWT 是 bearer token:谁持有它,谁就能在过期或撤销前使用它。因此原始 token 不应出现在工单、截图、聊天、日志或不必要的在线工具中。调试时优先用合成 token 或脱敏 claim。

实用调试顺序

先本地解码 header 和 payload,读取 iss、aud、sub、exp、iat、nbf、roles、scopes 和环境标记;把时间转 UTC;再检查拒绝服务期望的 issuer、audience、算法、密钥和时钟容差。若这些正确,再看授权逻辑。

常见问题

解码 JWT 能证明它有效吗?

不能。解码只显示 header 和 payload,验证还需要签名、issuer、audience、时间和策略检查。

JWT payload 私密吗?

通常不私密。标准 JWT payload 是编码,不是加密,不应随意放敏感数据。

为什么 token 在一个服务可用,在另一个服务不可用?

常见原因是 audience、issuer、密钥轮换、时钟偏差、scope 缺失或环境混淆。

分享 JWT bug 时应脱敏什么?

避免分享原始 token。可提供脱敏 payload,替换 subject、email、token ID、signature 和环境标识。

有效 JWT 为什么仍可能无权访问?

验证解决是否可信,授权解决是否能做某个动作。角色、scope、租户和资源权限仍可能不足。

token 应该写进日志吗?

不应该记录原始 bearer token。记录 token ID、请求 ID 或脱敏 claim 摘要更安全。