KernelHost Tools JWT Decoder

JWT Decoder

把 JSON Web Token 拆解为 Header、Payload、Signature 三部分,查看 Claims,可选地用 Secret 或公钥校验签名。一切都在你的浏览器中本地完成。

把 token 粘贴到输入框,三个区块会实时更新(输入有约 300 ms 防抖)。

100% 浏览器本地: 本工具是纯 HTML+JavaScript 页面。你的 JWT、Secret 和公钥仅在本机处理,绝不发送到任何服务器。
Header
等待输入 ...
Payload
等待输入 ...
Signature
等待输入 ...

校验签名(可选)

HS256/HS384/HS512 需要共享 Secret。RS*、PS*、ES* 使用 PEM 格式的公钥(SPKI / BEGIN PUBLIC KEY)。Ed25519 在现代浏览器中可用。

可以开始校验
提示:生产环境的真实校验应放在服务器的 Auth 层,而非浏览器。本工具用于调试、逆向研究和学习。

什么是 JWT?

JSON Web Token(JWT,读作 "jot")是 RFC 7519 定义的紧凑、签名 JSON 对象。它在两方之间传递 Claims,典型场景是 Auth 服务器与 API 之间。服务器在认证成功后签发 token,客户端在每次 API 调用时通过 `Authorization: Bearer ...` 头携带。

JWT 由三段以点连接的 base64url 编码部分构成。它不是加密,仅是签名。任何拿到 token 的人都能读取内容,因此密码或其他机密绝不能放入 payload。

相对服务端 Session 的优势:JWT 是自包含的。API 服务器无需联系 Auth 服务器或查询 Session 库即可验证 token 并提取权限。横向扩展非常出色,但代价是难以提前撤销单个 token。

Header、Payload、Signature 解读

每个 JWT 都由三部分组成,以单个点连接:

  • Header:小型 JSON 对象,含 `alg`(算法,例如 HS256、RS256、ES256)和 `typ`(通常为 "JWT")。有时还含 `kid`(密钥 ID),提示用了哪把签名密钥。
  • Payload:JSON 对象,承载 Claims。标准字段有 `iss`(颁发者)、`sub`(Subject)、`aud`(Audience)、`exp`(过期)、`nbf`(生效时间)、`iat`(签发时间)和 `jti`(唯一 Token ID)。也允许自定义字段。
  • Signature:以 `base64url(header) + "." + base64url(payload)` 为输入,按所配算法计算。它保护完整性:未掌握密钥就无法在不被发现的情况下篡改内容。

重要:base64url 是编码,不是加密。Header 和 Payload 任何观察者都能阅读。

JWT 与 Session Cookie

两种方案都保留认证状态,但路数不同:

  • Session Cookie:不透明 ID,服务器据此在 Session 库中查找完整状态。可即时撤销,但每次请求都要查一次。
  • JWT:状态本身嵌在 token 中,仅靠签名保护。无需查找,非常适合微服务架构,但要在过期前撤销则需要 allow/deny 列表。
  • 大小:JWT 通常 300 至 1500 字节;Session ID 大约 32 字节。在大量 API 调用时 JWT 体积在带宽上会累积。
  • 存储:在浏览器世界,Cookie(HttpOnly、Secure、SameSite)是更安全的存储位置。localStorage 暴露给 XSS。

经验法则:纯服务端应用用 Session;API 网关与移动后端用 JWT,理想是短生命周期 + Refresh Token 流程。

JWT 安全:如何对待 `algorithm: none`?

近些年 JWT 库出过几起轰动 bug。最大的几个陷阱:

  • `alg: none`:曾有库在 Header 声明 "none" 时接受未签名 token。修复:永不允许 `none`,在服务器侧硬编码允许的算法。
  • HS256/RS256 混淆:攻击者用 RSA 公钥作为 HMAC Secret 签发 token,服务器把它当 HS256(而非 RS256)校验,遂被骗过。防御:在服务器侧固定允许的 `alg`。
  • `kid` 注入:`kid` 字段指向某个密钥,但若未消毒会导致路径遍历或 SQL 注入。把它当作不可信输入处理。
  • 弱 Secret:用 "secret" 或 "password" 作为 HS256 密钥的 token 几秒内即可被暴破。请使用至少 256 位随机字节,最好来自 `crypto.getRandomValues()` 或 `/dev/urandom`。
  • 生命周期过长:每个签发出去的 JWT 直到过期都有效,即便用户已 "登出"。请用短生命周期(15 分钟)+ Refresh Token,或对敏感端点维护 Deny 列表。

OWASP 速查表系列与 RFC 8725(JWT Best Current Practices)是必读。

如何校验一个 JWT?

完整校验远不只是签名。服务器代码中的顺序:

  • 解析 Header,把 `alg` 与白名单对比(例如仅允许 RS256)。
  • 用与 Issuer 配置匹配的密钥校验签名。使用 JWKS 时可用 `kid` 作为查找键,但要先白名单其值。
  • 校验标准 Claims:`iss` 等于预期颁发者,`aud` 包含自身 Audience,`exp` 在未来,`nbf` 与 `iat` 在过去(容许少量时钟偏差)。
  • 按业务模型校验自定义 Claims(角色、租户 ID、Scopes)。
  • 如需提前撤销,检查 Deny / Logout 列表。

请依靠成熟库(jose、jjwt、jsonwebtoken 等),而不是自己写。密码学不是手工活儿。

在 KernelHost 托管你的 Auth 后端

JWT Issuer 与 Resource Server 需要可靠、低延迟的后端。KernelHost 在 Frankfurt FRA01 自营 VPS 与独立服务器,含 DDoS 防护、IPv4 + IPv6 与 1 Gbit/s 上行链路。对欧洲用户的低 RTT、价格合理、无供应商锁定。公司位于 Wien(AT),数据中心在 Frankfurt(DE)。

JWT 常见问题

把生产环境的 JWT 粘贴到这里安全吗?

安全。本页面是没有服务端逻辑的静态 HTML 加 JavaScript。内容不离开浏览器,也不会被存到 localStorage(仅当启用 "记住" 选项时,才会保存 HMAC Secret 或公钥)。

支持哪些算法的签名校验?

HMAC HS256、HS384、HS512 用 Secret。RSA RS256/384/512、PS256/384/512 与 ECDSA ES256/384/512 用公钥(PEM、SPKI)。EdDSA / Ed25519 在现代浏览器中可用。

为什么显示 "算法不支持"?

某些算法(例如 Ed25519)只在较新的浏览器版本上线。请升级浏览器,或在服务器侧校验签名。

本工具能签名 / 生成 token 吗?

不行,本工具只校验和解码。要生成 token,请用服务器代码加 jose、jjwt 或 jsonwebtoken。

base64url 与普通 Base64 一样吗?

几乎一样。base64url 把 `+` 与 `/` 替换为 `-` 与 `_`,并允许省略 padding(`=`),以保持 URL 安全。

如果 `exp` 已过去会怎样?

Token 仍会被解码(用于查看),但会显示橙色 "已过期" 标签。服务器代码应始终拒绝过期 token。

我的 Secret 或公钥会被存到哪里吗?

仅当启用 "记住" 选项时,才会把 Secret 与公钥存到浏览器的 `localStorage`,绝不存到服务器。取消勾选即可移除。

本工具有什么限制?

无固定上限。实战中约 4 KiB 以下都稳。Token 非常大时浏览器在高亮时可能明显变慢。

所有 KernelHost 产品

不只是工具?看看我们的商业托管方案。