令牌无状态和存储

Tokens statelessness and storage

我已经阅读了很多关于不在用户代理存储中保存令牌的文章,我同意所提到的风险。 但是通过一些 Auth0 快速入门示例,我看到令牌被保存在会话中并使用会话 cookie 来跟踪它们。

其他人提到将实际令牌保存为风险较低的 httpOnly cookie。

我的问题是:

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

如果您有后端,将访问令牌与会话相关联比将其存储在 cookie 中要好。您获得的另一个优势是能够获得刷新令牌,该令牌可以存储在后端。

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

记住我功能又是用 cookie 构建的。它是授权服务器提供的功能。将其视为您的浏览器记住您的 Facebook 登录状态。它使用 cookie,您的应用程序不必为此担心。!

Asi Kavindu 写道,localStorage 是个好地方。如果你想保护应用程序免受XSS攻击,使用Content Security Policy, so a browser executes only your JavaScript code. There is a recent RFC about best practices for OAuth 2.0 and Browser-Based Apps,所以你可以检查它。

如果您想在具有多个后端节点(集群)的后端保持状态(会话),您可以使用一些共享数据存储,例如数据库或 Hazelcast。该架构是有状态的,与具有内存会话的单个后端节点相同。

如果您的后端有一个会话和一个 cookie,则您不再需要访问令牌,因为您的 SPA 仅调用您的后端,并且该令牌的用途与 cookie 中的会话 ID 相同。

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

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