文章目录
-
- 先说结论
- 为什么会被混淆
- 三种典型组合
-
- 组合1:OAuth + 不透明 Token(传统)
- 组合2:OAuth + JWT Token(主流)
- 组合3:纯 JWT(不经过 OAuth)
- 什么时候用 OAuth,什么时候用 JWT
- JWT 的三大问题及解决
- 回答技巧与点评
-
- 加分回答
- 面试官点评
个人网站
前面分别讲了 OAuth 和 JWT,但面试时它们经常被放一起问——"你们系统用的 OAuth 还是 JWT?"这问题本身就有问题,因为 OAuth 和 JWT 根本不是同一层面的东西。面试官问这题,他想听的是:你能不能讲清两者的本质区别、它们怎么配合使用、以及什么时候用哪个?
先说结论
| 本质 | 授权协议 | Token 格式 |
| 解决什么 | 怎么获取授权 | 怎么传递信息 |
| 关系 | OAuth 可以用 JWT 作为 Token 格式 |
|一句话记住:OAuth是"怎么拿到通行证"的流程,JWT是"通行证长什么样"的格式——两个完全不同层面的问题"
为什么会被混淆
因为很多系统的认证流程是这样的:
1. 用户登录 → OAuth 授权码模式
2. 授权服务器返回 Access Token(JWT 格式)
3. 后续请求带 JWT Token 访问资源
看起来像是"用 JWT 做认证",但实际上是"用 OAuth 获取了一个 JWT 格式的 Token"。OAuth 是流程,JWT 是结果格式。
三种典型组合
组合1:OAuth + 不透明 Token(传统)
1. 用户登录 → OAuth 授权流程
2. 授权服务器返回不透明Token:a3f8b2c1d4e5 👈 随机字符串
3. 资源服务器收到Token → 调授权服务器验证
4. 授权服务器查数据库 → 返回用户信息
优点:可以随时吊销 Token(删数据库记录)。缺点:每次请求都要调授权服务器验证,性能差。
组合2:OAuth + JWT Token(主流)
1. 用户登录 → OAuth 授权流程
2. 授权服务器返回JWT Token:eyJhbGciOiJIUzI1NiJ9… 👈 自包含
3. 资源服务器收到JWT → 本地验证签名 → 直接获取用户信息
4. 不需要调授权服务器 👈
优点:资源服务器可以独立验证 Token,不需要每次调授权服务器。缺点:JWT 一旦签发无法吊销(直到过期)。
组合3:纯 JWT(不经过 OAuth)
1. 用户登录 → 用户名密码验证
2. 服务器生成JWT Token 返回
3. 后续请求带JWT → 服务器验证签名 👈
这是最简单的方案,但不是 OAuth——没有授权流程,只是"用 JWT 做身份认证"。
什么时候用 OAuth,什么时候用 JWT
| 第三方登录 | OAuth + JWT | 需要授权流程,JWT 做令牌 |
| 自家系统登录 | 纯 JWT | 不需要授权流程 |
| 微服务间认证 | JWT | 无需用户参与 |
| 开放 API | OAuth 2.0 | 需要授权和计费 |
| SSO 单点登录 | OAuth + JWT | 统一认证 + JWT 传递身份 |
判断标准:需要"授权"(让第三方访问资源)用 OAuth,只需要"认证"(验证身份)用 JWT。
JWT 的三大问题及解决
问题1:无法吊销
// JWT 一旦签发,在过期之前一直有效
// 解决方案1:短有效期 + Refresh Token
AccessToken 有效期 = 15分钟
RefreshToken 有效期 = 7天 👈
// 解决方案2:黑名单(Redis)
if (redis.exists("blacklist:" + token)) {
throw new UnauthorizedException(); // 👈 虽然JWT没过期,但被拉黑了
}
问题2:信息可能过时
// JWT 中的角色信息在签发时就固定了
// 用户角色从 ADMIN 改为 USER → 但 JWT 中还是 ADMIN
// 解决方案:关键操作实时查库,不完全依赖 JWT
问题3:体积大
// JWT = Header + Payload + Signature
// Payload 可以很大(如果塞太多信息)
// 解决方案:Payload 只存必要信息(userId, role),详细信息按需查
OAuth + JWT 全景
本质区别
├── OAuth —— 协议(怎么授权)
├── JWT —— 格式(令牌长什么样)
└── 关系 —— OAuth可以用JWT作为Token格式
三种组合
├── OAuth + 不透明Token —— 可吊销,但需远程验证
├── OAuth + JWT Token —— 主流,可本地验证
└── 纯JWT —— 最简单,不需要授权流程
JWT三大问题
├── 无法吊销 → 短有效期 + RefreshToken + 黑名单
├── 信息过时 → 关键操作查库
└── 体积大 → 只存必要信息
选型
├── 需要授权 → OAuth
├── 只需认证 → JWT
└── 微服务 → JWT传递身份
口诀:OAuth管授权流程,JWT管令牌格式;
协议格式不同层,组合使用最常见;
第三方登录用OAuth,自家系统纯JWT;
JWT自包含验证快,但要注意吊销和过时
回答技巧与点评
标准回答:OAuth 2.0 是授权协议,定义了怎么获取访问令牌;JWT 是令牌格式,定义了令牌里存什么信息。两者不在同一层面——OAuth 可以用 JWT 作为 Access Token 的格式。主流组合是 OAuth + JWT:OAuth 处理授权流程,JWT 作为 Token 格式让资源服务器可以本地验证。只需认证(自家系统)用纯 JWT,需要授权(第三方访问)用 OAuth。JWT 的三大问题是无法吊销、信息可能过时、体积大,分别通过短有效期+黑名单、关键操作查库、精简 Payload 解决。
加分回答
面试官点评
这道题考的是你对 认证授权体系 的系统理解。最忌讳的回答是"我们用 JWT 做认证"——面试官想听的是 OAuth 和 JWT 的关系(协议 vs 格式)和 组合使用的方案。能讲清三种组合的适用场景,再说出 JWT 的三大问题和解决方案,就是高分回答。
原文阅读
内容有帮助?点赞、收藏、关注三连!评论区等你 💪