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


356

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

我还使用JWT作为XSRF-TOKEN来防止XSRF,但被要求将它们分开?我应该把它们分开吗?在这里的任何帮助将不胜感激,并可能会导致为社区制定一套准则。

Answers:


330

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


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

由于是独立的(实际令牌包含有关给定主题的信息),它们还是实现无状态身份验证机制(aka Look mum,no session!)的不错选择。当走这条路线时,要授予一方访问受保护资源的唯一条件就是令牌本身,有问题的令牌可以称为承载令牌。

在实践中,您所做的已经可以基于承载令牌进行分类。但是,请确保您没有使用OAuth 2.0相关规范所指定的承载令牌(请参阅RFC 6750)。这意味着依赖于AuthorizationHTTP标头并使用Bearer身份验证方案。

关于在不知道确切细节的情况下使用JWT来防止CSRF的问题,很难确定该做法的有效性,但是说实话,这似乎并不正确和/或不值得。以下文章(Cookies与令牌:权威指南)可能是关于该主题的有用读物,尤其是XSS和XSRF保护部分。

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

HTTP代理和服务器会识别并特别处理授权标头。因此,使用这种报头向资源服务器发送访问令牌的方法通常降低了已认证请求(特别是授权报头)泄漏或意外存储的可能性。

(来源:RFC 6819,第5.4.1节


2
这是否意味着如果我在移动应用程序上使用JWT身份验证,则不需要在其POST请求中包括CSRF?不同于带有表单的Web界面?
user805981

2
饼干VS令牌:权威指南,即auth0.com/blog/cookies-vs-tokens-definitive-guide心不是工作这又是一个伟大的论坛帖子:stackoverflow.com/questions/37582444/...
亚洲时报Siddharth耆那

1
“它们也是实现无状态身份验证机制(aka妈妈,没有会话!)的不错选择。”如果您需要一种使令牌失效的方法,因为它被泄漏或被拦截,或者用户只是注销并删除了令牌,由于令牌仍然有效,因此不够安全,因此您需要将它们存储在某个数据库中,因此我认为出于安全目的或简单的令牌黑名单,服务器上必须有某种会话概念。您可能会说为此使用“刷新”令牌。但是刷新令牌也可以被拦截,后果更糟。
康拉德'18

1
@Konrad,我确实实现了一种类似的机制,该机制将未使用的有效令牌存储在表中,并在它们到期时从那里释放它们。对于每个传入请求,我都编写了代码以对照“未使用的有效令牌”对传入令牌进行交叉检查。即使它有效,我也一直怀疑我-应该有一种更好的方法来处理未使用但仍有效的令牌。
Tech Junkie

2
另一方面,刷新令牌只会使客户端的实现复杂化。因为如果您的访问令牌到期,则需要处理该令牌,因此,如果您仅注销用户而又没有手动刷新会话的可能性(就像银行那样),该用户将很生气。这还需要做更多的工作,而且使用身份验证(OID)和授权(OAuth)的标准方法通常会显得过分。
康拉德(Konrad)'18

281

OAuth 2.0定义了协议,即指定了令牌的传输方式,JWT定义了令牌格式。

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

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

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


10
在大多数情况下,oAuth协议实现是否将JWT用作令牌格式?如果不是最常见的是什么?
James Wierzba

14
oauth中的令牌格式未定义,但JWT应该可以正常工作
vikingsteve,2017年

128

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

XSRF令牌始终在每个响应标头中发送给客户端。是否以JWT令牌发送CSRF令牌并不重要,因为CSRF令牌具有自身安全性。因此,无需在JWT中发送CSRF令牌。


7
我不明白为什么这个答案会有很多反对,它指出“ OAuth是身份验证框架”,这是完全错误的。OAuth是授权协议,仅是授权协议。
迈克尔

4
嗨@Michael,对此有太多误解。我编辑了我的评论,谢谢。
MelikşahŞimşek

6
@Michael,请感谢其他bcz的回答,他与我们分享了他的专业知识,我非常喜欢这个答案。
Yasir Shabbir Choudhary

你们是说Oauth只是开发人员应该遵循的一部分标准吗?还是真的是一个框架?
StormTrooper

65

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

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

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

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

您可以在这里阅读更多详细信息http://proficientblog.com/microservices-security/


3
没有Cookie ==没有CSRF保护。如果您不使用cookie进行授权,那么您就不必担心CSRF保护。
niranjan harpale

51

似乎每个在这里回答的人都错过了OAUTH的争论点

来自维基百科

OAuth是访问授权的开放标准,通常用作Internet用户授予网站或应用程序访问其在其他网站上的信息的途径,而无需给他们提供密码。[1] Google,Facebook,Microsoft和Twitter等公司使用此机制来允许用户与第三方应用程序或网站共享有关其帐户的信息。

这里的重点是access delegation。当存在基于id / pwd的身份验证时,为什么有人会创建OAUTH,而该身份验证由OTP等多因素身份验证支持,并且可以由用于保护路径访问(如OAUTH中的作用域)的JWT保护,并且设置了有效期访问

如果消费者仅通过受信任的网站(或应用程序)访问您的资源(您的端点),而OAUTH没有任何用处,那么您将再次托管在您的端点上

你可以去OAuth认证只是如果你是一个OAUTH provider在资源拥有者(用户)希望通过第三方客户端(外部应用程序)来访问他们的(你的)资源(终点)的情况下。尽管您通常会滥用它,但它是完全出于相同目的而创建的

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


4
OAuth还可以用于您自己的客户端,而不必仅用于第三方客户端。密码凭据授予类型正是这样做的。
harpratap

1
我一直在寻找这样一个具体的答案谷歌,但找不到一个。每个人都只是在谈论定义,例如令牌与协议。您的答案说明了在一个之上使用一个的真正目的。非常感谢!
Vivek Goel

9

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

  1. OAuth 2.0定义了协议,而JWT定义了令牌格式。

  2. OAuth可以使用JWT作为令牌格式,也可以使用作为承载令牌的访问令牌。

  3. OpenID connect大多使用JWT作为令牌格式。


6

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

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

你可以在这里阅读更多

OAuth还是JWT?使用哪个,为什么?


5

这个问题是一个普遍的问题,但不是很明智。JWT是令牌的一种,而OAuth是描述如何分配令牌的框架。

我们所说的“框架”是什么意思?可以并且应该用来请求令牌的只是请求和响应的顺序以及它们的格式。OAuthv2针对不同的场景描述了单独的“流”或授权类型,并具有不同的扩展名(例如PKCE)以扩展特定流的安全性。

通过OAuthV2许可进行令牌请求的结果是……令牌。然后将该东西用作“承载者令牌”,这意味着持有令牌的任何一方都可以在进行api请求服务时出示令牌(例如,“我的储值卡上的余额是多少?”)。作为不记名令牌,它的工作原理类似于现金。如果您拿着它,可以使用它。(尽管与现金不同,但代币不是用完即用的代币。也许更好的比喻是公交系统的全天乘车票或迪士尼世界的全天票。)

JWT是一种特殊的令牌,并且JWT绝对可以用作OAuth承载令牌。实际上,这是最常见的做法。有鉴于此,“ JWT与OAuth”是对苹果和购物车的比较。

通常,人们认为“ OAuth令牌”始终暗含一个不透明的令牌-不包含内在含义的字母数字字符的随机序列-由OAuth令牌药房授予,然后只能由同一OAuth药房系统进行验证。但这不是唯一的OAuth令牌。不透明令牌是一种令牌。JWT可以用作另一种OAuth令牌。

相反,JWT不是不透明的。JWT不是信息的“指针”或参考。它实际上包含许多特定信息,任何拥有令牌的一方都可以提取和解释这些信息。由于JWT包含真实信息,因此JWT可能很大。300字节,500字节或更多,取决于其中包含的声明以及用于对其签名的算法。当人们说“ JWT正在自我验证”的意思是,JWT的任何持有人都可以打开它,对其进行验证,然后根据其中提出的声明做出授权决定。验证JWT意味着:验证其结构,解码base64编码,验证密钥正确,验证签名,然后验证令牌中是否存在要求的声明,检查到期时间。这不是一件简单的事情,这是一个多步骤的过程,但是当然有很多支持各种编程语言的库,当然还有VerifyJWT策略可以帮助您在Apigee Edge API代理中完成此操作。关键是,任何持有者或接收者都可以验证令牌。因此,我们说JWT支持“联合身份验证”-任何人都可以生成令牌,并且任何人都可以读取和验证令牌。

自定义声明。JWT和不透明的OAuth令牌都可以携带有关主题的自定义声明。安全。两者都是不记名令牌。两者都需要作为秘密进行保护。到期。两者都可以标记为过期。两者都可以刷新。身份验证机制或经验。两者都可以呈现相同的用户体验。


0

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

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

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


看来您完全倒退了。
jbruni
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.