题目
设计安全的JWT认证与授权系统
信息
- 类型:问答
- 难度:⭐⭐
考点
JWT原理,认证授权流程设计,安全最佳实践
快速回答
关键设计要点:
- 使用HS256或RS256算法签名防止篡改
- JWT应包含
exp(过期时间)和iat(签发时间)声明 - 敏感数据不存储在JWT payload中
- 采用HTTPS传输防止中间人攻击
- 实现Refresh Token机制延长会话
- 服务端维护Token黑名单应对提前注销
1. 原理说明
JWT(JSON Web Token)由三部分组成:
- Header:声明算法和类型(如HS256)
- Payload:携带用户声明(如用户ID、角色)
- Signature:对前两部分的签名,防止篡改
认证流程:
- 用户提交凭证登录
- 服务端验证后生成JWT返回客户端
- 客户端在后续请求的
Authorization头携带JWT - 服务端验证签名和声明后处理请求
2. 代码示例(Node.js)
// 生成JWT
const jwt = require('jsonwebtoken');
const token = jwt.sign(
{ userId: 123, role: 'admin', iat: Date.now() },
process.env.SECRET_KEY, // 使用环境变量存储密钥
{ expiresIn: '15m' } // 短期有效
);
// 验证JWT中间件
const authMiddleware = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.status(401).send('Access denied');
try {
const decoded = jwt.verify(token, process.env.SECRET_KEY);
req.user = decoded; // 将用户信息附加到请求对象
next();
} catch (err) {
res.status(401).send('Invalid token');
}
};3. 最佳实践
- 密钥管理:使用强密钥(HS256)或非对称加密(RS256),定期轮换
- 时效控制:Access Token有效期≤15分钟,Refresh Token有效期≤7天
- 存储安全:客户端使用HttpOnly Cookie存储,防御XSS攻击
- 权限控制:在Payload中添加角色/权限声明,实现RBAC
4. 常见错误
- ❌ 在JWT中存储敏感数据(如密码)
- ❌ 使用弱加密算法(如HS256密钥长度不足)
- ❌ 未校验签名直接解析Payload
- ❌ 未处理Token过期后的自动续签
- ❌ 忽略日志中的Token泄露风险
5. 扩展知识
- Refresh Token流程:
- 客户端用过期Access Token+Refresh Token请求刷新
- 服务端校验Refresh Token有效性及绑定关系
- 签发新Access Token,Refresh Token不变
- 黑名单实现:
# Redis记录提前注销的Token SETEX revoked_<token_signature> 3600 '1' # 1小时自动过期 - 安全增强:添加jti(JWT ID)声明追踪Token,防范重放攻击