正在加载,请稍候…

如何解析和调试 JWT 令牌

使用我们的在线 JWT 解析器解码、检查和调试 JSON Web 令牌,无需任何服务器端代码。

如何解析和调试 JWT 令牌

快速 JWT 参考

JSON Web 令牌(JWT)是用于身份验证和信息交换的紧凑、自包含的令牌。本指南涵盖了使用 JWT 的基本参考信息。

如何解析和调试 JWT 令牌 插图

JWT 结构一览

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
│──────────────────────────────────────│──────────────────────────────────────────────────────│──────────────────────────────────────────────────│
               Header                                      Payload                                                Signature

每个部分都是 Base64URL 编码的,并用点分隔。

标准 JWT 声明

声明 名称 类型 描述
iss Issuer 字符串 令牌的签发者
sub Subject 字符串 令牌主题(通常是用户 ID)
aud Audience 字符串/数组 令牌的目标受众
exp Expiration 数字 过期时间的 Unix 时间戳
nbf Not Before 数字 在此时间之前无效的 Unix 时间戳
iat Issued At 数字 签发时间的 Unix 时间戳
jti JWT ID 字符串 唯一令牌标识符

如何解析和调试 JWT 令牌 插图

常见签名算法

算法 类型 描述
HS256 对称 HMAC with SHA-256。签名和验证使用相同的密钥。简单但需要共享密钥。
HS384 对称 HMAC with SHA-384。比 HS256 更强。
HS512 对称 HMAC with SHA-512。最强的 HMAC 变体。
RS256 非对称 RSA with SHA-256。私钥签名,公钥验证。
RS384 非对称 RSA with SHA-384。
RS512 非对称 RSA with SHA-512。
ES256 非对称 ECDSA with P-256。密钥比 RSA 更小。
PS256 非对称 RSA-PSS with SHA-256。比 RS256 更安全。
EdDSA 非对称 Ed25519。现代、快速、安全。

如何验证 JWT

// Node.js - 使用 jsonwebtoken
const jwt = require('jsonwebtoken');

// 使用对称密钥验证
try {
  const decoded = jwt.verify(token, 'your-secret-key');
  console.log(decoded.sub, decoded.exp);
} catch (err) {
  // TokenExpiredError, JsonWebTokenError, NotBeforeError
}

// 使用公钥验证 (RS256)
const publicKey = fs.readFileSync('public.pem');
const decoded = jwt.verify(token, publicKey, { algorithms: ['RS256'] });
# Python - 使用 PyJWT
import jwt

decoded = jwt.decode(token, secret, algorithms=["HS256"])

如何解析和调试 JWT 令牌 插图

JWT 安全检查清单

在信任任何声明之前,始终在服务器端验证签名。检查 exp 声明并拒绝过期的令牌。明确指定允许的算法以防止算法混淆攻击。切勿在载荷中存储敏感数据,因为它只是 Base64 编码,而非加密。使用较短的过期时间(访问令牌 15-60 分钟)并结合刷新令牌。如果需要,通过黑名单实现令牌撤销。使用 HTTPS 防止令牌拦截。将令牌存储在 HttpOnly cookie 或内存中,而不是 localStorage,以减少 XSS 风险。

无需验证的解码

有时您需要读取 JWT 中的声明而不进行验证(例如,在进行网络调用刷新之前检查过期时间):

// 警告:请勿用于安全决策
const parts = token.split('.');
const payload = JSON.parse(atob(parts[1]));
console.log(payload.exp);  // Unix 时间戳

这仅适用于显示目的或预验证检查。

JWT 与 Session 令牌

Session 将状态存储在服务器端(数据库或 Redis 中),并仅向客户端提供一个不透明的 ID。JWT 将状态直接嵌入令牌中,使服务器无状态。这使得 JWT 非常适合微服务和分布式系统,其中每个服务都可以使用公钥独立验证令牌,而无需进行数据库调用。

其代价是 JWT 更难撤销:在过期之前无法使已签名的 JWT 失效,除非维护服务器端的黑名单(这在一定程度上抵消了无状态的好处)。

使用此工具

粘贴任何 JWT 即可立即解码并检查头部、载荷和签名。该工具显示:

  • 头部中的算法和令牌类型
  • 所有声明,数值型日期显示为人类可读的时间戳
  • 过期状态(有效、已过期或剩余时间)
  • 每个部分的原始 Base64URL 解码内容

-> 尝试 JWT 解析器