我有一个新的SPA,使用无状态身份验证模型来使用JWT。常常被要求引用OAuth进行身份验证流程,比如让我发送"Bearer tokens"来代替简单的令牌头,但我认为OAuth比基于简单JWT进行身份验证复杂得多。主要区别是什么?我是否应该使JWT身份验证行为像OAuth?
我还将JWT用作我的XSRF-TOKEN以防止XSRF攻击,但被要求将它们分开?我应该将它们分开吗?任何帮助都将不胜感激,并可能导致一组社区准则。
我有一个新的SPA,使用无状态身份验证模型来使用JWT。常常被要求引用OAuth进行身份验证流程,比如让我发送"Bearer tokens"来代替简单的令牌头,但我认为OAuth比基于简单JWT进行身份验证复杂得多。主要区别是什么?我是否应该使JWT身份验证行为像OAuth?
我还将JWT用作我的XSRF-TOKEN以防止XSRF攻击,但被要求将它们分开?我应该将它们分开吗?任何帮助都将不胜感激,并可能导致一组社区准则。
TL;DR 如果您只有非常简单的场景,比如一个客户端应用程序、一个API,则可能没有必要使用OAuth 2.0。另一方面,如果有很多不同的客户端(基于浏览器、本机移动设备、服务器端等),那么遵循OAuth 2.0规则可能会使它比尝试自行开发系统更易管理。
正如另一个答案所述,JWT (了解JSON Web Tokens) 只是一种令牌格式。它定义了一种紧凑且自包含的机制,用于以数字签名的方式在各方之间传输数据,并且可以验证和信任。此外,JWT的编码规则也使得在HTTP上下文中非常容易使用这些令牌。
由于JWT是自包含的(实际令牌包含有关给定主题的信息),因此它们也是实现无状态身份验证机制(也称为“无需会话”)的良好选择。当采用此路线时,唯一需要呈现的是访问受保护资源的令牌本身,而所涉及的令牌可以称为承载令牌。
在实践中,您已经可以将其归类为基于承载令牌的身份验证。但是,请注意,您未按照OAuth 2.0相关规范使用承载令牌(请参见RFC 6750)。这意味着依赖授权
HTTP标头并使用承载者
身份验证方案。
关于使用JWT防止CSRF攻击:如果不了解确切的细节,则很难确定此实践的有效性。老实说,它似乎不正确或不值得。以下文章(Cookie vs Token:明确指南)可能是有关此主题的有用阅读,特别是“XSS和XSRF保护”部分。
一条最后的建议是,即使您不需要完全采用OAuth 2.0,我强烈建议您在传递访问令牌时使用Authorization
头而不是自定义头。如果它们真的是承载令牌,请遵循RFC 6750的规则。如果不是,您始终可以创建自定义身份验证方案并仍然使用该头部。
(来源:RFC 6819,第5.4.1节)HTTP代理和服务器会识别并特殊处理授权头,因此,使用这些头将访问令牌发送到资源服务器可降低泄露或意外存储授权请求的概率,尤其是授权头。
OAuth 2.0定义了一个协议,即规定了令牌如何传输,而JWT则定义了一个令牌格式。
当客户端向资源服务器呈现令牌时,在(第二个)阶段方面,“JWT身份验证”和OAuth 2.0具有类似的外观:令牌通过标头传递。
但是,“JWT身份验证”不是一个标准,也没有指定客户端如何在第一阶段中获得令牌。这就是OAuth被认为很复杂的原因:它还定义了客户端可以从所谓的授权服务器获取访问令牌的各种方式。
因此,真正的区别在于JWT只是一个令牌格式,而OAuth 2.0是一个协议(可以使用JWT作为令牌格式)。
首先,我们需要区分JWT和OAuth。基本上,JWT是一种令牌格式,OAuth是一种授权协议,可以使用JWT作为令牌。OAuth使用服务器端和客户端存储。如果您想要进行真正的注销,则必须选择OAuth2。使用JWT令牌进行身份验证实际上无法注销,因为您没有身份验证服务器来跟踪令牌。如果您想向第三方客户提供API,则还必须使用OAuth2。OAuth2非常灵活。 JWT实现非常容易且不需要太长时间。如果您的应用程序需要这种灵活性,则应选择OAuth2。但是,如果您不需要此用例场景,则实施OAuth2将是浪费时间。
XSRF令牌始终在每个响应标头中发送给客户端。无论CSRF令牌是否在JWT令牌中发送,都无关紧要,因为CSRF令牌通过其本身进行了保护。因此,在JWT中发送CSRF令牌是不必要的。
找出JWT和OAuth之间的主要差异
OAuth 2.0定义了协议,而JWT定义了令牌格式。
OAuth可以使用JWT作为令牌格式或访问令牌(即承载令牌)。
OpenID Connect主要使用JWT作为令牌格式。
JWT是一种开放标准,定义了一种紧凑且自包含的安全信息传输方式,用于在两个方(客户端和服务器)之间安全地传输信息。它是一种认证协议,允许编码声明(令牌)在客户端和服务器之间传输,并在客户端身份识别后发出令牌。每次后续请求时,我们发送该令牌。
而OAuth2是一个授权框架,其中有一般程序和设置由框架定义。JWT可以作为OAuth2中的机制来使用。
您可以在此处阅读更多内容
JWT令牌最多需要在运行时资源服务器和授权服务器之间进行一次通信。资源服务器需要请求授权服务器提供公钥以解密JWT令牌。这可以在资源服务器启动时完成。甚至可以将其存储在资源服务器中的属性文件中,避免了所有查询。
OAuth2解决了用户想要使用客户端软件(如基于浏览器的Web应用程序、本机移动应用程序或桌面应用程序)访问数据的问题。OAuth2仅用于授权,客户端软件可以使用访问令牌代表最终用户访问资源。
OAuth2可以与JWT令牌或访问令牌(即承载令牌)一起使用。