如何解码 JWT
- 把令牌粘贴到输入框。如果复制的是整个 Authorization 请求头的值,开头的
Bearer会被自动去掉。点击示例令牌会填入一个样例,方便先了解显示方式。 - 头部和载荷以缩进后的 JSON 并排显示,各有一个复制按钮。
- 下方表格列出签名算法和找到的标准声明。时间会转换成你所在时区的易读日期,并附上“2小时前已过期”“有效,5天后过期”“尚未生效”之类的说明。
如果出了问题,状态栏会说明原因:没有用点分隔的各部分、某部分不是有效的 Base64url、不是有效的 JSON,或者令牌没有签名部分。
令牌的结构
JSON Web Token(RFC 7519)由三段 Base64url 字符串用点连接而成:header.payload.signature。Base64url 就是把普通 Base64 中的 + 和 / 换成 - 和 _,并去掉 = 填充,这样令牌可以原样放进 URL 或 HTTP 头。下面是一个用 HS256 和密钥 demo-secret 签名的完整令牌:
| 头部 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 → {"alg":"HS256","typ":"JWT"} |
|---|---|
| 载荷 | eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphbmUgRG9lIiwicm9sZSI6ImVkaXRvciIsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MjI5MjAwfQ → {"sub":"1234567890","name":"Jane Doe","role":"editor","iat":1767225600,"exp":1767229200} |
| 签名 | smanCrPMMlkaAxySO1Bj1syvqeAu5q5RozvQDT8YfHs |
把三段用点连起来,粘贴到上面的输入框试试。解码器会显示它签发于 2026 年 1 月 1 日 00:00 UTC(北京时间上午 8 点),一小时后过期。几乎所有 JWT 都以 eyJ 开头,因为 {" 后面跟一个字母时,Base64 编码结果就是这样——这是在日志中认出 JWT 的简便方法。
常见的声明
iss(签发人)——创建令牌的一方,通常是身份认证服务的 URL。sub(主题)——令牌所指的对象,通常是用户 ID。aud(受众)——应当接受该令牌的服务,可以是字符串,也可以是列表。exp、nbf、iat——过期时间、生效时间和签发时间,以自 1970 年起的秒数表示。Unix 时间戳转换可以用任意单位查看它们。jti——令牌的唯一 ID,用于防止重放或单独吊销某个令牌。
其他字段,如 name、email、role、scope,由应用程序自行定义,只出现在载荷视图中。头部中的 kid 是签名所用密钥的名称,帮助服务器从密钥集中挑出正确的公钥。
解码不等于验证
本页只是读取令牌,并不检查它是否真实。头部和载荷只是经过编码,任何人都能伪造一个写着 "role":"admin" 的令牌。唯一能阻止这一点的是签名,而验证签名需要 HMAC 密钥或签发方的公钥,它们应当保存在接收令牌的服务器上。服务器应当:
- 使用自己预先指定的算法验证签名,绝不听从头部的声明,并拒绝表示“未签名”的
"alg":"none"; - 用服务器自己的时钟检查
exp和nbf,并为时钟偏差留出少量容差; - 确认
iss和aud是自己信任的值。
这些检查请交给持续维护的 JWT 库,而不要手写代码。像本页这样的解码器是用来调试的,不是用来决定谁能进门的。
签名算法
- HS256 / HS384 / HS512——使用共享密钥的 HMAC。能验证的一方也能签发令牌,所以密钥只能放在可信的服务器上。
- RS256、PS256——RSA 签名。签发方用私钥签名,任何人都可以用公钥验证。
- ES256——基于 P-256 曲线的 ECDSA,密钥和签名都比 RSA 小。
- EdDSA——Ed25519 签名,在新系统中越来越常见。
调试技巧
- 令牌“突然失效”,多半只是过期了。先把
exp和当前时间比一比。 - 刚登录就显示“尚未生效”,通常是签发服务器和接收服务器的时钟不一致。
- 拿着新令牌却返回 401 错误,常见原因是受众不对:把
aud和你调用的 API 对照一下。 - 想查看某一段的原始字节,也可以用开启 URL 安全模式的 Base64 解码。
常见问题
把真实令牌粘贴到这里安全吗?
解码完全在本页的 JavaScript 中进行,令牌不会被上传。即便如此,有效的令牌在过期前就是一份可用的凭据,所以最好使用已过期的令牌或测试令牌,也不要把真实令牌贴到工单或聊天中。
可以在载荷中放敏感数据吗?
不可以。正如本页所示,任何持有令牌的人都能读取载荷。如果内容本身必须保密,请使用加密令牌(JWE)。JWE 由五个部分而不是三个部分组成,没有密钥就无法解码。
为什么提示“该令牌没有签名部分”?
因为输入只有两部分。复制时令牌被截断,或者令牌本身没有签名,都会出现这种情况;没有签名的令牌应当被服务器拒绝。
怎样让令牌在过期前失效?
已签名的 JWT 签发后无法更改。需要提前注销的系统通常让令牌的有效期很短,并在服务器端维护 jti 黑名单,或者轮换签名密钥。