侧边栏壁纸
博主头像
colo

欲买桂花同载酒

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

简述认证与授权的区别及常见实现方式

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

题目

简述认证与授权的区别及常见实现方式

信息

  • 类型:问答
  • 难度:⭐

考点

认证概念,授权概念,Session机制,Token机制

快速回答

认证(Authentication)是验证用户身份的过程,解决"你是谁"的问题;授权(Authorization)是验证用户权限的过程,解决"你能做什么"的问题。

常见实现方式:

  • Session-Cookie:服务端存储会话数据
  • Token(如JWT):客户端存储加密令牌
## 解析

1. 核心概念

认证(Authentication):验证用户身份的真实性,例如用户名密码登录、指纹识别等。

授权(Authorization):验证用户是否有权限访问特定资源,例如检查用户角色是否能访问管理员页面。

生活类比
认证 = 用身份证进入公司大楼(证明你是员工)
授权 = 刷卡进入研发实验室(检查你的部门权限)

2. 常见实现方式

Session-Cookie 机制

原理

  1. 用户登录后,服务端创建Session并存储SessionID
  2. 服务端通过Set-Cookie头将SessionID发给浏览器
  3. 浏览器后续请求自动携带Cookie
  4. 服务端验证SessionID有效性

代码示例(Node.js)

// 登录验证
app.post('/login', (req, res) => { if (isValidUser(req.body)) { req.session.user = req.body.username // 存储会话 res.send('登录成功') } }) // 权限检查中间件 const checkAuth = (req, res, next) => { if (req.session.user) next() // 已认证 else res.status(401).send('请先登录') }

Token 机制(JWT示例)

原理

  1. 服务端生成包含用户信息的加密Token
  2. 客户端存储Token(通常放在localStorage或Cookie)
  3. 客户端每次请求在Authorization头携带Token
  4. 服务端解密验证Token有效性

代码示例

// 生成JWT
const token = jwt.sign(
  { userId: 123, role: 'user' }, // 载荷(payload)
  'SECRET_KEY', // 密钥
  { expiresIn: '1h' } // 过期时间
)

// 验证中间件
const verifyToken = (req, res, next) => {
  const token = req.headers.authorization?.split(' ')[1]
  if (!token) return res.status(403).send('缺少Token')

  try {
    const decoded = jwt.verify(token, 'SECRET_KEY')
    req.user = decoded // 将解码信息附加到请求对象
    next()
  } catch (err) {
    res.status(401).send('无效Token')
  }
}

3. 最佳实践

  • 敏感操作(如支付)必须二次认证
  • Session需设置合理过期时间(如30分钟)
  • JWT应使用HTTPS传输防止窃听
  • 密码存储必须加盐哈希(如bcrypt)

4. 常见错误

  • 在JWT中存储敏感信息(如密码)
  • 未验证Token签名导致伪造攻击
  • Session未设置HttpOnly导致XSS攻击
  • 权限检查缺失(认证后未做授权验证)

5. 扩展知识

  • OAuth2.0:第三方授权标准(如"用微信登录")
  • RBAC:基于角色的访问控制(Role-Based Access Control)
  • CSRF防护:Session需配合CSRF Token使用