题目
JWT安全实践与常见漏洞防范
信息
- 类型:问答
- 难度:⭐⭐
考点
JWT结构理解,签名验证机制,算法选择安全,密钥管理,漏洞防范
快速回答
安全实现JWT认证需关注:
- 强制验证签名:拒绝无签名或无效签名的令牌
- 禁用none算法:在服务端配置中明确禁用该算法
- 算法白名单:仅允许强算法(如RS256/HS256)
- 密钥管理:使用强密钥并定期轮换
- 敏感数据:避免在payload中存储敏感信息
原理说明
JWT(JSON Web Token)由三部分组成:Header.Payload.Signature。Header定义算法类型,Payload携带业务数据,Signature用于验证完整性。安全核心在于签名验证机制——服务端用密钥验证签名是否被篡改。
常见漏洞与防范
- 算法篡改攻击(CVE-2015-9235):攻击者修改Header为
{"alg":"none"}绕过验证- 防范:服务端强制校验算法字段,禁用none
- 密钥混淆攻击:当服务端支持多种算法(如RS256/HS256)时,攻击者用公钥伪造HS256签名
- 防范:固定使用单一强算法(如只允许RS256)
- 签名未验证:开发疏忽导致跳过verify步骤
- 防范:标准化中间件处理,禁止手动跳过验证
代码示例(Node.js)
// 安全验证示例(使用jsonwebtoken库)
const jwt = require('jsonwebtoken');
// 错误做法:未指定算法白名单
// const decoded = jwt.verify(token, publicKey);
// 正确做法:明确算法白名单
const decoded = jwt.verify(token, publicKey, {
algorithms: ["RS256"], // 算法白名单
ignoreExpiration: false // 强制检查过期时间
});最佳实践
- 算法选择:优先使用非对称算法(RS256)避免密钥泄露风险
- 密钥管理:
- HS256密钥长度≥32字符
- RS256私钥存储于安全管理系统(如HashiCorp Vault)
- 每90天轮换密钥
- Payload规范:
- 包含标准声明:
exp(过期时间)、iss(签发者) - 禁止存储密码、银行卡号等敏感数据
- 包含标准声明:
- 传输安全:仅通过HTTPS传输,Cookie标记HttpOnly/Secure
扩展知识
- JWT vs PASETO:PASETO通过算法版本绑定避免算法混淆攻击
- 刷新令牌机制:Access Token有效期≤15分钟,配合Refresh Token实现无感续期
- 黑名单方案:对于令牌撤销需求,可结合Redis记录失效令牌ID(jti)