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

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 签名算法
对称算法 (共享密钥)
- 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" 时接受未签名的令牌。始终验证算法标头并拒绝意外的算法。

密钥强度
对于 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 在身份验证流程中的应用
- 用户使用凭据登录
- 服务器验证凭据
- 服务器使用密钥创建签名的 JWT
- JWT 返回给客户端
- 客户端在后续请求的 Authorization 标头中发送 JWT
- 服务器验证 JWT 签名和声明
- 如果有效,处理请求
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
使用 JWT 解析器工具
我们的工具:
- 粘贴任意 JWT — 立即解码并显示
- 显示所有三个部分 — 分别显示标头、载荷和签名
- 声明解释 — 时间戳以人类可读的日期显示
- 验证状态 — 检查令牌是否过期
- 算法识别 — 显示使用的签名算法
- 复制部分 — 提取标头或载荷为 JSON
用于调试身份验证问题、在开发过程中理解 JWT 内容以及验证令牌结构和声明。