OAuth2 和 JWT 的关系和区别?

115 阅读3分钟

这两个经常一起出现的技术概念之间的关系与区别,这是学习身份认证和授权时的核心问题。

一、核心定义:先分清“是什么”

1. OAuth2(OAuth 2.0)

OAuth2 是一种授权框架/协议,它定义了一套完整的流程和规则,解决的核心问题是:第三方应用如何在不获取用户账号密码的前提下,安全地获取用户在某个服务上的资源访问权限

  • 比如:你用微信登录第三方App、用GitHub登录Gitee,背后都是OAuth2的授权逻辑。
  • 它关注的是“授权流程”,规定了角色(资源所有者、客户端、授权服务器、资源服务器)、授权模式(授权码、密码、客户端凭证、隐式授权)等。

2. JWT(JSON Web Token)

JWT 是一种轻量级的令牌格式,本质是一段经过加密/签名的JSON字符串,用来在各方之间安全地传递信息。

  • 它关注的是“数据载体”,可以把用户身份、权限等信息编码在令牌里,支持签名(保证不被篡改)、加密(保证内容不被泄露)。
  • 结构:Header(算法+类型) + Payload(核心数据) + Signature(签名),用.分隔。

二、关系:不是对立,是“搭档”

OAuth2 和 JWT 并非替代关系,而是互补关系——JWT 常被用作 OAuth2 协议中的“令牌载体”:

  1. OAuth2 流程中,授权服务器验证通过后,会向客户端颁发“令牌”(Access Token),这个令牌可以用 JWT 格式来生成和传输
  2. 资源服务器接收到令牌后,可直接解析 JWT 中的用户信息、权限范围,无需每次都向授权服务器校验(因为 JWT 有签名,能保证完整性),提升效率;
  3. 但 OAuth2 不强制使用 JWT:Access Token 也可以是随机字符串(比如UUID),此时资源服务器需要调用授权服务器的接口校验令牌有效性。

三、区别:核心维度对比

维度OAuth2JWT
本质授权协议/框架(流程规则)令牌格式/数据载体(字符串)
核心目的解决“授权”问题(谁能访问什么)解决“安全传递信息”问题
作用范围定义端到端的授权流程和角色分工仅负责令牌的生成、解析、验证
是否可独立使用可以(搭配任意令牌格式)可以(单独用于身份认证)
关注点流程安全、权限管控数据完整性、轻量化传输

四、实际应用示例

场景:用 OAuth2 + JWT 实现第三方登录

  1. 用户在第三方App点击“微信登录”,App跳转微信授权页(OAuth2 授权流程);
  2. 用户同意授权后,微信授权服务器生成 JWT 格式的 Access Token(包含用户openid、权限范围等),返回给第三方App;
  3. 第三方App携带该 JWT 令牌调用微信资源服务器接口(如获取用户昵称);
  4. 微信资源服务器解析 JWT 签名(验证未被篡改),直接从 Payload 中读取用户信息,无需回查授权服务器,快速返回数据。

总结

  1. 核心区别:OAuth2 是“授权规则”,JWT 是“令牌格式”;前者管“流程”,后者管“数据载体”;
  2. 核心关系:JWT 是 OAuth2 最常用的令牌实现方式,能让 OAuth2 流程更高效;
  3. 关键提醒:JWT 可脱离 OAuth2 单独用于单点登录(SSO),OAuth2 也可搭配普通字符串令牌使用。