我最近才开始在 react+express 应用程序中使用 jwt,遇到了在哪里存储 jwt 令牌的问题。似乎两个主要选项是本地存储和cookie,两者都适用于各种攻击(XSS和CRSF(。
但是我发现 react 应该是 XSS 安全的(当他们说 React 受 XSS 保护时是什么意思?(那么使用 localStorage 来存储 jwt 可以吗?如果不是,那么行业标准是什么?
Cookie 和 localStorage 都是可以接受的选项,并且两者都被许多应用程序使用。您需要了解它们的优缺点,并选择最适合您的用例的方法。
饼干
- 可以设置为
httpOnly
,所以 javascript 将无法访问。这使得在 XSS 攻击中无法访问令牌。请注意,这并不意味着该应用程序不容易受到 XSS 的攻击。这仅意味着即使XSS攻击成功,攻击者也无法访问令牌。 - 有必要明确保护您的应用免受 CSRF 的影响,因为身份验证信息将自动与请求一起发送。
- 只能发送到它们的源(更不用说不同域上的 API(。
- 令牌可能会被该 cookie 中的普通旧会话 ID 替换,因为您的应用程序可能不是真正的无状态。它将降低复杂性并提高安全性。
- 不能用于复杂的单一登录方案中的访问令牌存储,其中标识提供者具有自己的源,并且应用与不同域上的多个后端通信。在这种情况下,短期访问令牌通常存储在 localStorage 中,并在
httpOnly
Cookie 中为标识提供者域设置生存期较长的刷新令牌。
本地存储
- 可以通过javascript访问,其中包括成功的xss攻击。
- 如果令牌作为请求标头发送,则通常不需要针对 CSRF 进行进一步保护(应用本身受到保护,因为身份验证信息不会自动发送(。
- 令牌可以发送到不同的来源。这是主要的好处,也是使用localStorage或JWT的最重要原因。如果只想将令牌发送到单个应用源,则可能根本不需要 JWT,并且肯定不想使用 localStorage。
反应是"XSS 安全">
不是。开发人员可能更难使其易受攻击,但任何中等复杂度的 React 应用程序都很可能存在 XSS 漏洞。React 绝不是不受不同形式的 XSS 的影响。只要开发人员有多种选择将用户输入插入 DOM 中,就会有 XSS,因为有时以"使其工作"的方式解决问题是最容易的。 如果在应用中可行,Content-Security-Policy
在现代浏览器中可能会有所帮助。确实,默认情况下 React 非常安全,这意味着通常它还可以。这是现在任何现代框架的一个相当标准的要求,这并不意味着 React 中的 XSS 是不可能的。是的。
最终,存储在httpOnly
cookie 中的会话 ID(正确实施会话管理,例如,由您的语言或框架提供(通常是最安全的,其次是httpOnly
cookie 中的令牌,但它也取决于您的威胁模型和确切的用例。