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 授权码模式核心流程
授权码模式包含四个关键角色和六步交互:
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 语言测试方法。
• 授权码重用(Replay Attack)
• CSRF 攻击(state 参数缺失或弱随机)
• redirect_uri 开放重定向
• 令牌泄露到浏览器日志或 Referer 头
本课程后续章节将逐一演示这些漏洞的 Go 语言测试方法。