JWT 调试器

解码、编码和验证 JSON Web 令牌 (JWT)。

免费在线 JWT 调试器和解码器

JWT在现代APIs中具有权力认证,但它们的Base64编码结构使它们一目了然。 Dokall 解码标头和有效负载,验证结构,并帮助您在开发过程中编码或验证令牌。

调试 OAuth 流、检查会话令牌并测试签名验证 - 一切都在您的浏览器中进行。切勿将生产机密粘贴到不受信任的站点上; Dokall 在客户端处理令牌。

JWT 身份验证如何工作

用户登录时,服务器创建包含用户身份和权限的 JWT,用密钥签名后返回。之后每次请求,客户端发送 JWT——通常在 Authorization 头中以 Bearer <token> 形式。服务器验证签名,无需查询会话存储。

这种无状态设计意味着任何持有签名密钥的服务器都能独立验证令牌。因此 JWT 在微服务架构、单页应用和移动 API 中很受欢迎——这些场景下认证服务器与资源服务器可能是不同机器。

JWT 结构:Header、Payload、Signature

JWT 是三个由点分隔的 Base64url 编码 JSON 对象:header.payload.signature。

header 声明令牌类型(始终为 JWT)和签名算法,例如 {"alg": "HS256", "typ": "JWT"}。payload 携带声明——描述用户或会话的键值对。声明可以是注册的(由规范定义)、公开的(自定义但抗冲突)或私有的(各方约定)。signature 通过对编码后的 header 和 payload 用密钥或私钥签名产生。持有对应密钥的人可验证令牌未被篡改。

将令牌粘贴到本调试器时,它按点分割、解码各部分并显示 JSON。读取 header 和 payload 无需密钥——仅验证签名时需要。

签名算法:HS256 vs RS256 vs ES256

HS256(HMAC + SHA-256)是对称算法。同一密钥用于签名和验证。快速简单,但每个需要验证令牌的服务都必须知道密钥。若一个服务被攻破,密钥即暴露。

RS256(RSA + SHA-256)是非对称的。私钥签名,公钥验证。只有认证服务器需要私钥——下游服务使用可安全分发的公钥。RS256 密钥更大(2048+ 位),签名较慢,但验证很快。

ES256(ECDSA + P-256)也是非对称的,但使用椭圆曲线密码学。密钥远小于 RSA(256 位对比 2048 位),运算更快,是新系统的良好默认选择。多数 JWT 库和云提供商都支持。

简单单服务器部署选 HS256。多个服务验证令牌或发布 JWKS 端点时,选 RS256 或 ES256。

标准 JWT 声明参考

JWT 规范(RFC 7519)定义了七个注册声明。均非强制,但一致使用有助于互操作。

iss(issuer)标识谁创建并签名令牌,通常是如 https://auth.example.com 的 URL。sub(subject)标识主体——通常是用户 ID。aud(audience)指定预期接收方,常为 API 域名。exp(expiration time)是 Unix 时间戳,之后令牌必须被拒绝。iat(issued at)记录令牌创建时间。nbf(not before)防止令牌在特定时间之前使用。jti(JWT ID)是唯一标识符,适用于一次性令牌或吊销列表。

除注册声明外,可添加应用所需的任意自定义数据——角色、权限、租户 ID、邮箱地址。请保持 payload 精简。每多一字节都会增大携带该令牌的每个 HTTP 请求。

JWT 与基于会话的身份验证

基于会话的认证在服务器上存储状态。用户登录时,服务器创建会话记录(内存、数据库或 Redis),分配会话 ID,并以 cookie 发给客户端。每次请求包含该 cookie,服务器查找会话。吊销访问即时生效——删除会话即可。

JWT 认证是无状态的。令牌本身包含服务器所需全部信息。每次请求无需查库,服务器间也无需共享会话存储。缺点是:若不维护黑名单,无法在过期前真正吊销 JWT,而这又部分抵消了无状态优势。

需要即时吊销时(银行、管理面板),会话更简单更好。分布式系统、跨域 API,以及 cookie 不便的移动客户端,JWT 更好。许多生产系统两者结合——用短生命周期 JWT 做 API 访问,配合可吊销的服务端刷新令牌。

常见 JWT 错误及修复方法

「Token expired」表示当前时间已过 exp 声明。检查服务器时钟是否同步(容器中 NTP 漂移是常见原因)。若令牌生命周期过短,可延长或实现刷新令牌流程。

