网络和编码 · 6 分钟阅读
JWT 解码器:令牌内包含什么,不包含什么
JSON Web 令牌是由点分隔的三个 base64url 段,JWT 解码器只是反转编码,以便您可以读取它们。最后一句话包含本文中最重要的安全事实:解码令牌并不能证明任何事情。任何人都可以制作有效负载,对其进行编码,然后向您提供格式良好的令牌——验证是一项需要签名密钥的单独操作。
已更新
三个部分
- 标头 — 签名算法 (`alg`) 和令牌类型 (`typ`),例如 HS256。
- 有效负载 - 声明:令牌是关于谁的、何时发行以及何时过期。
- 签名 - 使用发行者的密钥对前两个段进行计算,这就是解码器显示它但无法检查它的原因。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 . eyJzdWIiOiIxMjMiLCJleHAiOjE3NjAwMDAwMDB9 . signature
header payload signature
解释大多数失败的主张
- `exp`(过期)— 401 的最常见原因。在检查其他任何内容之前,两分钟前过期的令牌会被拒绝。
- `nbf` (not before) — 镜像:在其有效性窗口被拒绝之前使用的令牌。
- `iat`(发布于)— 对于计算会话的持续时间以及发现不一致的时钟很有用。
- `aud`(受众)和`iss`(发行者)——此处的不匹配意味着令牌有效,但是为不同的服务颁发的,这会以令人困惑的方式失败。
时间声明是自 Unix 纪元以来的 UTC 秒数。如果令牌看起来有效,但过期太早或太晚,请检查时钟问题或在预期为秒的情况下携带毫秒的有效负载。
为什么你永远不应该盲目相信`alg`
两种攻击已经足够古老而著名,并且仍然在野外出现。 `none`算法告诉验证者根本没有签名;读取标头而不是强制执行其自己的预期算法的服务器会接受它。在 RSA/HS 混淆中,攻击者使用公钥作为 HMAC 秘密进行签名,从而欺骗接受这两个系列的服务器。这两种情况的防御都在于验证者,而不是解码器:将预期的算法固定在服务器端,并且永远不会从令牌本身派生它。
始终在本地解码
JWT 是一种凭证:无论谁持有它,都可以充当用户,直到它过期。将真实的内容粘贴到网站中,然后将其发布到服务器,就会将实时会话移交到零,因为解码是任何浏览器都可以在微秒内完成的 base64url 算法。 YamlBox JWT 解码器解析页面中的令牌,将时间戳声明显示为可读的 UTC 日期,并在网络禁用的情况下继续工作 - 这是唯一值得在生产令牌上使用的解码器。
有效的调试例程
- 首先解码并读取`exp`——一半的“无效令牌”报告到此结束。
- 根据 API 的预期检查 `aud` 和 `iss`,然后检查 `nbf` 是否存在时钟偏差。
- 将解码后的声明与代码假设的角色或范围进行比较。
- 如果声明看起来正确但仍然失败,则问题出在验证上——密钥错误、秘密轮换或算法不匹配。
JWT 解码器 — 常见问题
解码 JWT 是否可以验证它?
不会。解码会反转base64url编码,并且不需要密钥,因此无法证明真实性。验证使用发行者的秘密或公钥重新计算签名,并且是只有服务器可以执行的单独步骤。
为什么我的 JWT 已经过期了?
根据当前 UTC 时间检查 `exp` 声明。令牌通常是短暂的(几分钟到一小时),跨刷新窗口缓存令牌的客户端通常是罪魁祸首。比较 `iat` 与 `exp` 以了解发行人预期的寿命。
将作品 JWT 粘贴到在线解码器中是否安全?
仅限于完全在浏览器中解码的一种。服务器端解码器接收实时凭证并可以记录它。首选客户端解码器,并将您粘贴到未知站点的任何令牌视为已泄露。
这篇文章中提到的工具
更多文章可供阅读
5 分钟阅读
Base64 解码和编码:用于传输,而不是安全
Base64 在浏览器中解码和编码 — 4/3 大小规则、填充、base64url 变体以及使解码文本看起来像垃圾的 Unicode 错误。
5 分钟阅读
URL编码:何时逃跑,何时破坏东西
URL 正确编码和解码——保留字符、plus 与%20、encodeURI 与encodeURIComponent,以及损坏链接背后的双重编码错误。
5 分钟阅读
时间戳转换器:无需猜测的纪元时间
一个 Unix 时间戳转换器,可以双向工作——秒与毫秒,UTC 与本地时间,以及仍然破坏长期系统的 2038 边界。