OAuth2协议核心概念:资源所有者、客户端、授权服务器、资源服务器、访问令牌、刷新令牌
说实话,OAuth2这六个核心概念,我当年刚接触时也绕晕过。你想想看,又是资源所有者,又是客户端,还有一堆服务器和令牌,到底谁跟谁打交道?
别急,咱们一个一个拆开讲。我习惯用一个生活场景来理解——你去酒店开房。
- 你就是资源所有者,你拥有自己的身份信息
- 酒店前台就是客户端,它需要验证你的身份
- 公安局系统就是授权服务器,它负责核验身份证真伪
- 酒店房间就是资源服务器,它只认房卡不认人
- 房卡就是访问令牌,拿着它就能开门
- 前台给你的临时凭证就是刷新令牌,房卡过期了可以换新的
嗯,这个比喻虽然简单,但核心逻辑全在里面了。咱们下面细说。
资源所有者(Resource Owner)
资源所有者,说白了就是数据的真正主人。在OAuth2协议里,它通常是一个用户,拥有对某些受保护资源的访问权限。
我在项目中遇到过一种情况:很多新手以为资源所有者就是"用户"两个字就完了。其实不然。资源所有者可以是人,也可以是系统。比如一个微服务调用另一个微服务的API,那个被调用的服务就是资源所有者。
关键点:资源所有者是授权决策的最终执行者。没有它的同意,谁也拿不到令牌。
客户端(Client)
客户端是代表资源所有者发起请求的应用程序。它可以是Web应用、移动App、桌面软件,甚至是另一个服务。
我习惯把客户端分成两类:
- 机密客户端:能安全保存密钥,比如后端服务
- 公开客户端:无法安全保存密钥,比如浏览器里的JS应用
你想想看,一个纯前端应用把client_secret写在代码里,那跟把密码贴在门上有什么区别?
注意:公开客户端绝对不能使用授权码流程中的client_secret。我曾经见过有人把密钥硬编码到移动App里,结果被反编译后全网公开——那叫一个惨。
授权服务器(Authorization Server)
授权服务器是整个OAuth2体系的核心枢纽。它负责:
- 验证资源所有者的身份
- 获取资源所有者的授权
- 颁发访问令牌和刷新令牌
在Spring Security生态里,授权服务器通常就是Spring Authorization Server。我记得第一次配置时,光client_id和client_secret的存储方式就折腾了半天。后来发现,其实授权服务器最核心的就两件事:认证和授权。
小技巧:授权服务器可以跟资源服务器部署在一起,也可以分开。我建议生产环境分开部署,这样授权服务器挂了不会影响已颁发的令牌使用。
资源服务器(Resource Server)
资源服务器是真正存储和保护用户数据的地方。它不关心你是谁,只关心你拿的令牌是否有效。
资源服务器的工作流程其实很简单:
- 收到请求 → 检查令牌 → 验证权限 → 返回数据
我在项目中遇到过一个问题:资源服务器每次请求都去授权服务器验证令牌,导致授权服务器压力巨大。后来我们引入了本地令牌校验,用JWT格式的令牌,资源服务器自己就能验证签名,完全不需要远程调用。
核心原则:资源服务器只认令牌,不认人。它跟授权服务器之间是松耦合关系。
访问令牌(Access Token)
访问令牌是客户端访问受保护资源的凭证。它通常是一个字符串,有时是JWT格式,有时是透明字符串。
访问令牌有几个关键特性:
| 特性 | 说明 |
|---|---|
| 短期有效 | 通常15分钟到1小时,减少泄露风险 |
| 作用域受限 | 只能访问授权范围内的资源 |
| 不可撤销 | 一旦颁发,在有效期内无法主动失效(除非黑名单) |
你想想看,如果访问令牌有效期设成一个月,那泄露了怎么办?所以OAuth2设计成短期令牌+刷新令牌的组合,既安全又方便。
避坑指南:我曾经见过有人把用户密码直接放在访问令牌里。千万别这么做!令牌里只放必要信息,比如用户ID、作用域、过期时间。敏感信息一律不放。
刷新令牌(Refresh Token)
刷新令牌是用来获取新的访问令牌的凭证。它比访问令牌生命周期长得多,可能几天甚至几个月。
刷新令牌的设计初衷很简单:
- 访问令牌短命 → 安全
- 刷新令牌长命 → 用户体验好
- 两者配合 → 既安全又方便
我习惯把刷新令牌叫做"后悔药"。访问令牌过期了怎么办?拿刷新令牌去换一个新的就行,用户完全无感知。
重要提醒:刷新令牌必须安全存储。如果刷新令牌泄露,攻击者可以持续获取新的访问令牌。在Spring Security中,刷新令牌默认是存储在授权服务器端的,客户端只保存一个引用。
六个概念的关系图
咱们用文字描述一下它们之间的交互流程:
- 资源所有者告诉客户端:我想访问我的数据
- 客户端把资源所有者引导到授权服务器
- 资源所有者在授权服务器上登录并授权
- 授权服务器给客户端一个授权码
- 客户端用授权码去授权服务器换访问令牌和刷新令牌
- 客户端拿着访问令牌去资源服务器拿数据
- 访问令牌过期后,客户端用刷新令牌换新的
嗯,这个流程你多看几遍,OAuth2的核心就全在这里了。我在项目中调试过无数次这个流程,每次出问题基本都是某个环节的配置没对上。
个人经验:刚开始学OAuth2时,我建议你先把这六个概念画成一张图,贴在工位上。每次遇到问题就往这张图上套,很快就能找到问题出在哪个环节。
好了,这一章的内容就到这里。下一章咱们会深入讲授权码模式,这是OAuth2最常用也最安全的授权方式。到时候我会带着你一步步实现一个完整的授权码流程。