题目
简述认证与授权的区别及常见实现方式
信息
- 类型:问答
- 难度:⭐
考点
认证概念,授权概念,Session机制,Token机制
快速回答
认证(Authentication)是验证用户身份的过程,解决"你是谁"的问题;授权(Authorization)是验证用户权限的过程,解决"你能做什么"的问题。
常见实现方式:
- Session-Cookie:服务端存储会话数据
- Token(如JWT):客户端存储加密令牌
1. 核心概念
认证(Authentication):验证用户身份的真实性,例如用户名密码登录、指纹识别等。
授权(Authorization):验证用户是否有权限访问特定资源,例如检查用户角色是否能访问管理员页面。
生活类比:
认证 = 用身份证进入公司大楼(证明你是员工)
授权 = 刷卡进入研发实验室(检查你的部门权限)
2. 常见实现方式
Session-Cookie 机制
原理:
- 用户登录后,服务端创建Session并存储SessionID
- 服务端通过Set-Cookie头将SessionID发给浏览器
- 浏览器后续请求自动携带Cookie
- 服务端验证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示例)
原理:
- 服务端生成包含用户信息的加密Token
- 客户端存储Token(通常放在localStorage或Cookie)
- 客户端每次请求在Authorization头携带Token
- 服务端解密验证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使用