Oauth 2.0 令牌的无状态性和存储

Oauth 2.0 令牌的无状态性和存储,oauth-2.0,jwt,auth0,openid-connect,Oauth 2.0,Jwt,Auth0,Openid Connect,我已经读了很多关于不将令牌保存在user agent存储中的内容,我同意上面提到的风险。 但是通过查看一些Auth0快速入门示例,我看到令牌保存在会话中,并使用会话cookie跟踪它们 其他人提到将实际令牌保存为httpOnly cookie,风险更低 我的问题是: 这怎么被认为是无国籍的?特别是在可扩展性和负载平衡器的潜在使用方面 替代方案包括内存缓存和数据库存储吗?这与会话有什么不同吗 在SPA的情况下,如何维护记忆我功能 维护会话仅在应用程序有后端时适用。从纯粹的SPA角度来看,在loc

我已经读了很多关于不将令牌保存在user agent存储中的内容,我同意上面提到的风险。 但是通过查看一些Auth0快速入门示例,我看到令牌保存在会话中,并使用会话cookie跟踪它们

其他人提到将实际令牌保存为httpOnly cookie,风险更低

我的问题是:

  • 这怎么被认为是无国籍的?特别是在可扩展性和负载平衡器的潜在使用方面
  • 替代方案包括内存缓存和数据库存储吗?这与会话有什么不同吗
  • 在SPA的情况下,如何维护记忆我功能

维护会话仅在应用程序有后端时适用。从纯粹的SPA角度来看,在
localstorage
中存储令牌是可以接受的,而且相对安全。与其他方式相比,现代浏览器具有保护loaclsotrage的能力

如果您有一个后端,那么将访问令牌与会话关联比将其存储在cookie中要好。另外一个好处是可以获取刷新令牌,该令牌可以存储在后端

拥有一块饼干意味着失去无国籍状态。Cookie用于维护服务器端和客户端之间的状态。会话维护需要服务器资源,但我认为您不必为此担心太多。必须针对您的特定需求进行扩展


记住我,功能是用cookies构建的。它是授权服务器提供的功能。把它想象成你的浏览器,记住你Facebook的登录状态。它使用cookies,您的应用程序不必为此担心

Asi Kavindu写道,
localStorage
是个好地方。如果要保护应用程序免受XSS攻击,请使用,这样浏览器只执行JavaScript代码。最近有一个关于最佳实践的RFC,所以您可以查看它

如果您希望在具有多个后端节点(集群)的后端上保持状态(会话),则可以使用一些共享数据存储,如数据库或Hazelcast。该体系结构是有状态的,其方式与具有内存会话的单个后端节点相同

如果你的后端有一个会话和一个cookie,你就不需要访问令牌了,因为yor SPA只调用你的后端,令牌的作用与cookie中的会话ID相同

“记住我”功能可以在您的身份验证提供商(从安全角度来看可能是更好的选择)或您自己的应用程序中使用cookie实现


架构选择通常是简单性和可伸缩性之间的权衡。如果您刚刚开始开发应用程序,但不确定要选择什么,我会尽量简化,因为即使您以后想要更改它,重构也应该更容易。

我的应用程序是一个SPA,连接到我维护的后端API。我希望用户被记住,我曾经将他的令牌保存在localStorage中。但是现在我害怕XSS,这就是为什么我要构建一个更好的身份验证服务器。如果我使用会话,那么它将锁定到一个实例,以防我想要扩展它。我将不得不使用一些内存或持久数据库来维护会话。我主要是在寻找好的架构方法。所以这实际上就是我正在做的,但后来很多人提出了关于使用本地存储的问题。感谢您提供的详细答案。您也可以使用
会话存储
,它在浏览器重新启动后无法保存,只保留给单个浏览器选项卡。如果您只想存储短期数据,而不想在浏览器选项卡之间共享这些数据,那么它可能更合适。