HandyTools Hub

🔐 JWT 解码器

解码并检查 JSON Web Tokens。

🔒 您的数据永远不会离开浏览器

JSON Web Token 是由点号分隔的三段 Base64url 编码内容:头部(header)、载荷(payload)和签名(signature)。本解码器会拆分令牌,解码头部和载荷并以 JSON 形式美化打印,同时显示签名算法、令牌类型,以及载荷中的时间声明是把令牌置于过去还是未来。它不验证签名,也无法告诉你令牌是否应当被信任。

如何使用

  1. 粘贴您的 JWT 令牌:复制您的 JWT 令牌并粘贴到输入框中。解码器接受标准的三段式格式(header.payload.signature),字段一有内容就会立即开始解码。
  2. 查看解码后的头部和载荷:工具即时解码并显示令牌的头部(算法、类型)和载荷(声明)为格式化的 JSON,同时显示令牌信息行:算法、类型、过期状态,以及存在时的到期日期。
  3. 检查过期状态:根据 exp 和 nbf 声明,查看令牌当前是否有效、已过期或尚未生效。
  4. 复制解码数据:选择并复制解码后的头部、载荷或签名,用于调试或文档编写。

如果输入为空,面板会隐藏。如果令牌格式错误,错误信息会说明问题出在头部、载荷还是整体格式。

三个部分分别包含什么

  • 头部——描述令牌如何签名的小型 JSON 对象。alg 字段指明算法(例如 HS256 或 RS256),typ 通常是 JWT,kid 可能标识所用的密钥。
  • 载荷——声明。注册声明包括 iss(签发者)、sub(主体)、aud(受众)、exp(到期)、nbf(生效前)、iat(签发时间)和 jti(令牌 ID)。应用程序还会添加角色或用户 ID 等自定义声明。
  • 签名——密码学输出。它是二进制并经 Base64url 编码,因此解码器将其显示为字符串而非 JSON。

Base64url 是 Base64 的 URL 安全变体:用 - 和 _ 代替 + 和 /,并且通常省略填充符 =。解码器会先恢复填充再解码。

解码不等于验证

这是最重要的一条局限。Base64url 解码是可逆的,完全不需要密钥,因此任何拿到令牌的人都能读懂头部和载荷——它们既不是秘密,也没有被加密。任何人都可以用自己选择的任意载荷伪造一个令牌,它在这里会完美解码。解码器从不检查签名,从不校验 iss 或 aud,也从不拒绝弱算法。一个头部声明为 "alg":"none" 的令牌会毫无怨言地解码,这正是解码内容绝不能用来驱动授权决策的原因。信任只来自用正确的密钥或公钥验证签名,并在服务端校验预期的声明。

读取 exp、nbf 与 iat

JWT 时间声明是 NumericDate 值:自 Unix 纪元起的秒数(UTC),而不是毫秒。exp 是令牌到期时刻,nbf 是它最早可被使用的时刻,iat 记录签发时间。解码器把 exp 和 nbf 与你的本地时钟比较,把令牌标记为有效、已过期或尚未生效,并把到期时间渲染成可读日期。由于比较使用的是你机器的时钟且纯属信息提示,设备时间错误可能显示误导性的标记。没有 exp 声明的令牌在这项检查下永不过期并被标记为有效——这同样是没有证据,而非安全的证明。

实操示例

以经典示例令牌为例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

头部解码为 {"alg":"HS256","typ":"JWT"},因此算法显示为 HS256、类型显示为 JWT。载荷解码为 {"sub":"1234567890","name":"John Doe","iat":1516239022},签发时间为 2018 年 1 月 22 日。其中没有 exp 也没有 nbf,因此状态显示为有效、到期显示为无到期时间。签名面板把最后一段显示为原始文本。这段输出中的任何内容都不能证明令牌是由某个特定方签发的。

如果载荷还带有 exp,标记会跟随那个时间戳而不是令牌内容:同一个字符串会在到期时刻之前显示为有效,之后翻转为已过期,而令牌本身毫无变化。

