ChatGPT解决这个技术问题 Extra ChatGPT

JWT 和 OAuth 身份验证之间的主要区别是什么?

我有一个使用 JWT 的无状态身份验证模型的新 SPA。我经常被要求将 OAuth 用于身份验证流程,例如要求我为每个请求发送“承载令牌”而不是简单的令牌标头,但我确实认为 OAuth 比简单的基于 JWT 的身份验证复杂得多。主要区别是什么,我应该使 JWT 身份验证的行为类似于 OAuth 吗?

我还使用 JWT 作为我的 XSRF-TOKEN 来防止 XSRF,但我被要求将它们分开?我应该把它们分开吗?此处的任何帮助将不胜感激,并可能为社区提供一套指导方针。


C
Community

TL;DR 如果您有非常简单的场景,例如单个客户端应用程序、单个 API,那么使用 OAuth 2.0 可能没有回报,另一方面,许多不同的客户端(基于浏览器、本机移动、服务器端等)然后坚持 OAuth 2.0 规则可能比尝试推出自己的系统更易于管理。

如另一个答案所述,JWT(Learn JSON Web Tokens)只是一种令牌格式,它定义了一种紧凑且自包含的机制,用于在各方之间以一种可以验证和信任的方式传输数据,因为它是数字签名的。此外,JWT 的编码规则还使这些令牌在 HTTP 上下文中非常易于使用。

作为独立的(实际的令牌包含有关给定主题的信息),它们也是实现无状态身份验证机制的不错选择(又名看妈妈,没有会话!)。当走这条路时,一方必须出示才能被授予访问受保护资源的唯一权限是令牌本身,所讨论的令牌可以称为不记名令牌。

在实践中,您正在做的事情已经可以被归类为基于不记名令牌。但是,请注意您没有使用 OAuth 2.0 相关规范指定的不记名令牌(请参阅 RFC 6750)。这意味着,依赖于 Authorization HTTP 标头并使用 Bearer 身份验证方案。

关于在不知道确切细节的情况下使用 JWT 来防止 CSRF,很难确定这种做法的有效性,但老实说,这似乎并不正确和/或不值得。以下文章 (Cookies vs Tokens: The Definitive Guide) 可能是有关此主题的有用阅读资料,尤其是 XSS 和 XSRF 保护 部分。

最后一条建议,即使您不需要完整的 OAuth 2.0,我强烈建议您在 Authorization 标头中传递您的访问令牌,而不是使用自定义标头。如果它们确实是不记名令牌,请遵循 RFC 6750 的规则。如果不是,您始终可以创建自定义身份验证方案并仍然使用该标头。

授权标头由 HTTP 代理和服务器识别和特殊处理。因此,使用此类标头将访问令牌发送到资源服务器通常会降低经过身份验证的请求的泄漏或意外存储的可能性,尤其是授权标头。

