1. OAuth2.0 基础概念

1.1 OAuth2.0 是什么

OAuth2.0 是一个授权框架,它允许第三方应用在不获取用户密码的前提下,获得对用户资源(如照片、联系人、API 数据)的有限访问权限。该框架通过颁发访问令牌(Access Token)代替用户凭证,实现资源访问的委托授权。

核心思想:“用户授权应用 → 应用获取令牌 → 令牌访问资源”。用户始终掌握密码,令牌可设置有效期和权限范围。

1.2 为什么需要 OAuth2.0

在传统 Web 应用中,第三方服务直接使用用户密码访问资源会带来严重的安全隐患:

  • 密码泄露风险:第三方应用存储用户密码,一旦数据库泄露,用户所有关联服务均受影响。
  • 权限不可控:第三方应用获得密码后,拥有用户账户的全部权限,无法限制其只能读取特定数据。
  • 无法撤销:用户无法单独撤销某个应用的访问权限,只能修改密码,导致所有第三方应用同时失效。
  • 审计困难:无法区分操作是由用户本人还是第三方应用执行,安全事件溯源困难。

OAuth2.0 通过引入授权服务器和令牌机制,解决了上述问题:

问题 传统密码共享 OAuth2.0 方案
凭证存储 第三方保存用户密码 第三方仅保存短期令牌
权限粒度 全部权限 可限定 scope(如只读)
撤销方式 修改密码(影响所有应用) 单独撤销令牌或刷新令牌
审计追踪 无法区分操作来源 令牌绑定 client_id,可追溯

1.3 授权码模式与其他模式对比

OAuth2.0 定义了四种授权模式,适用于不同的客户端场景:

模式 适用场景 安全性 是否需要客户端密钥 典型客户端
授权码模式 有后端服务器的 Web 应用 最高(令牌不暴露给浏览器) 是 Go Web 服务、Java 后端
隐式模式(已弃用) 纯前端 SPA(无后端) 低(令牌在 URL 中传递) 否 旧版 JavaScript 应用
密码模式 高度信任的第一方应用 中(需收集用户密码) 是 官方移动 App
客户端凭证模式 服务器到服务器通信 高(无用户参与) 是 微服务间调用
课程聚焦:本课程选择授权码模式作为核心测试对象,因为它是 Web 后端(Go 语言)最常用、安全性最高的授权流程,也是安全测试中最容易出现边界漏洞的场景。

1.4 授权码模式核心流程

授权码模式包含四个关键角色和六步交互:

OAuth2.0 授权码模式核心流程 授权码模式六步交互流程 用户(资源所有者) 浏览器(用户代理) Go Web 应用(客户端) 授权服务器 ① 访问资源 ② 302 重定向(含 client_id, redirect_uri, scope) ③ 用户登录并授权 ④ 302 重定向(含 authorization_code) ⑤ 后端 POST(code + client_secret) ⑥ 返回 access_token + refresh_token 关键安全边界:授权码仅通过后端通道交换,浏览器无法截获 access_token

1.5 授权码模式关键安全特性

  • 授权码(Authorization Code):一次性、短有效期(通常 1-5 分钟),即使被截获也无法直接访问资源。
  • 客户端密钥(Client Secret):仅存储在 Go 后端服务器,浏览器无法获取,防止令牌被第三方窃取。
  • 重定向 URI 校验:授权服务器必须验证 redirect_uri 与注册时一致,防止开放重定向攻击。
  • PKCE 扩展:对于无法安全存储 client_secret 的移动端或 SPA,授权码模式可配合 PKCE 进一步提升安全性。
安全测试要点:授权码模式虽然安全性最高,但在实际实现中常出现以下边界漏洞:
• 授权码重用(Replay Attack)
• CSRF 攻击(state 参数缺失或弱随机)
• redirect_uri 开放重定向
• 令牌泄露到浏览器日志或 Referer 头
本课程后续章节将逐一演示这些漏洞的 Go 语言测试方法。