Menu

JWT 解码器

逐段解析并验证 JSON Web Token 的载荷。

作者 Nethanel Bar, Co-founder & CEO

最后更新

准备好真正学会编程了吗?

Coddy 让你在浏览器里编写真实代码来学习:互动课程、即时反馈,卡住时还有 AI 帮忙。

JWT 解码工具是什么?

JWT 解码工具会把 JSON Web Token 拆成三部分:头部(header)、载荷(payload)和签名(signature),并对前两部分做 Base64URL 解码,让你能以 JSON 的形式读取。开发者在调试登录流程、权限、会话声明和令牌过期问题时经常用到它。

解码 JWT 不等于信任它。头部和载荷本来就是可读的:它们只是经过 Base64URL 编码,并没有加密。验证才是检查令牌是否由预期的一方签发、有没有被篡改的步骤。

JWT 的样子是 header.payload.signature。每部分都经过 Base64URL 编码,用点号分隔。头部说明使用了哪种签名算法,载荷携带各项声明(用户是谁、令牌何时过期、允许做什么),签名则让服务器能够证明令牌没有被修改过。

解码 JWT 时你会学到什么

  • JWT 由三个经过 Base64URL 编码的部分组成,用点号分隔:header.payload.signature。
  • sub、role、iat、nbf 和 exp 等常见声明分别描述身份、权限、签发时间和过期时间。
  • 解码后的载荷谁都能修改:只有签名能让服务器发现篡改。
  • 算法各不相同:HS256 使用共享密钥;RS256 和 ES256 使用公钥/私钥对。头部的 alg 字段会告诉你用的是哪一种。

如何一步步解码 JWT

  1. 粘贴完整的令牌

    把 JWT 粘贴到输入框。它看起来应该像 xxxx.yyyy.zzzz:三个经过 Base64URL 编码、用点号连接的部分。

  2. 查看头部

    头部会告诉你签名算法(alg)和令牌类型。留意 "alg": "none":这表示令牌没有签名,不能信任。

  3. 查看载荷中的声明

    载荷是包含所有声明的 JSON。找找 sub(用户 id)、exp(过期时间)、iat(签发时间),以及你的应用自己添加的声明,比如 role 或 tenant。

  4. 检查是否过期

    把 exp 这个 Unix 时间戳转换成日期:如果已经过去了,说明令牌已过期,任何规范的 API 都会拒绝它。

  5. 验证签名(可选)

    如果你有密钥或公钥,把它粘贴到验证器中,确认签名有效。只有签名验证通过,令牌的内容才可信。

JWT 标准声明

这些是 JWT 规范(RFC 7519)定义的注册声明。任何应用都可以在它们之外添加自定义声明。

声明名称含义
issIssuer(签发者)谁创建并签名了这个令牌
subSubject(主题)令牌是关于谁的,通常是用户 id
audAudience(受众)令牌是发给谁使用的
expExpiration(过期时间)Unix 时间戳,超过这个时间令牌即失效
nbfNot Before(生效时间)在这个时间之前不得接受该令牌
iatIssued At(签发时间)令牌是什么时候创建的
jtiJWT ID唯一标识符,可用于吊销令牌
algAlgorithm(头部)签名算法:HS256、RS256、ES256 等

可以试试的 JWT 示例

查看一个典型的 JWT

Token

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsInJvbGUiOiJzdHVkZW50IiwiZXhwIjoxNzEwMDAwMDAwfQ.Q3hH8yzqI2OsHJ1Lyj8jJfJPa5ZpIVlh1FhJpJbqMcs

Header
{  "alg": "HS256",  "typ": "JWT"}
Payload
{  "sub": "user_123",  "role": "student",  "exp": 1710000000}

头部说明使用的是 HS256(一种共享密钥算法)。载荷标识了用户、用户的角色,以及令牌何时过期。签名是第三部分。(这是用于演示的示例令牌,用任何真实的密钥都无法通过签名验证。)

检查令牌是否已过期

载荷中的声明
{  "exp": 1710000000}

exp 是以秒为单位的 Unix 时间戳。把它转换成日期:如果已经过去了,令牌就过期了,正确实现的后端会拒绝它。

识别危险的 "none" 算法

Header
{  "alg": "none",  "typ": "JWT"}

如果服务器接受 "alg": "none",攻击者无需签名就能伪造任意载荷。在生产环境中一定要拒绝这种头部。

常见的 JWT 错误

  • 把密码、密钥或敏感个人数据放进载荷。JWT 是可读的,没有加密。
  • 解码了令牌,没检查签名就认为它有效。
  • 把 Base64URL 的可读性和加密混为一谈:JWT 的载荷本来就是设计成容易读取的。
  • 把 JWT 存进 localStorage 却没考虑 XSS 的影响,还给它设置了很长的有效期。
  • 不校验 aud(受众)声明:如果接收方不检查,签发给一个服务的令牌可能被拿去另一个服务冒用。

JWT 常见问题

JWT 是什么?

JWT 是 JSON Web Token 的缩写。它是一种紧凑、带签名、URL 安全的令牌格式,用于在双方之间传递声明,最常见的是在服务器和浏览器之间表示一个已登录的用户。

怎么解码 JWT?

把令牌粘贴到 JWT 解码工具中,或者按点号把它拆开,对前两部分分别做 Base64URL 解码。头部和载荷会还原成 JSON;第三部分是签名。

怎么检查 JWT 是否过期?
看载荷中的 exp 声明。它是以秒为单位的 Unix 时间戳。如果当前时间已经超过 exp,令牌就过期了。
任何人都能解码 JWT 吗?

是的。头部和载荷只是经过 Base64URL 编码,并没有加密。签名只能证明令牌没有被篡改,并不能隐藏内容。

JWT 验证是什么意思?

验证会用预期的密钥或公钥重新计算签名,再与令牌上的签名比较。两者一致,就说明载荷可信且未被修改。

可以把密码存进 JWT 吗?

不可以。任何拿到令牌的人都能读取载荷。只存放不敏感的标识符和声明,并依靠较短的有效期加上刷新令牌来保证安全。

了解更多

其他开发者工具

Coddy 编程语言插图

和 Coddy 一起学编程

开始