《安全接口设计核心要点》
第4章 Token认证机制
4、Token认证机制:JWT结构详解、JWT签名与验证、Token生命周期管理
4.1 JWT结构详解
JWT(JSON Web Token) 是一种紧凑的、URL安全的令牌格式,用于在各方之间安全传输声明信息。一个完整的JWT由三个部分组成,使用点号(.)分隔:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
🔴 Header
🟢 Payload
🔵 Signature
💡 关键提示:Payload中的声明分为三类——注册声明(如 iss、sub、exp、iat)、公共声明(如用户角色、权限)、私有声明(自定义字段)。注意:Payload是Base64编码而非加密,敏感信息不应放入JWT中。
4.2 JWT签名与验证
JWT的签名机制是保障令牌完整性和防篡改的核心。常用的签名算法包括 HMAC(对称) 和 RSA/ECDSA(非对称) 两大类。
🔐 对称签名(HMAC)
- 使用相同的密钥进行签名和验证
- 算法:HS256、HS384、HS512
- 优点:计算速度快,实现简单
- 缺点:密钥分发困难,需共享密钥
🔑 非对称签名(RSA/ECDSA)
- 使用私钥签名,公钥验证
- 算法:RS256、ES256、RS384等
- 优点:公钥可公开,安全性更高
- 缺点:计算速度较慢,令牌体积略大
📝 Node.js JWT签名与验证示例
const jwt = require('jsonwebtoken'); const secretKey = 'my_super_secret_key_2024'; // 1. 生成JWT令牌(签名) const payload = { sub: 'user_12345', name: '张三', role: 'admin', iat: Math.floor(Date.now() / 1000), exp: Math.floor(Date.now() / 1000) + (60 * 60) // 1小时过期 }; const token = jwt.sign(payload, secretKey, { algorithm: 'HS256' }); console.log('生成的JWT:', token); // 2. 验证JWT令牌 try { const decoded = jwt.verify(token, secretKey, { algorithms: ['HS256'] }); console.log('验证通过,解码内容:', decoded); } catch (err) { console.error('验证失败:', err.message); }
4.3 Token生命周期管理
Token的生命周期管理是安全架构中的关键环节,涵盖从颁发、使用、刷新到撤销的完整过程。合理的生命周期策略能有效降低令牌泄露带来的风险。
⚠️ 安全警告:Token生命周期管理常见陷阱包括:
• Refresh Token未设置过期时间 → 永久有效,风险极高
• 未实现Token轮换(Rotation) → 旧Token仍可使用
• 未检测Token重放攻击 → 需结合jti(JWT ID)和nonce机制
• 黑名单未及时清理 → 内存泄漏,性能下降
📝 Token刷新与撤销示例(伪代码)