(来源:RFC 6819, section 5.4.1


这是否意味着如果我在移动应用上使用 JWT 身份验证,我不需要在其 POST 请求中包含 CSRF?与带有表单的 Web 界面不同?
Cookie 与令牌:权威指南,即 auth0.com/blog/cookies-vs-tokens-definitive-guide 不起作用 这是另一个很棒的讨论帖子:stackoverflow.com/questions/37582444/…
“它们也是实现无状态身份验证机制的不错选择(又名看妈妈,没有会话!)。”如果您需要一种方法来使令牌无效,因为假设它被泄露或拦截,或者用户只是注销并删除了令牌不够安全,因为令牌仍然有效,然后您需要将它们存储在某个数据库中,所以我认为出于安全目的或简单的令牌黑名单,服务器上必须有一些会话概念。您可能会说为此使用“刷新”令牌。但是刷新令牌也可以被拦截,后果更糟。
@Konrad,我确实实现了一个类似的机制,将未使用的有效令牌存储在一个表中,当它们过期时从那里释放它们。对于每个传入的请求,我编写了代码来交叉检查传入的令牌与“未使用的有效令牌”。尽管它有效,但我总是有疑问 - 应该有更好的方法来处理未使用但仍然有效的令牌。
另一方面,刷新令牌只会使客户端的实现复杂化。因为如果您的访问令牌过期,您需要处理它,如果您只是将他注销而没有任何手动刷新会话的可能性(就像银行那样),用户会很生气。要做的工作稍微多一些,而且使用标准的身份验证方式 (OID) 和授权 (OAuth) 也常常是一种矫枉过正的做法。
p
piet.t

OAuth 2.0 定义了一个协议,即指定令牌如何传输,JWT 定义令牌格式。

OAuth 2.0 和“JWT 身份验证”在客户端向资源服务器提供令牌的(第二)阶段具有相似的外观:令牌在标头中传递。

但是“JWT 身份验证”不是标准,也没有具体说明 Client 首先如何获取令牌(第一阶段)。这就是 OAuth 感知复杂性的来源:它还定义了客户端可以从称为授权服务器的东西获取访问令牌的各种方式。

所以真正的区别在于 JWT 只是一种令牌格式,OAuth 2.0 是一种协议(可能使用 JWT 作为令牌格式)。


在大多数情况下,oAuth 协议实现是否使用 JWT 作为令牌格式?如果不是最常见的是什么?
oauth 中的令牌格式未定义,但 JWT 应该可以正常工作
“不记名令牌是与 OAuth 2.0 一起使用的主要访问令牌类型。不记名令牌是一个不透明的字符串,对使用它的客户端没有任何意义。一些服务器会发出一个十六进制字符短字符串的令牌,而其他可以使用结构化令牌,例如 JSON Web 令牌。” @JamesWierzba (source)
对于一个简单的 api,使用与令牌授予者相同的 api 有什么风险(在用户登录时)?
M
Melikşah Şimşek

首先,我们必须区分 JWT 和 OAuth。基本上,JWT 是一种令牌格式。 OAuth 是一种可以使用 JWT 作为令牌的授权协议。 OAuth 使用服务器端和客户端存储。如果您想进行真正的注销,您必须使用 OAuth2。使用 JWT 令牌进行身份验证实际上无法注销。因为您没有跟踪令牌的身份验证服务器。如果您想向 3rd 方客户端提供 API,则还必须使用 OAuth2。 OAuth2 非常灵活。 JWT 的实现非常简单,不需要很长时间即可实现。如果您的应用程序需要这种灵活性,您应该使用 OAuth2。但是,如果您不需要这个用例场景,那么实施 OAuth2 就是浪费时间。

XSRF 令牌始终在每个响应标头中发送到客户端。 CSRF 令牌是否在 JWT 令牌中发送并不重要,因为 CSRF 令牌本身是安全的。因此在 JWT 中发送 CSRF 令牌是不必要的。


我不明白为什么这个答案有很多赞成票,它说“OAuth 是一个身份验证框架”,这是完全错误的。 OAuth 是一种授权协议,并且只是一种授权协议。
嗨@Michael,对此有太多误解。我编辑了我的评论谢谢。
你们是说 Oauth 只是开发人员应该遵循的一个标准吗?或者它真的是一个框架?
“如果你想真正注销,你必须使用 OAuth2” -- 不正确。例如,Devise-JWT 是一种非 OAuth 解决方案,它通过使令牌无效来提供“注销”功能:github.com/waiting-for-dev/devise-jwt#revocation-strategies
@Michael,这并不完全正确。 RFC 的标题是“OAuth 2.0 授权框架”,所以我想这也会造成一些混乱;)tools.ietf.org/html/rfc6749。我明白你的意思。
M
Machavity

JWT(JSON Web Tokens)——它只是一种令牌格式。 JWT 令牌是 JSON 编码的数据结构,包含有关发行者、主题(声明)、到期时间等信息。它经过签名以防篡改和真实性,并且可以使用对称或非对称方法加密以保护令牌信息。 JWT 比 SAML 1.1/2.0 更简单,所有设备都支持它,它比 SWT(Simple Web Token)更强大。

OAuth2 - OAuth2 解决了用户希望使用客户端软件(如基于浏览的 Web 应用程序、本机移动应用程序或桌面应用程序)访问数据的问题。 OAuth2 仅用于授权,可以授权客户端软件使用访问令牌代表最终用户访问资源。

OpenID Connect - OpenID Connect 建立在 OAuth2 之上并添加身份验证。 OpenID Connect 为 OAuth2 添加了一些约束,例如 UserInfo Endpoint、ID Token、OpenID Connect 提供者的发现和动态注册以及会话管理。 JWT 是令牌的强制格式。

CSRF 保护 - 如果您不在浏览器的 cookie 中存储令牌,则不需要实施 CSRF 保护。


