令牌无状态和存储
Tokens statelessness and storage
我已经阅读了很多关于不在用户代理存储中保存令牌的文章,我同意所提到的风险。
但是通过一些 Auth0 快速入门示例,我看到令牌被保存在会话中并使用会话 cookie 来跟踪它们。
其他人提到将实际令牌保存为风险较低的 httpOnly cookie。
我的问题是:
- 怎么算无国籍?特别是在可扩展性和负载平衡器的潜在用途方面。
- 内存缓存和数据库存储是备选方案吗?这与会话有什么不同吗?
- 对于 SPA,如何维护记住我的功能?
仅当您的应用程序有后端时才适用维护会话。从纯粹的 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 来实现。
架构选择通常是简单性和可扩展性之间的权衡。如果您刚刚开始开发应用程序并且不确定该选择什么,我会选择简单的,因为即使您以后想更改它,重构它也应该更容易。
我已经阅读了很多关于不在用户代理存储中保存令牌的文章,我同意所提到的风险。 但是通过一些 Auth0 快速入门示例,我看到令牌被保存在会话中并使用会话 cookie 来跟踪它们。
其他人提到将实际令牌保存为风险较低的 httpOnly cookie。
我的问题是:
- 怎么算无国籍?特别是在可扩展性和负载平衡器的潜在用途方面。
- 内存缓存和数据库存储是备选方案吗?这与会话有什么不同吗?
- 对于 SPA,如何维护记住我的功能?
仅当您的应用程序有后端时才适用维护会话。从纯粹的 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 来实现。
架构选择通常是简单性和可扩展性之间的权衡。如果您刚刚开始开发应用程序并且不确定该选择什么,我会选择简单的,因为即使您以后想更改它,重构它也应该更容易。