「Invalid signature」表示验证密钥与签名密钥不匹配。常见于按环境部署密钥时加载了错误密钥、轮换密钥后未更新所有服务,或在环境间复制了令牌。

「Token not yet valid」在当前时间早于 nbf 声明时触发。通常是签发服务器与验证服务器之间的时钟偏差。多数 JWT 库接受较小时钟容差(通常 30–60 秒)。

「Malformed JWT」表示令牌没有三个用点分隔的部分,或某部分不是有效 Base64url。检查从日志或邮件复制令牌时是否有意外空格、换行或截断。

JWT 安全最佳实践

payload 是编码的,不是加密的。任何截获 JWT 的人都能阅读其声明。切勿在 payload 中放入密码、信用卡号或其他机密。

使用短过期时间——访问令牌常用 15 分钟。搭配安全存储在服务器上的更长生命周期刷新令牌。这样即使令牌被盗,损害窗口也有限。

对 HS256,密钥应至少有 256 比特密码学随机性。短口令易受暴力破解。请用密钥生成器创建合适的密钥。

始终在服务端验证 alg 声明。「算法混淆」攻击会诱使服务器将 RS256 令牌当作 HS256,并用公钥作为 HMAC 密钥。现代库可防范此问题,但仍建议显式配置算法。

在浏览器中存储 JWT 时,优先使用 httpOnly、Secure、SameSite cookie。localStorage 可被页面上任意 JavaScript 访问,易受 XSS 攻击。带正确标志的 cookie 可免疫 XSS 令牌窃取。

常见问题

什么是 JSON Web Token(JWT)?
JSON Web Token 是 RFC 7519 定义的紧凑、URL 安全的令牌格式。它以 JSON 对象携带一组声明,并用密钥(HMAC)或公私钥对(RSA、ECDSA)签名。JWT 广泛用于 Web API 的身份验证与授权。令牌由三部分组成——header、payload 和 signature——用点分隔。
在在线工具中解码 JWT 安全吗?
Dokall 完全在浏览器中解码令牌。不会发送到服务器。对开发和调试,基于浏览器的解码器安全且方便。即便如此,也请避免在任何公共网站上粘贴含真实用户数据的生产令牌——即使是纯客户端工具——因为浏览器扩展或剪贴板管理器可能泄露它们。
没有密钥也能读取 JWT 吗?
可以。header 和 payload 只是 Base64url 编码,并非加密。任何人都能解码并阅读。密钥仅用于验证签名——确认令牌未被篡改。因此切勿在 JWT payload 中存储敏感数据。
HS256 和 RS256 有什么区别?
HS256 是对称的——同一密钥签名并验证令牌。RS256 是非对称的——私钥签名,单独的公钥验证。仅一台服务器签发并验证令牌时用 HS256。多个服务需要在不知道签名密钥的情况下验证令牌时,用 RS256 或 ES256。
为什么我的 JWT 显示已过期?
令牌的 exp(expiration)声明是 Unix 时间戳。若当前时间超过它,令牌即已过期。常见原因:令牌生命周期对你的用例过短、服务器时钟不同步(容器中的 NTP 问题),或令牌数小时前签发并已自然过期。可通过调整令牌生命周期、同步时钟或实现刷新令牌流程来解决。
JWT 应该存在 localStorage 还是 cookie?
优先使用 httpOnly、Secure、SameSite cookie。localStorage 可被页面上运行的任意 JavaScript 访问,因此一次 XSS 漏洞就能窃取令牌。httpOnly cookie 完全无法被 JavaScript 读取。代价是 cookie 会随每个请求自动发送(包括到子域名),因此请仔细配置 cookie 的 domain 和 path。
如何在过期前吊销 JWT?
JWT 本质上是无状态的,因此没有内置的吊销机制。常见做法包括:将访问令牌设为短生命周期(5–15 分钟),并配合可删除的服务端刷新令牌;维护已吊销令牌 ID(jti 声明)的黑名单并在每次请求时校验;或在数据库中使用令牌版本计数器,拒绝旧版本令牌。
JWT 密钥泄露会怎样?
任何持有密钥的人都可以伪造带任意声明的有效令牌——相当于可冒充任何用户。应立即轮换密钥,这将使所有现有令牌失效,用户需要重新登录。对于 HS256,更换密钥即可;对于 RS256/ES256,生成新密钥对并更新 JWKS 端点。建议采用带重叠有效期的密钥轮换,避免硬性切断。