2. 授权码流程核心角色:资源所有者、客户端、授权服务器、资源服务器角色定义与交互
OAuth 2.0 授权码流程(Authorization Code Flow)是 Web 应用中最安全、最常用的授权模式。该流程涉及四个核心角色,它们各自承担明确的职责,并通过标准化的 HTTP 交互完成授权与令牌发放。理解这四个角色的定义及其交互关系,是进行授权测试与安全边界验证的基础。
2.1 四角色定义与职责对比
下表从角色身份、核心职责、安全关注点三个维度,对四个核心角色进行对比:
| 角色 | 身份描述 | 核心职责 | 安全关注点 |
|---|---|---|---|
| 资源所有者 | 拥有受保护资源的用户(如:用户本人) | 授权客户端访问其资源;提供身份凭证(如用户名/密码) | 凭证泄露、钓鱼攻击、授权范围过度 |
| 客户端 | 请求访问资源的第三方应用(如:Web 前端、移动 App) | 引导用户授权;接收授权码;换取访问令牌;携带令牌访问资源 | Client Secret 泄露、回调 URL 劫持、CSRF 攻击 |
| 授权服务器 | 负责认证用户并发放令牌的中心服务(如:Auth0、Keycloak) | 验证用户身份;发放授权码与访问令牌;管理令牌生命周期 | 授权码窃取、令牌伪造、重放攻击、Scope 绕过 |
| 资源服务器 | 托管受保护资源的 API 服务(如:RESTful API) | 验证访问令牌有效性;根据 Scope 返回对应资源 | 令牌验证缺失、Scope 越权、令牌过期处理不当 |
测试视角提示: 在安全测试中,授权服务器和资源服务器往往是攻击者重点分析的目标。客户端(尤其是 Web 前端)的 Client Secret 和回调 URL 配置是常见漏洞入口。
2.2 角色交互流程(标准授权码模式)
授权码流程的交互分为六个关键步骤,每一步都涉及角色间的 HTTP 重定向或 API 调用。下图展示了完整的交互序列:
2.3 角色间通信协议与数据流
四个角色之间的通信全部基于 HTTP/HTTPS 协议,主要使用以下两种交互模式:
- 前端通道(Front Channel): 通过浏览器重定向传递数据,主要用于授权码的发放。数据暴露在 URL 中,因此授权码必须是一次性且短时效的。
- 后端通道(Back Channel): 客户端与授权服务器、资源服务器之间的直接 HTTP 请求,用于令牌交换和资源访问。此通道要求使用 HTTPS 加密,并验证 Client Secret。
安全测试要点: 前端通道中的授权码可能通过 Referer 头、浏览器历史记录或日志泄露。后端通道中,Client Secret 的存储安全与令牌的签名验证是测试重点。
2.4 角色交互的边界验证场景
在授权码流程中,每个角色之间的交互边界都存在潜在的安全风险。下表列出了常见的边界验证场景:
| 交互边界 | 验证场景 | 预期安全行为 |
|---|---|---|
| 客户端 → 授权服务器 | 回调 URL 篡改、State 参数缺失或重放 | 授权服务器验证回调 URL 白名单;校验 State 值防止 CSRF |
| 授权服务器 → 客户端 | 授权码泄露、授权码重复使用 | 授权码一次性使用;短有效期(通常 10 分钟内) |
| 客户端 → 资源服务器 | 令牌伪造、令牌 Scope 越权 | 资源服务器验证令牌签名、有效期和 Scope 范围 |
| 资源所有者 → 授权服务器 | 凭证暴力破解、Session 劫持 | 实施多因素认证;限制登录尝试次数 |
2.5 角色交互的时序与状态管理
授权码流程中,每个角色都需要维护特定的状态信息,以确保交互的正确性与安全性。下图展示了各角色在流程中的状态变化:
常见测试陷阱: 许多实现中,客户端未正确验证授权服务器返回的 State 值,导致 CSRF 攻击。测试时应重点检查 State 参数的生成、传递和验证逻辑是否完整。
2.6 角色交互的典型攻击面
基于上述角色定义与交互流程,以下是安全测试中需要重点关注的攻击面:
- 授权码拦截: 攻击者通过钓鱼或中间人攻击获取授权码,然后冒充客户端换取令牌。
- Client Secret 泄露: 客户端(尤其是原生应用或单页应用)硬编码的 Secret 被提取,攻击者可伪造客户端身份。
- 回调 URL 开放重定向: 授权服务器未严格校验回调 URL,攻击者可构造恶意 URL 窃取授权码。
- 令牌 Scope 提升: 攻击者通过修改请求参数,获取超出授权范围的令牌权限。
- 令牌重放: 资源服务器未验证令牌的唯一性,允许同一令牌多次使用。