侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

设计安全的JWT认证与授权系统

2025-12-8 / 0 评论 / 4 阅读

题目

设计安全的JWT认证与授权系统

信息

  • 类型:问答
  • 难度:⭐⭐

考点

JWT原理,认证授权流程设计,安全最佳实践

快速回答

关键设计要点:

  • 使用HS256RS256算法签名防止篡改
  • JWT应包含exp(过期时间)和iat(签发时间)声明
  • 敏感数据不存储在JWT payload中
  • 采用HTTPS传输防止中间人攻击
  • 实现Refresh Token机制延长会话
  • 服务端维护Token黑名单应对提前注销
## 解析

1. 原理说明

JWT(JSON Web Token)由三部分组成:

  • Header:声明算法和类型(如HS256)
  • Payload:携带用户声明(如用户ID、角色)
  • Signature:对前两部分的签名,防止篡改

认证流程:

  1. 用户提交凭证登录
  2. 服务端验证后生成JWT返回客户端
  3. 客户端在后续请求的Authorization头携带JWT
  4. 服务端验证签名和声明后处理请求

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流程
    1. 客户端用过期Access Token+Refresh Token请求刷新
    2. 服务端校验Refresh Token有效性及绑定关系
    3. 签发新Access Token,Refresh Token不变
  • 黑名单实现
    # Redis记录提前注销的Token
    SETEX revoked_<token_signature> 3600 '1' # 1小时自动过期
  • 安全增强:添加jti(JWT ID)声明追踪Token,防范重放攻击