RevealTheme logo

JWT解码器

即时解码JSON Web Token(JWT)。完全在你的浏览器中运行:令牌绝不会离开你的设备,因此可安全用于生产环境的密钥。

如何使用本工具

  1. 1

    将你的JWT粘贴到输入框中。

  2. 2

    点击“解码”。头部和负载会被解析并显示出来。

  3. 3

    查看算法、声明(claims)、过期时间和签发者。

什么是JWT,它是如何工作的?

JSON Web Token(JWT,在RFC 7519中定义)是一种紧凑且URL安全的方式,用于表示关于用户的一组声明(claims),并附带这些声明未被篡改的加密证明。JWT为大多数现代Web技术栈提供身份验证支持:当你登录时,服务器会创建一个包含你的用户ID和权限的JWT,用一个密钥对其签名,然后返回给你。你的浏览器会存储该令牌(通常存放在localStorage或Cookie中),并在之后的每个请求的Authorization头部中携带它。服务器在每个请求中都会验证签名:如果有效,就信任令牌中的声明;如果被篡改,签名就会失效,请求随即被拒绝。JWT由三部分组成,均采用Base64URL编码并以点分隔:头部声明签名算法(HS256表示HMAC-SHA256,RS256表示RSA,ES256表示ECDSA,none表示未签名令牌——这很危险,你应当拒绝它们);负载(payload)包含实际的声明(标准声明如“sub”表示主体、“exp”表示过期时间、“iat”表示签发时间,外加你的应用所定义的任意自定义声明);签名则是头部和负载由持有密钥者签名的证明。本解码器会揭示前两部分,它们属于公开信息;签名只能用密钥来验证,这正是为什么每一个JWT解码器都会在不经验证的情况下显示声明。

常见使用场景

  • 通过解码客户端发送的JWT来调试身份验证问题:准确查看它包含哪些声明、由谁签发以及何时过期。

  • 检查来自API网关(AWS Cognito、Auth0、Okta)的JWT,以理解下游服务的声明结构。

  • 验证自定义声明(组织ID、角色、功能标记)是否在令牌签发代码中被正确设置。

  • 对比续期前后的令牌,确认过期时间已被延长。

  • 审计令牌的算法:确认在生产环境中使用的是RS256或ES256,绝不使用“none”。

  • 将服务器日志中的base64url负载转换为可读的声明。

常见问题

用于生产环境的JWT是否安全?
安全。解码完全通过本地JavaScript在你的浏览器中进行:令牌绝不会到达我们的服务器,也不会出现在任何日志中。你可以在解码时打开开发者工具→“网络”标签来验证这一点:不会触发任何外发请求。话虽如此,请把JWT当作凭据对待:无论解码器在哪里运行,都不要将它们粘贴到URL、截图或共享文档中。
这个工具会验证签名吗?
不会。验证签名需要密钥(对于HS256)或公钥(对于RS256/ES256/PS256)。那些要求你提供密钥来验证JWT的网页工具是一个安全警示信号:那样你就把签名密钥发送给了一个陌生人。请在服务器端,或使用你自己掌控的库(jose、jsonwebtoken)来验证签名。
如果我的JWT已经过期了会怎样?
过期不会妨碍解码:“exp”声明只是负载中的一项数据。在解码后的负载中查找“exp”:它是一个Unix时间戳(自1970年以来的秒数)。用我们的时间戳转换器将其转换,即可在你的时区中查看过期时间。如果“exp”已过去,任何合规的验证器都会拒绝该令牌,尽管解码器仍然能够读取它。
JWT可以被加密吗?
可以:那叫做JWE(JSON Web Encryption,RFC 7516)。本工具处理的是JWS(JSON Web Signature,常见情形),其中负载经过签名但可见。JWE令牌由5个以点分隔的部分组成,而非3个,并且需要接收方的私钥才能解密。如果你的令牌有5个部分,你需要一个支持JWE的工具。
“alg”:“none”是什么意思,它危险吗?
“none”意味着没有签名:令牌未经签名,任何人都可以伪造任意声明。生产系统必须明确拒绝带有“alg: none”的令牌。某些库默认接受它们(一类广为人知的CVE漏洞)。请始终只允许你的应用所预期的算法。
为什么要用JWT而不是会话Cookie?
JWT是无状态的:服务器无需查询会话;令牌本身就包含了用户的身份和权限。这使得JWT非常适合分布式系统和API。会话Cookie是有状态的(需要服务器端的会话存储),但更容易失效(只需删除会话即可)。其中的取舍在于:JWT扩展性更好,但在令牌过期之前你无法“将某个用户登出”。
JWT的标准声明有哪些?
RFC 7519定义了:iss(签发者)、sub(主体,通常是用户ID)、aud(受众)、exp(过期时间)、nbf(不早于)、iat(签发时间)、jti(JWT的ID)。除这些之外,应用还会添加自定义声明,如“roles”、“permissions”或“tenant_id”。请让自定义声明保持精简:JWT会在每个请求的头部中传输,会增加你的带宽消耗。

相关工具