我已经读了很多关于不将令牌保存在用户代理存储中的内容,我同意所提到的风险。 但是,通过一些Auth0快速入门示例,我看到令牌已保存在会话中,并使用会话cookie来跟踪它们。
其他人提到将实际令牌另存为httpOnly cookie,从而降低了风险。
我的问题是:
答案 0 :(得分:2)
Asi Kavindu写道,localStorage
是个好地方。如果要保护应用程序不受XSS攻击,请使用Content Security Policy,这样浏览器仅执行您的JavaScript代码。最近有关于OAuth 2.0 and Browser-Based Apps最佳做法的RFC,因此您可以进行检查。
如果要在具有多个后端节点(群集)的后端上保持状态(会话),则可以使用某些共享数据存储,例如数据库或Hazelcast。该体系结构具有状态性,就像具有内存会话的单个后端节点一样。
如果您的后端有一个会话和一个cookie,则不再需要访问令牌,因为yor SPA只会调用您的后端,而该令牌的作用与cookie中的会话ID相同。
“记住我”功能可以在您的身份验证提供程序(从安全性角度来看可能是更好的选择)中使用cookie或您自己的应用程序来实现。
架构选择通常是在简单性和可伸缩性之间进行权衡。如果您只是开始开发应用程序而不确定要选择什么,那么我会为了简单起见,因为即使您以后要更改它,重构起来也应该更容易。
答案 1 :(得分:1)
仅当应用程序有后端时,才可以维护会话。从纯粹的SPA角度来看,将令牌存储在localstorage
中是可以接受的并且相对安全。与其他方式相比,现代浏览器具有保护场所的能力。
如果您有后端,则将访问令牌与会话相关联比将其存储在cookie中更好。通过这种方式获得的另一个好处是能够获取刷新令牌,该令牌可以存储在后端。
拥有Cookie意味着失去无国籍状态。 Cookies在那里维护服务器和客户端之间的状态。会话维护需要服务器资源,但是我认为您不必为此担心。必须根据您的特定要求进行扩展。
请记住,功能还是由cookie构建的。它是授权服务器提供的功能。将其视为浏览器记住Facebook的登录状态。它使用cookie,您的应用程序不必为此担心。