正在加载,请稍候…

JWT 详解:如何读取和验证 JSON Web Token

解码并检查任意 JWT 令牌。了解标头、载荷、签名、过期时间和常见安全错误。

JWT 详解:如何读取和验证 JSON Web Token

什么是 JWT?

JSON Web Token (JWT) 是一种紧凑的、URL 安全的令牌格式,用于在双方之间表示声明(断言)。根据 RFC 7519 定义,JWT 是现代 Web 应用中用于身份验证令牌、API 授权和安全信息交换的标准机制。

JWT 详解:如何读取和验证 JSON Web Token 插图

JWT 结构

一个 JWT 由三个 Base64URL 编码的部分组成,用点号分隔:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNzAwMDAwMDAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

标头 (Header)

{
  "alg": "HS256",
  "typ": "JWT"
}

指定令牌类型 (JWT) 和签名算法 (HS256 = HMAC-SHA256)。

载荷 (Payload / Claims)

{
  "sub": "user123",
  "name": "Alice",
  "email": "alice@example.com",
  "iat": 1700000000,
  "exp": 1700003600
}

签名 (Signature)

通过对编码后的标头和载荷使用密钥(或 RS256/ES256 的私钥)进行签名生成。

标准声明 (Standard Claims)

具有特殊含义的保留声明名称:

  • iss (Issuer):令牌的签发者
  • sub (Subject):令牌的主题(通常是用户 ID)
  • aud (Audience):令牌的接收方
  • exp (Expiration):令牌过期时间(Unix 时间戳)
  • nbf (Not Before):在此时间之前令牌无效
  • iat (Issued At):令牌签发时间
  • jti (JWT ID):令牌的唯一标识符

JWT 详解:如何读取和验证 JSON Web Token 插图

JWT 签名算法

对称算法 (共享密钥)

  • HS256/HS384/HS512:使用 SHA-256/384/512 的 HMAC
  • 签名和验证使用相同的密钥
  • 简单但需要共享密钥

非对称算法 (公钥/私钥)

  • RS256/RS384/RS512:使用 SHA-256/384/512 的 RSA

  • 私钥签名,公钥验证

  • 第三方无需签名密钥即可验证

  • ES256/ES384/ES512:ECDSA(比 RSA 更高效)

  • 相同安全级别下密钥尺寸更小

安全注意事项

"alg: none" 攻击

早期的 JWT 库在 alg 设置为 "none" 时接受未签名的令牌。始终验证算法标头并拒绝意外的算法。

JWT 详解:如何读取和验证 JSON Web Token 插图

密钥强度

对于 HS256,至少使用 256 位的随机熵。切勿使用弱密钥,如 "secret" 或 "password"。在 Node.js 中使用 crypto.randomBytes(32)

令牌存储

  • localStorage:JavaScript 可访问,易受 XSS 攻击
  • HttpOnly cookies:JavaScript 不可访问,可防御 XSS,但需要 CSRF 保护
  • 推荐:HttpOnly、Secure、SameSite=Strict 的 cookie

令牌撤销挑战

JWT 是无状态的——服务器不跟踪哪些令牌有效。一旦签发,JWT 在过期前一直有效。解决方法:

  • 短过期时间(15 分钟)
  • 令牌黑名单(破坏无状态性)
  • 刷新令牌轮换

JWT 在身份验证流程中的应用

  1. 用户使用凭据登录
  2. 服务器验证凭据
  3. 服务器使用密钥创建签名的 JWT
  4. JWT 返回给客户端
  5. 客户端在后续请求的 Authorization 标头中发送 JWT
  6. 服务器验证 JWT 签名和声明
  7. 如果有效,处理请求
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

使用 JWT 解析器工具

我们的工具:

  1. 粘贴任意 JWT — 立即解码并显示
  2. 显示所有三个部分 — 分别显示标头、载荷和签名
  3. 声明解释 — 时间戳以人类可读的日期显示
  4. 验证状态 — 检查令牌是否过期
  5. 算法识别 — 显示使用的签名算法
  6. 复制部分 — 提取标头或载荷为 JSON

用于调试身份验证问题、在开发过程中理解 JWT 内容以及验证令牌结构和声明。