欢迎光临
我们一直在努力

孤舟笔记 分布式与微服务篇二十五 OAuth和JWT到底是什么关系?面试总被一起问,一篇理清

文章目录

    • 先说结论
    • 为什么会被混淆
    • 三种典型组合
      • 组合1:OAuth + 不透明 Token(传统)
      • 组合2:OAuth + JWT Token(主流)
      • 组合3:纯 JWT(不经过 OAuth)
    • 什么时候用 OAuth,什么时候用 JWT
    • JWT 的三大问题及解决
    • 回答技巧与点评
      • 加分回答
      • 面试官点评

个人网站

前面分别讲了 OAuth 和 JWT,但面试时它们经常被放一起问——"你们系统用的 OAuth 还是 JWT?"这问题本身就有问题,因为 OAuth 和 JWT 根本不是同一层面的东西。面试官问这题,他想听的是:你能不能讲清两者的本质区别、它们怎么配合使用、以及什么时候用哪个?

先说结论

维度OAuth 2.0JWT
本质 授权协议 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 解决。

加分回答

  • Spring Security 的认证流程:Spring Security 默认用 Session 做认证,但可以配置 JWT Filter 替代。OAuth2 Client 配合 Spring Authorization Server 可以实现完整的 OAuth + JWT 流程
  • Token Introspection:OAuth 2.0 定义了 Token 内省端点(RFC 7662),资源服务器可以把不透明 Token 发给授权服务器验证。JWT 格式的 Token 可以本地验证,也可以通过内省端点验证(如需要检查黑名单时)
  • DPoP 和 MTLS:OAuth 2.0 的增强安全方案:DPoP(Demonstration of Proof-of-Possession)让 Token 绑定到特定客户端的密钥对,防止 Token 被盗用;MTLS 要求客户端使用证书认证,安全性更高
  • 面试官点评

    这道题考的是你对 认证授权体系 的系统理解。最忌讳的回答是"我们用 JWT 做认证"——面试官想听的是 OAuth 和 JWT 的关系(协议 vs 格式)和 组合使用的方案。能讲清三种组合的适用场景,再说出 JWT 的三大问题和解决方案,就是高分回答。

    原文阅读


    内容有帮助?点赞、收藏、关注三连!评论区等你 💪

    赞(0)
    未经允许不得转载:171主机测评 » 孤舟笔记 分布式与微服务篇二十五 OAuth和JWT到底是什么关系?面试总被一起问,一篇理清
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址