JWT 解码工具

在浏览器中运行,不上传任何内容

查看 JSON Web Token 的头部和声明,了解它何时过期,并用你的密钥或公钥验证签名。

Token

Verify signature

Paste a token to check its signature against a secret or public key.

No token yet

The header and payload appear here as JSON, and Claims lists each claim with what it means and when it expires.
Ready

什么是 JWT?

JSON Web Token(JWT)是一种紧凑且带签名的方式,用于在双方之间传递声明(claims),最常见的是从认证服务器传给 API。它由三段用点连接的 Base64url 字符串组成,即 header.payload.signature,API 通常要求放在 Authorization: Bearer <token> 头中。

头部说明令牌的签名方式,例如用共享密钥做 HMAC 的 "alg": "HS256",或使用 RSA 密钥对的 RS256。载荷中是各项声明:标准声明如 sub(令牌针对的主体)、iat(签发时间)和 exp(过期时间),以及签发方添加的其他内容,例如角色或权限范围。

签名让令牌变得可信。签发方用自己的密钥对头部和载荷计算签名,所以载荷中哪怕改动一个字符,签名也会失效。载荷只是编码,并没有加密:任何拿到令牌的人都能读到所有声明,所以绝不要在其中放入机密,并在令牌过期前把它当作密码一样保护。

使用方法

  1. 1把令牌粘贴到 Token 面板,或从 Examples 中选择一个。Bearer 前缀、Authorization: 头名称、引号和换行都会被忽略,面板标题会说明忽略了什么。
  2. 2令牌中的头部、载荷和签名会以不同颜色显示。Payload 和 Header 以 JSON 显示各部分;Claims 列出每个声明及其含义,并把 iat、nbf 和 exp 显示为你所在时区的日期,以及距今多久。
  3. 3状态栏显示算法、令牌何时过期或已在何时过期,以及签名是否已验证。alg: none 或缺少 exp 之类的警告列在 Claims 顶部。
  4. 4要验证签名,请输入共享密钥(HS256、HS384、HS512;如果密钥是编码过的,切换为 Base64),或粘贴签发方的公钥(RS*、PS*、ES*、EdDSA),格式可以是 PEM、X.509 证书、JWK 或 JWK 集合。结果会随输入实时显示。
  5. 5如果令牌无法解码,提示会说明是哪一部分的哪个字符有问题;按 F8 选中它。

问题排查

这个令牌有 5 个部分:它是加密的 JWE
有些身份提供方签发的是加密令牌(JWE)。它们的载荷只能用接收方的私钥读取,所以没有这把私钥,任何解码工具都无法显示内容。
+ 属于标准 Base64,JWT 使用 Base64url
这个令牌被重新编码过,或者是用标准 Base64 手工拼出来的。JWT 的各部分使用 - 和 _ 代替 + 和 /,并且没有 = 填充。
签名与该密钥不匹配
检查密钥是否与签发方使用的完全一致,包括大小写和末尾空格,以及它是否以 Base64 形式存储;如果是,请把密钥格式切换为 Base64。
这是 PKCS#1 格式的 RSA 密钥(BEGIN RSA PUBLIC KEY)
浏览器只能导入 SubjectPublicKeyInfo 格式的密钥。用 openssl rsa -RSAPublicKey_in -in key.pem -pubout 转换,或者改为粘贴签发方 JWKS 端点中的 JWK。
密钥集合中没有这个 kid 对应的密钥
签发方会轮换密钥。从签发方的 jwks_uri 获取最新的 JWK 集合后重新粘贴;工具会选择 kid 与令牌头部一致的密钥。

常见问题

把真实的令牌或密钥粘贴到这里安全吗?

解码和签名验证都在你的浏览器中通过 Web Crypto 完成,不会发送到任何地方。令牌保存在当前标签页的 session storage 中,直到你清除它或关闭标签页,所以刷新不会丢失;用于验证的密钥或公钥从不保存,令牌也从不放进链接。即便如此,有效的令牌在过期前都能授予访问权限,所以最好使用测试令牌或已过期的令牌,也绝不要把生产环境的签名密钥粘贴到任何你无法掌控的网站。

"Signature verified" 是什么意思?

表示头部和载荷确实是用该密钥签名的,或者是用与你提供的公钥相对应的私钥签名的。这并不代表令牌可以被接受:你的 API 还必须检查 exp、nbf、签发方(iss)和受众(aud),并决定接受哪些算法。

为什么 alg none 很危险?

带有 "alg": "none" 的令牌没有签名,所以任何人都能写出包含任意声明的令牌。如果库错误地接受了它,攻击者就能伪造令牌。服务器应拒绝未签名的令牌。

iat、nbf 和 exp 是什么格式?

它们是自 1970 年 1 月 1 日 UTC 起的秒数(Unix 时间)。13 位的数值是毫秒,这是令牌签发方的常见错误,工具会给出警告。Unix 时间戳转换工具可以把这些值转换成日期。

为什么令牌能正常解码却被拒绝?

常见原因有:签名来自另一把密钥、aud 或 iss 不对、在 nbf 之前或 exp 之后使用了令牌,或者服务器之间的时钟不一致。查看 API 返回的错误信息,并对照这些声明。