在本地存储中反应和存储 jwt 令牌
React and storing jwt token in localstorage
我最近刚开始在 react+express 应用程序中使用 jwt,并遇到了将 jwt 令牌存储在何处的问题。似乎两个主要选项是 localStorage 和 cookies,它们都受到各种攻击(XSS 和 CRSF)。
但我发现 React 据说是 XSS 安全的 (What does it mean when they say React is XSS protected?) 那么可以使用 localStorage 来存储 jwt 吗?如果不是,行业标准是什么?
cookies和localStorage都是可以接受的选项,并且都被很多应用程序使用。您需要了解它们的优缺点,然后选择最适合您的用例的。
Cookies
- 可以设置为
httpOnly
,所以javascript将无法访问。这使得无法在 XSS 攻击中访问令牌。请注意,这并不意味着该应用不易受到 XSS 的攻击。这仅意味着即使 XSS 攻击成功,攻击者也无法访问令牌。
- 有必要明确保护您的应用免受 CSRF 攻击,因为身份验证信息会随请求自动发送。
- 只能发送到他们的来源(更不用说不同域的API)。
- 令牌可能会被该 cookie 中的普通旧 session id 替换,因为您的应用程序可能并不是真正无状态的。它将降低复杂性并提高安全性。
- 不能用于复杂的单一 sign-on 场景中的访问令牌存储,身份提供者有自己的来源,并且应用程序与不同域上的多个后端对话。在这种情况下,short-lived 访问令牌通常存储在 localStorage 中,并在
httpOnly
cookie 中为身份提供商域设置 longer-lived 刷新令牌。
localStorage
- 可以通过 javascript 访问,其中包括成功的 xss 攻击。
- 如果令牌作为请求发送 header,通常不需要针对 CSRF 的进一步保护(应用本身受到保护,因为身份验证信息不会自动发送)。
- 令牌可以发送到不同的来源。这是主要的好处,也是您通常使用 localStorage 或 JWT 的最重要原因。如果您只想将令牌发送到您的单一应用源,您可能根本不需要 JWT,并且绝对不想使用 localStorage。
React 是“XSS 安全的”
不是。开发人员可能更难使其易受攻击,但任何中等复杂度的 React 应用程序很可能存在 XSS 漏洞。 React 绝不能免受不同形式的 XSS 攻击。只要开发人员有多种选择将用户输入插入 DOM,XSS 就会存在,因为有时以“让它工作”的方式解决问题是最容易的。 Content-Security-Policy
如果在您的应用程序中可行,在现代浏览器中可能会有所帮助。的确,默认情况下 React 非常安全,这意味着 通常 它就可以了。这是现在任何现代框架的一个相当标准的要求,这并不意味着 React 中的 XSS 是不可能的。是的。
最终,session id 存储在 httpOnly
cookie 中(正确实施 session 管理,例如,由您提供语言或框架)是最安全的一般,其次是 httpOnly
cookie 中的令牌,但它也取决于您的威胁模型和确切的用例。
我最近刚开始在 react+express 应用程序中使用 jwt,并遇到了将 jwt 令牌存储在何处的问题。似乎两个主要选项是 localStorage 和 cookies,它们都受到各种攻击(XSS 和 CRSF)。
但我发现 React 据说是 XSS 安全的 (What does it mean when they say React is XSS protected?) 那么可以使用 localStorage 来存储 jwt 吗?如果不是,行业标准是什么?
cookies和localStorage都是可以接受的选项,并且都被很多应用程序使用。您需要了解它们的优缺点,然后选择最适合您的用例的。
Cookies
- 可以设置为
httpOnly
,所以javascript将无法访问。这使得无法在 XSS 攻击中访问令牌。请注意,这并不意味着该应用不易受到 XSS 的攻击。这仅意味着即使 XSS 攻击成功,攻击者也无法访问令牌。 - 有必要明确保护您的应用免受 CSRF 攻击,因为身份验证信息会随请求自动发送。
- 只能发送到他们的来源(更不用说不同域的API)。
- 令牌可能会被该 cookie 中的普通旧 session id 替换,因为您的应用程序可能并不是真正无状态的。它将降低复杂性并提高安全性。
- 不能用于复杂的单一 sign-on 场景中的访问令牌存储,身份提供者有自己的来源,并且应用程序与不同域上的多个后端对话。在这种情况下,short-lived 访问令牌通常存储在 localStorage 中,并在
httpOnly
cookie 中为身份提供商域设置 longer-lived 刷新令牌。
localStorage
- 可以通过 javascript 访问,其中包括成功的 xss 攻击。
- 如果令牌作为请求发送 header,通常不需要针对 CSRF 的进一步保护(应用本身受到保护,因为身份验证信息不会自动发送)。
- 令牌可以发送到不同的来源。这是主要的好处,也是您通常使用 localStorage 或 JWT 的最重要原因。如果您只想将令牌发送到您的单一应用源,您可能根本不需要 JWT,并且绝对不想使用 localStorage。
React 是“XSS 安全的”
不是。开发人员可能更难使其易受攻击,但任何中等复杂度的 React 应用程序很可能存在 XSS 漏洞。 React 绝不能免受不同形式的 XSS 攻击。只要开发人员有多种选择将用户输入插入 DOM,XSS 就会存在,因为有时以“让它工作”的方式解决问题是最容易的。 Content-Security-Policy
如果在您的应用程序中可行,在现代浏览器中可能会有所帮助。的确,默认情况下 React 非常安全,这意味着 通常 它就可以了。这是现在任何现代框架的一个相当标准的要求,这并不意味着 React 中的 XSS 是不可能的。是的。
最终,session id 存储在 httpOnly
cookie 中(正确实施 session 管理,例如,由您提供语言或框架)是最安全的一般,其次是 httpOnly
cookie 中的令牌,但它也取决于您的威胁模型和确切的用例。