乐闻世界logo
搜索文章和话题

JWT 和 OAuth2.0 有什么区别

2026年2月21日 17:53

JWT 和 OAuth2.0 是两个不同的概念,经常被混淆。以下是它们的区别和关系:

JWT (JSON Web Token)

定义

JWT 是一种令牌格式标准(RFC 7519),定义了一种紧凑且自包含的方式,用于在各方之间以 JSON 对象的形式安全地传输信息。

特点

  • 格式标准: 定义了 token 的结构和编码方式
  • 自包含: 包含所有必要信息,无需查询数据库
  • 无状态: 服务器不需要存储会话信息
  • 跨语言: 多种编程语言都有实现

用途

  • 身份验证
  • 信息交换
  • 单点登录(SSO)

示例

shell
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

OAuth2.0

定义

OAuth2.0 是一个授权框架(RFC 6749),定义了授权流程和规范,允许用户授权第三方应用访问其在另一个服务上的资源,而无需共享密码。

特点

  • 授权框架: 定义了授权流程和角色
  • 委托授权: 用户授权第三方应用访问资源
  • 令牌机制: 使用 Access Token 访问资源
  • 多种授权模式: 支持授权码、隐式、密码、客户端凭证等模式

角色

  • Resource Owner: 资源所有者(用户)
  • Client: 第三方应用
  • Authorization Server: 授权服务器
  • Resource Server: 资源服务器

授权模式

  1. Authorization Code: 最安全,推荐用于有后端的应用
  2. Implicit: 简单但不安全,用于纯前端应用
  3. Resource Owner Password Credentials: 用户名密码,信任的应用
  4. Client Credentials: 服务对服务,不需要用户参与

示例流程

shell
用户 → 第三方应用 → 授权服务器 → 资源服务器

JWT 与 OAuth2.0 的关系

关键点

JWT 是一种令牌格式,OAuth2.0 是一个授权框架

它们可以结合使用

  • OAuth2.0 可以使用 JWT 作为 Access Token 的格式
  • OAuth2.0 的授权流程可以返回 JWT 格式的 token
  • JWT 可以携带 OAuth2.0 的声明信息

示例: OAuth2.0 使用 JWT

javascript
// OAuth2.0 授权流程 // 1. 用户授权 GET /authorize? response_type=code& client_id=CLIENT_ID& redirect_uri=REDIRECT_URI& scope=read%20write // 2. 获取 Access Token (JWT 格式) POST /token { "grant_type": "authorization_code", "code": "AUTHORIZATION_CODE", "client_id": "CLIENT_ID", "client_secret": "CLIENT_SECRET" } // 响应 (JWT 格式的 Access Token) { "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "REFRESH_TOKEN" } // 3. 使用 JWT Access Token 访问资源 GET /api/resource Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...

对比总结

特性JWTOAuth2.0
类型令牌格式标准授权框架
目的安全传输信息授权第三方访问资源
状态无状态可以有状态
存储客户端存储服务器可存储
撤销困难较容易
标准化RFC 7519RFC 6749
独立性可独立使用需要配合使用

实际应用场景

1. 使用 JWT 的场景

javascript
// 简单的身份验证 const token = jwt.sign({ userId: '123' }, SECRET_KEY); // 验证 const decoded = jwt.verify(token, SECRET_KEY);

2. 使用 OAuth2.0 的场景

javascript
// 第三方登录(如 Google、GitHub) app.get('/auth/google', passport.authenticate('google')); app.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/login' }), (req, res) => { res.redirect('/'); } );

3. 结合使用 JWT 和 OAuth2.0

javascript
// OAuth2.0 授权服务器签发 JWT app.post('/oauth/token', (req, res) => { const { grant_type, code } = req.body; // 验证授权码 const authCode = await validateAuthCode(code); // 生成 JWT 格式的 Access Token const accessToken = jwt.sign({ sub: authCode.userId, scope: authCode.scope, client_id: authCode.clientId }, PRIVATE_KEY, { algorithm: 'RS256', expiresIn: '1h' }); res.json({ access_token: accessToken, token_type: 'Bearer', expires_in: 3600 }); }); // 资源服务器验证 JWT app.get('/api/resource', async (req, res) => { const token = req.headers['authorization']?.replace('Bearer ', ''); try { const decoded = jwt.verify(token, PUBLIC_KEY, { algorithms: ['RS256'], issuer: 'https://auth.example.com' }); // 检查 scope if (!decoded.scope.includes('read')) { return res.status(403).json({ error: 'Insufficient scope' }); } res.json({ data: 'protected resource' }); } catch (error) { res.status(401).json({ error: 'Invalid token' }); } });

选择建议

选择 JWT 的情况

  • 简单的身份验证需求
  • 内部系统通信
  • 不需要复杂的授权流程
  • 单点登录(SSO)

选择 OAuth2.0 的情况

  • 需要第三方授权
  • 用户需要控制权限
  • 需要多种授权模式
  • 企业级应用

结合使用的情况

  • 需要 OAuth2.0 的授权流程
  • 需要 JWT 的自包含特性
  • 需要跨服务验证 token
  • 需要细粒度的权限控制

常见误区

误区 1: JWT 可以替代 OAuth2.0

错误: JWT 是令牌格式,OAuth2.0 是授权框架,它们是不同层面的概念。

误区 2: OAuth2.0 必须使用 JWT

错误: OAuth2.0 可以使用任意格式的 token,不一定是 JWT。

误区 3: JWT 更安全

错误: 安全性取决于实现方式,JWT 和 OAuth2.0 都可以很安全,也可能不安全。

误区 4: OAuth2.0 必须很复杂

错误: OAuth2.0 可以根据需求选择合适的授权模式,不一定复杂。

最佳实践

  1. 理解需求: 明确是需要令牌格式还是授权框架
  2. 选择合适的技术: 根据场景选择 JWT、OAuth2.0 或两者结合
  3. 安全实现: 无论使用哪种技术,都要注意安全
  4. 遵循标准: 遵循 RFC 标准和最佳实践
  5. 测试验证: 充分测试认证和授权流程

通过理解 JWT 和 OAuth2.0 的区别和关系,可以在实际项目中做出正确的技术选择。

标签:JWT