免费在线 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 令牌窃取。