没有 cookie == 没有 CSRF 保护。如果您不使用 cookie 进行授权,那么您不必担心 CSRF 保护。
m
manikawnth

看起来在这里回答的每个人都错过了 OAUTH 的实际意义

来自维基百科

OAuth 是访问授权的开放标准,通常用作互联网用户授予网站或应用程序访问其在其他网站上的信息但不提供密码的一种方式。 [1] Google、Facebook、Microsoft 和 Twitter 等公司使用此机制来允许用户与第三方应用程序或网站共享有关其帐户的信息。

这里的关键点是access delegation。当存在基于 id/pwd 的身份验证时,为什么有人会创建 OAUTH,由像 OTP 之类的多因素身份验证支持,并且可以通过 JWT 进一步保护,这些 JWT 用于保护对路径的访问(如 OAUTH 中的范围)并设置到期使用权

如果消费者仅通过您再次托管在您的端点上的受信任网站(或应用程序)访问他们的资源(您的端点),则使用 OAUTH 毫无意义

只有在资源所有者(用户)想要通过第三方客户端(外部应用程序)访问他们(您的)资源(端点)的情况下,如果您是 OAUTH provider,您可以进行 OAUTH 身份验证。 它是为相同目的而创建的,尽管您通常可以滥用它

另一个重要说明:
您可以随意使用 authentication 一词来表示 JWT 和 OAUTH,但它们都不提供身份验证机制。是的,一种是令牌机制,另一种是协议,但一旦通过身份验证,它们仅用于授权(访问管理)。您必须使用 OPENID 类型身份验证或您自己的客户端凭据来支持 OAUTH


OAuth 也可以用于您自己的客户,不一定只是第 3 方的客户。 Password Credentials Grant 类型正是这样做的。
我在谷歌上寻找这样一个具体的答案,但找不到。每个人都在谈论定义,例如令牌与协议。您的回答解释了使用一个高于另一个的真正目的。太感谢了!
@harpratap 它可以做并不意味着我们应该做。我认为他在这里提到的一点是,如果您只有受信任的客户,实施 oauth 可能不值得。是的,您可以在这种情况下实现 oauth,但实现 JWT 更容易实现相同的目的。
S
Suraj Kumar Pandey

找出 JWT 和 OAuth 之间的主要区别

OAuth 2.0 定义了一种协议,而 JWT 定义了一种令牌格式。 OAuth 可以使用 JWT 作为令牌格式或作为不记名令牌的访问令牌。 OpenID 连接主要使用 JWT 作为令牌格式。


S
SAMUEL

JWT 是一种开放标准,它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息。它是一种身份验证协议,我们允许在两方(客户端和服务器)之间传输编码的声明(令牌),并在识别客户端后发布令牌。对于每个后续请求,我们都会发送令牌。

而 OAuth2 是一个授权框架,它具有由框架定义的一般程序和设置。 JWT 可以用作 OAuth2 内部的一种机制。

您可以在此处阅读更多信息

OAuth or JWT? Which one to use and why?


n
naila naseem

Jwt 是一套严格的指令,用于签发和验证已签名的访问令牌。令牌包含应用程序用来限制对用户的访问的声明

另一方面,OAuth2 不是协议,它是一个委托授权框架。考虑非常详细的指南,让用户和应用程序在私人和公共环境中授权其他应用程序的特定权限。位于 OAUTH2 之上的 OpenID Connect 为您提供身份验证和授权。它详细说明了多个不同的角色、系统中的用户、API 等服务器端应用程序以及网站或本机移动应用程序等客户端如何相互进行身份验证

注意 oauth2 可以与 jwt 一起使用,实现灵活,可扩展至不同应用


看来你有这个完全倒退。
G
Geeth

JWT 令牌最多需要在运行时资源服务器和授权服务器之间的一次性通信。资源服务器需要向授权服务器请求公钥来解密 JWT 令牌。这可以在资源服务器启动时完成。这甚至可以存储在资源服务器中的属性文件中,完全避免查询。

OAuth2 解决了用户希望使用基于浏览器的 Web 应用程序、本机移动应用程序或桌面应用程序等客户端软件访问数据的问题。 OAuth2 仅用于授权,可以授权客户端软件使用访问令牌代表最终用户访问资源。

OAuth2 可以与 JWT 令牌或作为不记名令牌的访问令牌一起使用。