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 调用。下图展示了完整的交互序列:

OAuth 2.0 授权码流程角色交互图 授权码流程角色交互序列 资源所有者 客户端 授权服务器 资源服务器 ① 访问应用 ② 授权请求 ③ 用户认证 & 授权 ④ 返回授权码 ⑤ 授权码换令牌 ⑥ 携带令牌访问资源 ⑦ 返回受保护资源 交互要点说明: • 步骤①-②:用户通过客户端发起授权请求,客户端将用户重定向至授权服务器。 • 步骤③-④:用户在授权服务器上完成认证并授权,授权服务器通过回调 URL 返回授权码。 • 步骤⑤-⑦:客户端使用授权码向授权服务器换取访问令牌,再携带令牌访问资源服务器。 • 授权码是一次性、短时效的凭证,令牌通常有有效期和 Scope 限制。

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) • 存储授权码(临时) • 管理访问令牌(缓存) • 记录 Scope 范围 授权服务器状态 • 授权码与客户端绑定 • 授权码有效期计时 • 令牌与 Scope 映射 • 刷新令牌(可选) 资源服务器状态 • 令牌公钥/密钥缓存 • 令牌黑名单(撤销) • Scope 权限映射 • 资源访问审计日志 状态管理安全建议: • 客户端:State 值必须是高熵随机字符串,每次授权请求独立生成。 • 授权服务器:授权码必须与客户端 ID 和重定向 URI 绑定,防止授权码劫持。 • 资源服务器:令牌验证应使用缓存公钥,避免每次请求都请求授权服务器。 • 所有角色:令牌和授权码的存储必须使用安全存储机制(如内存、加密数据库)。
常见测试陷阱: 许多实现中,客户端未正确验证授权服务器返回的 State 值,导致 CSRF 攻击。测试时应重点检查 State 参数的生成、传递和验证逻辑是否完整。

2.6 角色交互的典型攻击面

基于上述角色定义与交互流程,以下是安全测试中需要重点关注的攻击面:

  1. 授权码拦截: 攻击者通过钓鱼或中间人攻击获取授权码,然后冒充客户端换取令牌。
  2. Client Secret 泄露: 客户端(尤其是原生应用或单页应用)硬编码的 Secret 被提取,攻击者可伪造客户端身份。
  3. 回调 URL 开放重定向: 授权服务器未严格校验回调 URL,攻击者可构造恶意 URL 窃取授权码。
  4. 令牌 Scope 提升: 攻击者通过修改请求参数,获取超出授权范围的令牌权限。
  5. 令牌重放: 资源服务器未验证令牌的唯一性,允许同一令牌多次使用。