JWT 解码器

解码 JSON Web Token 以读取其 header 和 payload。

100% 隐私安全 — 完全在您的浏览器中运行。您的数据在本地设备上处理,绝不会发送到互联网。

Header
Payload

关于 JWT 解码器

这款免费的 JWT 解码器读取 JSON Web Token,将其头部和载荷显示为格式化的 JSON,并把签发时间和过期时间转换成易读的日期。

解码在您的浏览器中完成 — 您的令牌绝不会被上传。这不是小事:JWT 通常是一份有效的凭证,把它粘贴到会把它发往别处的网站,等于交出它所携带的全部访问权限。

本工具解码令牌,但不验证签名 — 下文说明这一区别为何重要。

令牌的三个部分

一个 JWT 是用点分隔的三段 Base64url:

xxxxx.yyyyy.zzzzz

头部 — 说明令牌由哪种算法签名,以及它是什么类型。通常是两个字段:alg 和 typ。

载荷 — 也就是声明(claims)。令牌关于谁、由谁签发、何时过期,以及应用放进去的其他内容:用户 ID、邮箱、角色、权限、租户。

签名 — 对前两部分做的密码学校验,用一个密钥或私钥生成。它证明令牌自签发以来没有被改动。

必须理解的关键是:前两部分并未加密。 它们只是被编码了,任何人都能读取。把令牌粘贴到本页面,内容立刻显现。Base64url 是让数据能安全放进 URL 或请求头的方法,而不是隐藏数据的方法。

这对令牌里该放什么意味着什么

既然载荷对任何持有令牌的人都是公开的,规则就直接得出:绝不要把任何机密放进 JWT。

不该出现在载荷中的内容:密码、API 密钥、信用卡信息、身份证件号码、医疗信息,以及任何受隐私法规保护的数据。这些内容用户本人能读到,任何记录该请求的系统能读到,任何拿到令牌的人也能读到。

该放的内容:用户 ID、角色、过期时间、签发者、受众 — 这些标识和声明本就是给接收系统看的。

签名保护的是完整性,不是机密性。它保证没人改动过令牌,却完全无法阻止别人读取它。

解码不等于验证

这个区别会造成真实的安全漏洞,因此值得说清楚。

解码把 Base64url 拆开,向您展示 JSON。它不需要任何密钥,任何人都能做,而且丝毫不能证明令牌是否真实。

验证用密钥或公钥重新计算签名,并检查是否吻合。只有这一步才能告诉您:令牌确实由它所声称的一方签发,且未被篡改。

一个令牌可以完美解码,同时又是彻头彻尾的伪造品。任何人都能造出一个写着 "role": "admin" 的 JWT,它在这里会漂亮地显示出来 — 因为这里发生的全部就是显示。

本工具刻意不做验证,这是安全的选择:验证需要签名密钥,而把签名密钥粘贴到网页里,远比粘贴一个令牌危险得多。验证应当在您自己的服务器上、用您的密钥、通过正规的库来完成。

这一错误的历史版本是 alg: none 攻击。早期的 JWT 库会听信一个声称未使用任何算法的头部,于是不加验证地接受令牌。攻击者只需修改载荷、把 alg 设为 none,便可长驱直入。现代库会拒绝这种做法,但这正是您应当始终锁定期望的算法、而不是听信头部的原因。

读懂标准声明

载荷中大多数简短的字段名都是含义固定的注册声明:

  • exp — 过期时间。此后令牌应被拒绝。
  • iat — issued at,签发时间。它是何时创建的。
  • nbf — not before,生效时间。在此之前令牌无效。
  • sub — 主体。通常是用户 ID。
  • iss — 签发者。是谁创建了该令牌。
  • aud — 受众。它是给哪个服务用的。
  • jti — 令牌 ID,用于吊销列表。

exp、iat 和 nbf 都是 Unix 时间戳 — 自 1970 年 1 月 1 日起的秒数 — 所以它们看起来像一串毫无意义的十位数字。本工具会把它们转换成易读的日期,这通常是回答把您带到这里的那个问题最快的办法:*这个令牌过期了吗?*

使用方法

  • 粘贴您的 JWT(xxxxx.yyyyy.zzzzz 形式的字符串)
  • 在下方查看解码后的头部和载荷
  • 需要时可复制其中任意一部分

值得注意

  • 把令牌当作密码对待。 只要它仍然有效,持有者就能以该用户的身份行事。不要把有效令牌粘贴进会上传它们的工具,也不要发到工单或聊天里。
  • JWT 难以吊销。 它们在过期前一直有效,所以被窃取的令牌在那之前都能用,除非您维护一份阻止列表。这正是短过期时间重要的原因。
  • Bearer 不是令牌的一部分。 解码前请从 Authorization 请求头中去掉这个前缀。
  • Base64url 不是标准 Base64。 它用 - 和 _ 代替 + 和 /,通常还去掉 = 填充,所以 JWT 的某一段在普通 Base64 解码器里可能失败。
  • 时钟偏差会造成令人困惑的失败。 一个在您看来有效的令牌,可能被时钟相差一两分钟的服务器拒绝。
  • JWT 不是会话。 它自带声明,因此更改用户角色要到令牌过期后才会生效。

常见问题

JWT 是加密的吗?

不是。头部和载荷采用 Base64url 编码,这让它们能安全地放进 URL 或 HTTP 请求头,却完全没有隐藏作用。正如本页所展示的,任何持有令牌的人都能读到其中的每一项声明。签名保护令牌不被修改,而不是不被读取。

这个工具会验证签名吗?

不会,而且是刻意如此。验证需要签名密钥或公钥,而把签名密钥粘贴到网页里,要比粘贴令牌危险得多。验证应当在您的服务器上使用正规的库完成。本工具负责解码并展示内容,这正是调试时您需要的。

在这里粘贴我的令牌安全吗?

在这里是安全的 — 解码完全在您的浏览器中进行,没有任何数据被传输,您甚至可以断开网络,它依然可用。不过,对工具总体上仍要保持警惕。一个有效的 JWT 就是一份能用的凭证,把它发送到服务器的网站,等于刚刚获得了它所授予的全部权限。

我怎么知道令牌是否过期了?

查看 exp 声明,它是以秒为单位的 Unix 时间戳。本工具会把它转换为易读日期,并直接告诉您该时刻是否已过。如果令牌在您看来有效却被服务器拒绝,请检查时钟偏差 — 机器之间相差一两分钟就足够了。

sub、iss、aud 和 iat 是什么意思?

它们都是含义标准的注册声明:sub 是主体,通常为用户 ID;iss 是创建令牌的签发者;aud 是预期受众,即哪个服务应当接受它;iat 是签发时间。与 exp 和 nbf 一起,涵盖了谁、在哪里、在何时。

为什么我的 JWT 在普通 Base64 解码器里失败?

因为 JWT 使用 Base64url,这是一种把 + 换成 -、把 / 换成 _,并通常去掉 = 填充的变体。这些替换是为了让取值能安全地放在 URL 中。把这些字符换回去,就能在标准 Base64 工具里解码了。

我可以编辑 JWT 的载荷吗?

您可以修改文本,但任何实现正确的服务器都会拒绝这个结果,因为签名不再与改动后的内容吻合。签名的用途正在于此。令牌应由为其签名的服务重新签发,而不是手工编辑。

相关工具

视频教程

我们会定期添加新工具——在 YouTube 上订阅,即可在每个新工具上线时收到通知。

更多工具

查看全部

推荐应用

查看全部