常见解码错误

  • “Invalid JWT format: expected 3 parts.” 最常见的错误,意味着点号分隔的结构被破坏——粘贴被截断、复制时仍带着 HTTP 的 Bearer 前缀、带上了引号,或令牌只有两段。
  • “Invalid header: not valid base64 encoding.” 第一段含有既非 Base64url 也非恢复填充的字符,通常说明复制不完整或令牌根本不是 JWT。
  • “Invalid header: not valid JSON.” 该段能从 Base64url 解码,但结果文本不是 JSON。这可能发生在错误的段被放在首位,或令牌被篡改时。
  • 五段的值。 那是 JWE(加密令牌),不是签名的 JWT。其内容是密文,没有解密密钥无法读取,因此本解码器会拒绝它。
  • 百分号编码的输入。 如果令牌经由 URL 传递并仍含 %2E 之类的转义,点号被隐藏,拆分就不会发生。请先对 URL 解码。

解码器在解析前会去除空白,因此换行包装的副本没有问题;几乎所有其他失败都源于多余或缺失的字符。

功能特性

  • 解码 JWT 头部和载荷:即时解析并美化打印任何有效 JWT 令牌的两部分。
  • 过期状态检查:自动检查令牌是否有效、已过期或尚未激活。
  • 算法检测:识别令牌使用的签名算法(HS256、RS256、ES256 等)。
  • 安全警告:当令牌存在过期或算法问题等安全隐患时发出提醒。
  • 复制解码数据:轻松选择和复制解码内容,用于调试和开发。

使用场景

  • 调试认证问题:在排查登录失败、会话错误或应用程序中意外的 401 响应时,快速检查 JWT 令牌。
  • 检查 API 令牌:解码 API 请求中的 Bearer 令牌,验证声明、受众和签发者是否配置正确。
  • 验证令牌声明:检查令牌载荷中嵌入的用户角色、权限和自定义声明是否符合预期值。
  • 检查令牌过期时间:确定令牌是否仍然有效或已过期,以调试意外的注销或令牌刷新失败。

相关工具

常见问题

什么是 JWT?

JSON Web Token (JWT) 是一种由 RFC 7519 定义的紧凑、URL 安全的令牌格式。它用于以 JSON 对象的形式在两方之间安全地传输信息。JWT 常用于 Web 应用程序、API 和微服务中的身份验证和授权。JWT 由三部分组成:header(头部)、payload(载荷)和 signature(签名),用点号分隔。

可以验证签名吗?

该工具仅解码 JWT 令牌,不验证签名。签名验证需要 secret 密钥(用于 HMAC 算法)或公钥(用于 RSA/ECDSA 算法),这些绝不应公开分享。请使用服务器端库(如 jsonwebtoken (Node.js) 或 PyJWT (Python))来安全地验证签名。

成功解码是否意味着令牌可信?

不是。解码只是对头部和载荷做 Base64url 解码并解析成 JSON,并不校验签名、签发者、受众或算法。任何人都能在不知道任何密钥的情况下构造出格式正确的头部和载荷,所以这里显示正常并不能说明服务器应当接受该令牌。签名和声明的校验必须在服务端用正确的密钥或公钥完成。

解码器如何判断令牌的过期状态?

它把数值型的 exp 和 nbf 声明与您电脑的当前时间比较,并从 Unix 秒转换成本地日期。如果 exp 已过,令牌标记为已过期;如果 nbf 尚未到,标记为尚未生效;否则标记为有效。该标记仅供显示并依赖本地时钟,因此时钟偏差或缺少 exp 声明都会影响它,而这与令牌本身的安全性无关。

为什么签名显示为原始文本而不是解码后的 JSON?

签名是用 Base64url 编码的二进制数据,而不是 JSON 文档。把它解码只会得到不可读的字节,而非结构化的声明,所以工具按原样显示令牌中的编码字符串。只有头部和载荷是 JSON,因而会被美化打印。

为什么我的令牌会报格式错误?

解码器要求令牌恰好由点号分隔的三段组成。只有两段、四段、缺少某段或含有多余点号的令牌都会被拒绝。请原样复制签发出来的令牌,不要添加换行,也不要截断签名,并确认没有误带周围的文字。

由 HandyTools Hub 团队审校 · 最后更新