认证与授权
认证(你是谁)和授权(你能做什么)是两个问题。面试主线:认证方案对比、授权模型、越权防护。
认证方案
| 方案 | 机制 | 优点 | 缺点 |
|---|---|---|---|
| Session | 服务端存会话,Cookie 带 id | 可撤销、简单 | 服务端状态(要共享存储) |
| JWT | 无状态令牌,签名自含 | 无状态、跨服务 | 难撤销、载荷泄露风险 |
| OAuth2 | 授权协议(第三方登录) | 标准、生态 | 流程复杂 |
Session vs JWT(高频):
| 维度 | Session | JWT |
|---|---|---|
| 状态 | 服务端存 | 客户端带(签名) |
| 撤销 | 直接删会话 | 难(等过期/黑名单) |
| 扩展 | 多实例要共享存储 | 天然无状态 |
| 安全 | 泄露面小 | 载荷要加密或最小化 |
面试话术:能撤销要 Session,跨服务无状态要 JWT。JWT 的撤销难题用短过期 + refresh token 缓解。
JWT 要点
- 三部分:header.payload.signature(见 FastAPI 鉴权篇完整实现)
- 密钥:环境变量管理,别硬编码
- 常见漏洞:算法混淆(
alg=none)、密钥弱(爆破)、过期未校验 - 防泄露:payload 不放敏感数据(或加密)
OAuth2 与第三方登录
- 授权码模式(标准):用户授权 → 应用拿 code → 换 token
- PKCE:移动端/无秘密客户端必配(防 code 拦截)
- 与 JWT 结合:OAuth2 发 token(JWT 格式)→ 资源服务验签
授权:RBAC
| 模型 | 机制 | 适用 |
|---|---|---|
| RBAC | 用户 → 角色 → 权限 | 后台系统(标准) |
| ABAC | 属性策略(用户/资源/环境) | 复杂授权 |
| ACL | 资源权限列表 | 文件系统 |
用户 → 角色(admin/editor/viewer) → 权限(读/写/删)越权防护(必考):OWASP 第一位漏洞。
| 越权 | 例子 | 防护 |
|---|---|---|
| 水平越权 | 改 user_id 看别人订单 | 资源归属校验(查询必须带当前用户) |
| 垂直越权 | 普通用户调管理接口 | 接口级角色校验(装饰器/中间件) |
# 水平越权防护: 查询强制绑定当前用户
order = db.query(Order).filter(
Order.id == order_id, Order.user_id == current_user.id).first()面试追问
- 认证和授权的区别? 认证验身份,授权验权限。两个独立环节
- Session 和 JWT? 可撤销性 vs 无状态。能撤销要 Session,跨服务要 JWT(短过期 + refresh)
- 水平越权怎么防? 资源归属校验:查询强制绑定当前用户 ID,不能只信传入 ID
- RBAC 是什么? 用户-角色-权限三层。后台系统标准
- JWT 撤销怎么办? 短过期 + refresh token、黑名单、或换 Session。无状态和可撤销是矛盾的