什么是 JWT 解码?
JWT 解码是将 JWT Token 分解为其组成部分(Header、Payload、Signature)并显示其内容的过程。解码不需要密钥,因为 JWT 的 Header 和 Payload 部分只是 Base64 编码的 JSON 数据。
JWT 结构解析
Header(头部):包含令牌类型(typ)和签名算法(alg)信息
Payload(载荷):包含声明(claims),如用户信息、过期时间等
Signature(签名):用于验证令牌的完整性,需要密钥才能验证
JWT 主要使用场景
- 身份认证:用户登录后,服务器生成 JWT 返回给客户端,后续请求携带此令牌进行身份验证
- 信息交换:在不同服务之间安全地传输信息,因为 JWT 可以被签名验证
- 单点登录(SSO):用户在一个应用中登录后,可以访问其他相关应用而无需重新登录
- API 授权:为 RESTful API 提供无状态的授权机制
- 移动应用认证:移动应用与后端服务的安全通信
- 微服务架构:在微服务之间传递用户身份和权限信息
常用 JWT 算法详解
对称加密算法(HMAC)
- HS256(HMAC-SHA256):最常用的算法,使用共享密钥进行签名和验证
- HS384(HMAC-SHA384):更强的哈希算法,提供更高的安全性
- HS512(HMAC-SHA512):最强的 HMAC 算法,适用于高安全要求场景
非对称加密算法(RSA)
- RS256(RSA-SHA256):使用 RSA 私钥签名,公钥验证,适合分布式系统
- RS384(RSA-SHA384):更强的 RSA 签名算法
- RS512(RSA-SHA512):最强的 RSA 签名算法
椭圆曲线算法(ECDSA)
- ES256(ECDSA-SHA256):使用椭圆曲线数字签名,性能优于 RSA
- ES384(ECDSA-SHA384):更强的椭圆曲线签名算法
- ES512(ECDSA-SHA512):最强的椭圆曲线签名算法
常见的 Payload 字段
- iss(Issuer):令牌颁发者
- sub(Subject):令牌主题,通常是用户ID
- aud(Audience):令牌接收者
- exp(Expiration):令牌过期时间
- iat(Issued At):令牌颁发时间
- nbf(Not Before):令牌生效时间
- jti(JWT ID):JWT 的唯一标识符
JWT 安全最佳实践
- 使用强密钥:HMAC 算法至少使用 256 位密钥,RSA 至少使用 2048 位密钥
- 设置合理的过期时间:避免令牌长期有效,建议访问令牌 15-30 分钟过期
- 使用 HTTPS:始终通过 HTTPS 传输 JWT,防止中间人攻击
- 验证所有声明:检查 iss、aud、exp 等关键字段
- 实施令牌撤销机制:维护黑名单或使用短期令牌配合刷新令牌
- 避免存储敏感信息:JWT 内容可被解码,不要存储密码、个人敏感信息
- 使用适当的算法:生产环境避免使用 "none" 算法
- 定期轮换密钥:定期更换签名密钥以降低泄露风险
安全注意事项
- JWT 的 Header 和 Payload 部分是 Base64 编码的,任何人都可以解码查看
- 不要在 JWT 中存储敏感信息,如密码、信用卡号等
- 解码 JWT 不等于验证 JWT,验证需要密钥
- 始终检查 JWT 的过期时间和其他重要字段
- 防范算法混淆攻击:严格验证算法类型
- 注意时钟偏移:在验证时间声明时考虑服务器时钟差异
实际应用案例
Web 应用身份认证
用户登录后,服务器生成包含用户 ID 和权限的 JWT,前端存储在 localStorage 或 sessionStorage 中,后续 API 请求在 Authorization 头中携带此令牌。
微服务间通信
API 网关验证用户身份后,生成包含用户信息的 JWT 传递给下游服务,各服务无需再次验证用户身份,只需验证 JWT 签名。
移动应用 API 访问
移动应用通过用户名密码获取 JWT,后续 API 调用携带此令牌,服务器验证令牌有效性和权限。
权威信息来源