Appearance
认证和授权背景研究
项目概述
认证和授权是应用安全的核心组成部分。本课程将深入探讨 JWT 和 OAuth 2.0 两种主流的认证授权方案。
认证与授权
认证 (Authentication)
认证是验证用户身份的过程,回答"你是谁"的问题。常见的认证方式包括:
- 用户名密码:最传统的认证方式
- 令牌认证:使用令牌代替密码
- 生物识别:指纹、面部识别等
- 多因素认证:结合多种认证方式
授权 (Authorization)
授权是验证用户权限的过程,回答"你能做什么"的问题。常见的授权方式包括:
- 基于角色的访问控制(RBAC):根据角色分配权限
- 基于属性的访问控制(ABAC):根据属性动态授权
- 基于资源的访问控制:控制对特定资源的访问
JWT 简介
什么是 JWT
JWT (JSON Web Token) 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。JWT 由三部分组成:
- Header(头部):描述令牌的元数据
- Payload(载荷):包含实际的数据
- Signature(签名):用于验证令牌的完整性
JWT 结构
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
└─────────────────────────────────────────────────────────────────────┘
Header Payload SignatureJWT 优势
- 无状态:不需要在服务器存储会话
- 跨域支持:适合分布式系统
- 性能好:减少数据库查询
- 标准化:遵循开放标准
- 自包含:包含所有必要信息
JWT 劣势
- 令牌无法撤销:一旦签发,直到过期
- 载荷大小限制:不适合存储大量数据
- 安全性依赖密钥:密钥泄露会导致安全问题
- 刷新机制复杂:需要实现令牌刷新
JWT 使用场景
JWT 特别适合以下场景:
- RESTful API:无状态的 API 认证
- 单页应用(SPA):前后端分离
- 移动应用:跨平台认证
- 微服务:服务间认证
- 第三方集成:API 授权
OAuth 2.0 简介
什么是 OAuth 2.0
OAuth 2.0 是一个授权框架,允许用户授权第三方应用访问其资源,而无需共享密码。OAuth 2.0 定义了四种授权模式:
- 授权码模式:最安全的模式,适用于有后端的应用
- 简化模式:适用于纯前端应用
- 密码模式:适用于高度信任的应用
- 客户端凭证模式:适用于服务间认证
OAuth 2.0 角色
OAuth 2.0 定义了四种角色:
- 资源拥有者:拥有资源的用户
- 客户端:请求访问资源的应用
- 授权服务器:颁发访问令牌的服务器
- 资源服务器:托管受保护资源的服务器
OAuth 2.0 流程
授权码模式
┌─────────┐ ┌─────────────┐ ┌──────────────┐ ┌──────────┐
│ 用户 │──────▶│ 客户端 │──────▶│ 授权服务器 │──────▶│ 资源 │
└─────────┘ └─────────────┘ └──────────────┘ └──────────┘
│ │ │ │
│ 1. 授权请求 │ 2. 授权码 │ 4. 访问令牌
│◀──────────────────│◀──────────────────────│◀─────────────────│
│ │ │ │
│ 3. 交换令牌 │ 5. 访问资源 │
│──────────────────▶│──────────────────────▶│ │OAuth 2.0 优势
- 安全性:用户不需要共享密码
- 标准化:遵循开放标准
- 灵活性:支持多种授权模式
- 可扩展:支持自定义权限
- 广泛支持:主流服务都支持
OAuth 2.0 劣势
- 复杂性:实现相对复杂
- 依赖第三方:依赖授权服务器的可用性
- 令牌管理:需要处理令牌刷新
- 安全风险:需要正确实现安全措施
OAuth 2.0 使用场景
OAuth 2.0 特别适合以下场景:
- 第三方登录:使用微信、QQ、GitHub 等登录
- API 授权:允许第三方应用访问用户数据
- 微服务认证:服务间授权
- 移动应用:安全的第三方集成
- 企业应用:单点登录(SSO)
安全考虑
JWT 安全
- 密钥管理:使用强密钥,定期更换
- 令牌过期:设置合理的过期时间
- HTTPS 传输:防止令牌被窃取
- 载荷验证:验证所有必要的声明
- 算法选择:使用安全的签名算法
OAuth 2.0 安全
- 状态参数:防止 CSRF 攻击
- PKCE:增强授权码模式的安全性
- 令牌存储:安全存储访问令牌
- 重定向验证:验证重定向 URI
- 权限最小化:只请求必要的权限
常见攻击与防护
XSS 攻击
攻击方式:攻击者在页面注入恶意脚本,窃取用户的 JWT。
防护措施:
- 使用 HttpOnly Cookie 存储 JWT
- 实施 CSP(内容安全策略)
- 对用户输入进行转义和验证
CSRF 攻击
攻击方式:攻击者诱骗用户在已认证的会话中执行操作。
防护措施:
- 使用 CSRF Token
- 验证 Referer 头
- 实施 SameSite Cookie 策略
重放攻击
攻击方式:攻击者截获有效的令牌并重复使用。
防护措施:
- 使用时间戳和随机数
- 设置令牌过期时间
- 实施令牌黑名单
中间人攻击
攻击方式:攻击者拦截并修改通信内容。
防护措施:
- 强制使用 HTTPS
- 验证证书
- 使用 HSTS
最佳实践
JWT 最佳实践
- 使用强密钥:至少 256 位
- 设置过期时间:根据安全需求设置
- 验证所有声明:包括 iss、exp、aud 等
- 使用安全的算法:推荐 RS256
- 实施刷新机制:平衡安全性和用户体验
OAuth 2.0 最佳实践
- 使用授权码模式:最安全的模式
- 实施 PKCE:增强安全性
- 验证状态参数:防止 CSRF
- 限制权限范围:最小权限原则
- 安全存储令牌:使用加密存储
总结
JWT 和 OAuth 2.0 各有优势,选择哪种方案取决于应用需求。JWT 适合无状态的 API 认证,OAuth 2.0 适合第三方登录和授权。理解两种方案的特点和最佳实践,有助于我们构建安全可靠的认证授权系统。
