JWT 解码器

粘贴一个 JSON Web Token,即可读取其 header 和 payload、查看过期时间,并理解每一个声明(claim)。你的 Token 永远不会离开浏览器。

在浏览器中运行无需注册不上传任何数据

解码不等于验证。任何人都能读取 JWT 的 header 和 payload,因为它们只是经过 base64url 编码。本工具显示的是 Token 声称的内容,并不能证明 Token 是真实的。请务必在你的服务器上验证签名。

Header

Payload


      

验证签名(可选,HS256/HS384/HS512)

使用浏览器的 Web Crypto API,用你输入的密钥校验 HMAC 签名。密钥永远不会离开此页面。RSA/ECDSA Token 需要签发者的公钥,此处不做验证。

如何使用JWT 解码器

  1. 把 Token 粘贴到编码的 Token输入框中。来自 Authorization 请求头的前缀 Bearer 会被自动忽略。
  2. header 和 payload 会被立即解码,并以格式化后的 JSON 显示。
  3. 查看声明说明表格:exp、iat 和 nbf 会被转换为日期,并显示“多久后过期”/“已过期多久”。
  4. 检查状态栏中的过期问题,以及针对 alg: none 等危险设置的警告。
  5. 还可以输入共享密钥,在本地校验 HS256、HS384 或 HS512 签名。

JWT 里面有什么?

JSON Web Token(RFC 7519)由三个用点号连接的 base64url 字符串组成:header.payload.signature。header 指明签名算法(alg)和 Token 类型。payload 包含声明,例如用户是谁、Token 何时过期。signature 则是用密钥或私钥对前两部分计算得出的签名。

解码不等于验证

header 和 payload 只是经过编码,并没有加密,所以任何持有 Token 的人都能读取它们。这就是为什么绝不应该把密码或机密信息放进 JWT payload。解码告诉你 Token 声称了什么;而验证签名(通常在你的 API 服务器上用 jose 或 PyJWT 等库完成)才能证明是谁签发的,以及它没有被篡改。服务器还必须检查 exp、nbf、iss 和 aud,并拒绝不符合预期的算法。

注册声明速查表

声明含义
iss签发者:创建并签名该 Token 的一方
sub主题:通常是用户 ID
aud受众:该 Token 面向哪个 API
exp过期时间,以自 Unix 纪元起的秒数表示
nbf在此时间之前无效
iat签发时间
jti唯一的 Token ID,可用于吊销列表

调试“token expired”错误

如果 API 拒绝了一个看起来还很新的 Token,请将 exp 和 nbf 与服务器时钟进行比较。机器之间存在少量时钟偏差很常见,因此大多数库允许 30–60 秒的容差。还要确认 exp 的单位是秒:误用毫秒值是一个常见 bug,会让过期时间落在数千年之后。

常见问题

在这里粘贴生产环境的 JWT 安全吗?
解码完全由 JavaScript 在你的浏览器中完成。Token 不会被上传、记录或存储。不过,与任何凭证一样,仍应谨慎对待有效的 Token;分享截图时,最好使用已过期或测试用的 Token。
这个工具会验证 JWT 签名吗?
仅解码不会验证。你可以输入共享密钥来选择性地验证 HS256、HS384 和 HS512 Token;HMAC 会使用 Web Crypto API 在本地计算。RS256 和 ES256 Token 必须在你的服务器上用签发者的公钥验证。
为什么我的 Token 显示已过期?
与你电脑的时钟相比,exp 声明的时间已经过去。请申请新的 Token,或用 refresh token 刷新它。如果时间看起来不对,请检查是否存在时钟偏差,或者 exp 值是否以毫秒写入。
JWT、JWS 和 JWE 有什么区别?
JWT 是声明的格式。JWS 是带签名的 JWT,由三部分组成,也就是本工具解码的内容。JWE 是加密的 JWT,由五部分组成;没有解密密钥就无法读取其 payload。
为什么 alg 为“none”很危险?
未签名的 Token 任何人都能伪造。服务器必须拒绝 alg: none,并且只应接受其预期的特定算法。

相关工具