oauth-2.0 - 代币无状态和存储
问题描述
我已经阅读了很多关于不将令牌保存在用户代理存储中的内容,并且我同意所提到的风险。但是通过一些 Auth0 快速入门示例,我看到令牌保存在会话中并使用会话 cookie 来跟踪它们。
其他人提到将实际令牌保存为具有较低风险的 httpOnly cookie。
我的问题是:
- 这怎么被认为是无国籍的?特别是在可扩展性和负载平衡器的潜在使用方面。
- 是替代方案,内存缓存和数据库存储吗?这和会话有什么不同吗?
- 在 SPA 的情况下,如何保持记住我的功能?
解决方案
Asi Kavindu 写道,localStorage
是个好地方。如果您想保护应用程序免受 XSS 攻击,请使用Content Security Policy,这样浏览器只会执行您的 JavaScript 代码。最近有一个关于OAuth 2.0 和基于浏览器的应用程序的最佳实践的 RFC ,因此您可以查看它。
如果您想在具有多个后端节点(集群)的后端保持状态(会话),您可以使用一些共享数据存储,例如数据库或 Hazelcast。该架构是有状态的,与具有内存会话的单个后端节点相同。
如果您的后端有会话和 cookie,则不再需要访问令牌,因为您的 SPA 仅调用您的后端,并且令牌的用途与 cookie 中的会话 ID 相同。
可以在您的身份验证提供程序(从安全角度可能是更好的选择)或您自己的应用程序处使用 cookie 来实现记住我功能。
架构选择通常是简单性和可扩展性之间的权衡。如果您刚刚开始开发应用程序并且不确定选择什么,我会尽量简单,因为即使您以后想更改它,重构也应该更容易。
推荐阅读
- typescript - 我可以基于枚举定义接口吗?
- angular - Angular 7 - 如何在 *ngFor 加载数据之前显示加载器?
- c++ - 如何清除控制台窗口中的特定行
- java - VS Code Extension 卡住安装
- jquery - 尝试在我的 Raiks 应用程序中删除通过 Jquery 呈现的评论
- python - 计算两个日期之间的整月数?
- xml - 如何将文件复制到可以使用 ANT 更改部分名称的目录?
- machine-learning - CatBoost 基准测试中使用了什么样的预处理来编码分类变量?
- javascript - 为什么存储 base64 数据流不起作用?
- angular - 根据数量在*ngfor中使用*ngif