JWT 解码工具
在你的设备上运行,不会发送任何内容。一切都在您自己的设备上进行。您的令牌永远不会被发送到任何地方。
完全在浏览器中解码和检查 JSON Web Token - 包括头部、载荷、过期时间和可选的签名验证,不会上传任何内容。
JSON Web Token(JWT)是一种紧凑、适合放入 URL 的方式,用于在两方之间表示声明 - 广泛用于 "Authorization: Bearer ..." 请求头、会话 Cookie 和单点登录(SSO)等场景。JWT 只是三个由点连接的 base64url 编码部分(头部、载荷、签名),因此任何人都可以在不需要签名密钥的情况下解码并读取头部和载荷 - 只有验证签名才需要密钥或私钥。此工具在您的浏览器本地解码这两部分,解释标准声明,标记已过期或尚未生效的令牌,并对 "none" 算法这一安全陷阱发出警告 - 您的令牌永远不会被发送到任何地方。
常见问题
我的 JWT 会被发送到服务器吗?
不会。解码完全在您的浏览器中通过 atob 和 TextDecoder 这两个 Web API 完成 - 令牌,以及您为验证签名而粘贴的任何密钥或公钥,都不会离开您的设备。
这个工具能验证签名吗?
可以,作为尽力而为的附加功能。如果您知道 HMAC 密钥(适用于 HS256/384/512)或粘贴了 PEM 编码的公钥(适用于 RS256/384/512 或 ES256/384/512),该工具会使用浏览器的 Web Crypto API 在本地检查签名。没有密钥时,只会解码并显示头部和载荷 - 解码本身从不需要签名密钥。
为什么算法显示为 "none"?
"alg": "none" 表示令牌根本没有签名 - 任何人都可能在其中写入任意声明。一些库过去曾错误地将这类未签名令牌视为有效,这成为一种众所周知的身份验证绕过手段。该工具始终会醒目地标记出来,以免您忽略。
exp、iat 和 nbf 是什么意思?
它们是 RFC 7519 中的标准时间戳声明:iat 表示令牌的签发时间,nbf 表示令牌开始生效的最早时刻,exp 表示令牌失效的时刻。三者都以 NumericDate(自 Unix 纪元以来的秒数)存储,此工具会将其转换为可读日期和相对时间,例如“将于 2 小时后过期”。
为什么我不需要密钥就能读取载荷?
因为 JWT 的头部和载荷只是经过 base64url 编码,而非加密 - 编码不等于保密。任何持有该令牌的人已经可以读取其中的声明;签名只能证明这些声明未被没有密钥的人篡改。切勿将不希望攻击者直接读取的内容放入 JWT 载荷中。
我的令牌有 3 个部分,但仍然无法解码,为什么?
三个部分(头部、载荷、签名)中的每一个都必须是有效的 base64url 文本,并且头部和载荷必须能解码为有效的 JSON。此工具会分别解码头部和载荷,并准确告诉您哪一部分出了问题以及原因(base64 错误、UTF-8 错误或 JSON 无效),而不是悄无声息地失败。
面向开发者:在网址中加上 `token` 参数打开此页面——例如 gizke.com/jwt?token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c——该令牌会自动预填。大多数访问者不需要这个功能;它是为了直接链接到一个可用的示例。