【发布时间】:2022-06-10 17:42:26
【问题描述】:
我一直在研究如何最好地在 React/Next.js 应用程序中实现身份验证 - 具体来说,如何以实用的方式存储身份验证令牌,同时保持对安全性的必要重视。关于 SO 的这个话题存在一些现有的争论,但据我所知,没有一个提供具体的解决方案。
昨天和今天花了很多时间在互联网上寻找答案,我遇到了以下问题:
-
Local Storage API。我发现一些基本指南建议使用
localStorage(尽管许多人理所当然地反对它)。我不喜欢这种方法,因为在发生 XSS 攻击时可以访问存储在localStorage中的数据。 -
Web Worker。如果令牌存储在 Web Worker 中,则在打开新选项卡时用户将不会登录。这会导致不合标准且令人困惑的用户体验。
-
关闭。与 Web Workers 相同 - 没有持久性。
-
HttpOnly Cookies。一方面,此类 cookie 无法被 JavaScript 读取,因此不易发生 XSS。然而,另一方面,我们现在必须处理 CSRF,这完全是一个新的争论:如何使用 SPA + REST API 实现 CSRF 令牌?
虽然使用HttpOnly cookie 似乎是最有利的,但在 SPA 中实施 CSRF 似乎是非常规的,并且可能是实验性的,这违反了在安全性方面不“自己动手”的格言。如果存在,我宁愿使用一种经过验证的方法。
如今 SPA 风靡一时,令我感到惊讶的是,要为如此普遍的场景找到共识(甚至更好的是库)变得如此困难。
其他人是怎么做的?
更新:经过一番思考,我想知道如果有强大的 CORS 政策,localStorage 是否真的那么糟糕?如果碰巧存在 XSS 漏洞,攻击者难道不能开始从浏览上下文中发送请求,从而否定使用 cookie 和 CSRF 保护的任何感知好处吗?
【问题讨论】:
标签: rest security single-page-application csrf xss