JWT 与 OAuth 2.0 有何不同?

Posted

技术标签:

【中文标题】JWT 与 OAuth 2.0 有何不同?【英文标题】:How JWT is different from OAuth 2.0? 【发布时间】:2019-04-22 11:59:24 【问题描述】:

我使用 Sprint Boot、Spring 安全性和 JWT 完成了一个示例应用程序,并定义了我的自定义身份验证和授权过滤器。在执行基本身份验证(传递用户名和密码)时,我得到格式为 xxxx.yyyy.zzzz 的 JWT 令牌,其中 xxxx 是标头,yyyy 是有效负载,zzzz 是签名,每个部分都使用 Base64URL 编码器进行编码。我不明白 JWT 与 OAuth 2.0 有何不同。在 OAuth 2.0 中,我们可以传递 2 种类型的 grant_types 作为“用户名”或“客户端凭据”,还需要传递客户端 ID、机密 ID 以获取访问权和刷新令牌。

请协助澄清我的以下疑虑:- 1) JWT 是否比 OAuth 2.0 更轻,因为它不包含刷新令牌而仅包含访问令牌? 2) JWT 是否不能用于制作独立的授权服务器,就像我们可以在 OAuth 2.0 中使用 @EnableAuthorizationServer 注释制作独立的授权服务器一样。我的假设正确吗? 3) JWT 不接受客户端 ID/秘密客户端,而只是用作获取不记名令牌的基本身份验证? 4)OAuth2.0和JWT的access token(或bearer)格式是否不同?

我看到了一个同时使用 OAuth 2.0 和 JWT 的示例。 OAuth 2.0 是做授权服务器,最终只返回 JWT 令牌,但不明白如果 OAuth2.0 可以自己返回令牌,为什么要使用 JWT。

谢谢

【问题讨论】:

【参考方案1】:

JWT 是在 RFC 7519 中定义的基于 JSON 的令牌。 OAuth 2.0 是在RFC 6749 中定义的授权框架。比较两者就像在问“葡萄糖与苹果派有何不同?”。

但是,可以将 OAuth 2.0 和 JWT 结合在一起,如 RFC 7523 - OAuth 2.0 客户端身份验证和授权授予的 JSON Web 令牌 (JWT) 配置文件中定义的那样。它标准化了如何在 OAuth 2.0 框架中使用 JWT 作为不记名令牌,这实现了我所说的stateless authentication。

关于您的问题:

    您是否使用 JWT 作为不记名令牌不会影响您是否要分发刷新令牌。 不确定我是否收到您的问题。但是,使用 JWT 可以让您进行分散的、无状态的身份验证决策,因为没有必要集中存储令牌状态。但是,没有人阻止您拥有独立的授权服务器。 您想如何进行身份验证与 JWT 无关。它仍然是 OAuth 2.0。 在 OAuth 2.0 中,不记名令牌被视为不透明令牌 - 格式无关紧要。如果您使用 JWT 作为不记名令牌,则需要遵循相应的 RFC。

【讨论】:

以上是关于JWT 与 OAuth 2.0 有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

REST API 的安全认证,从 OAuth 2.0 到 JWT 令牌

OAuth 2.0 与 JWT

OAuth 2.0 两腿身份验证与 SSL/TLS

OAuth 2.0 范围参数与 OAuth 2.0 JWT access_token 范围声明

Spring boot 2.0 整合 oauth2 SSO

使用 JWT 的 Oauth 2.0 授权