Skip to content

认证和授权背景研究

项目概述

认证和授权是应用安全的核心组成部分。本课程将深入探讨 JWT 和 OAuth 2.0 两种主流的认证授权方案。

认证与授权

认证 (Authentication)

认证是验证用户身份的过程,回答"你是谁"的问题。常见的认证方式包括:

  • 用户名密码:最传统的认证方式
  • 令牌认证:使用令牌代替密码
  • 生物识别:指纹、面部识别等
  • 多因素认证:结合多种认证方式

授权 (Authorization)

授权是验证用户权限的过程,回答"你能做什么"的问题。常见的授权方式包括:

  • 基于角色的访问控制(RBAC):根据角色分配权限
  • 基于属性的访问控制(ABAC):根据属性动态授权
  • 基于资源的访问控制:控制对特定资源的访问

JWT 简介

什么是 JWT

JWT (JSON Web Token) 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。JWT 由三部分组成:

  1. Header(头部):描述令牌的元数据
  2. Payload(载荷):包含实际的数据
  3. Signature(签名):用于验证令牌的完整性

JWT 结构

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
└─────────────────────────────────────────────────────────────────────┘
                           Header                              Payload                              Signature

JWT 优势

  1. 无状态:不需要在服务器存储会话
  2. 跨域支持:适合分布式系统
  3. 性能好:减少数据库查询
  4. 标准化:遵循开放标准
  5. 自包含:包含所有必要信息

JWT 劣势

  1. 令牌无法撤销:一旦签发,直到过期
  2. 载荷大小限制:不适合存储大量数据
  3. 安全性依赖密钥:密钥泄露会导致安全问题
  4. 刷新机制复杂:需要实现令牌刷新

JWT 使用场景

JWT 特别适合以下场景:

  1. RESTful API:无状态的 API 认证
  2. 单页应用(SPA):前后端分离
  3. 移动应用:跨平台认证
  4. 微服务:服务间认证
  5. 第三方集成:API 授权

OAuth 2.0 简介

什么是 OAuth 2.0

OAuth 2.0 是一个授权框架,允许用户授权第三方应用访问其资源,而无需共享密码。OAuth 2.0 定义了四种授权模式:

  1. 授权码模式:最安全的模式,适用于有后端的应用
  2. 简化模式:适用于纯前端应用
  3. 密码模式:适用于高度信任的应用
  4. 客户端凭证模式:适用于服务间认证

OAuth 2.0 角色

OAuth 2.0 定义了四种角色:

  1. 资源拥有者:拥有资源的用户
  2. 客户端:请求访问资源的应用
  3. 授权服务器:颁发访问令牌的服务器
  4. 资源服务器:托管受保护资源的服务器

OAuth 2.0 流程

授权码模式

┌─────────┐       ┌─────────────┐       ┌──────────────┐       ┌──────────┐
│  用户   │──────▶│   客户端   │──────▶│  授权服务器  │──────▶│  资源   │
└─────────┘       └─────────────┘       └──────────────┘       └──────────┘
     │                   │                       │                   │
     │  1. 授权请求      │  2. 授权码          │  4. 访问令牌
     │◀──────────────────│◀──────────────────────│◀─────────────────│
     │                   │                       │                   │
     │  3. 交换令牌      │  5. 访问资源          │
     │──────────────────▶│──────────────────────▶│                   │

OAuth 2.0 优势

  1. 安全性:用户不需要共享密码
  2. 标准化:遵循开放标准
  3. 灵活性:支持多种授权模式
  4. 可扩展:支持自定义权限
  5. 广泛支持:主流服务都支持

OAuth 2.0 劣势

  1. 复杂性:实现相对复杂
  2. 依赖第三方:依赖授权服务器的可用性
  3. 令牌管理:需要处理令牌刷新
  4. 安全风险:需要正确实现安全措施

OAuth 2.0 使用场景

OAuth 2.0 特别适合以下场景:

  1. 第三方登录:使用微信、QQ、GitHub 等登录
  2. API 授权:允许第三方应用访问用户数据
  3. 微服务认证:服务间授权
  4. 移动应用:安全的第三方集成
  5. 企业应用:单点登录(SSO)

安全考虑

JWT 安全

  1. 密钥管理:使用强密钥,定期更换
  2. 令牌过期:设置合理的过期时间
  3. HTTPS 传输:防止令牌被窃取
  4. 载荷验证:验证所有必要的声明
  5. 算法选择:使用安全的签名算法

OAuth 2.0 安全

  1. 状态参数:防止 CSRF 攻击
  2. PKCE:增强授权码模式的安全性
  3. 令牌存储:安全存储访问令牌
  4. 重定向验证:验证重定向 URI
  5. 权限最小化:只请求必要的权限

常见攻击与防护

XSS 攻击

攻击方式:攻击者在页面注入恶意脚本,窃取用户的 JWT。

防护措施

  • 使用 HttpOnly Cookie 存储 JWT
  • 实施 CSP(内容安全策略)
  • 对用户输入进行转义和验证

CSRF 攻击

攻击方式:攻击者诱骗用户在已认证的会话中执行操作。

防护措施

  • 使用 CSRF Token
  • 验证 Referer 头
  • 实施 SameSite Cookie 策略

重放攻击

攻击方式:攻击者截获有效的令牌并重复使用。

防护措施

  • 使用时间戳和随机数
  • 设置令牌过期时间
  • 实施令牌黑名单

中间人攻击

攻击方式:攻击者拦截并修改通信内容。

防护措施

  • 强制使用 HTTPS
  • 验证证书
  • 使用 HSTS

最佳实践

JWT 最佳实践

  1. 使用强密钥:至少 256 位
  2. 设置过期时间:根据安全需求设置
  3. 验证所有声明:包括 iss、exp、aud 等
  4. 使用安全的算法:推荐 RS256
  5. 实施刷新机制:平衡安全性和用户体验

OAuth 2.0 最佳实践

  1. 使用授权码模式:最安全的模式
  2. 实施 PKCE:增强安全性
  3. 验证状态参数:防止 CSRF
  4. 限制权限范围:最小权限原则
  5. 安全存储令牌:使用加密存储

总结

JWT 和 OAuth 2.0 各有优势,选择哪种方案取决于应用需求。JWT 适合无状态的 API 认证,OAuth 2.0 适合第三方登录和授权。理解两种方案的特点和最佳实践,有助于我们构建安全可靠的认证授权系统。