【问题标题】:Where to store JWT token in react / client side in secure way?在哪里以安全的方式将 JWT 令牌存储在反应/客户端?
【发布时间】:2021-11-16 12:42:21
【问题描述】:

我们正在用 react js 开发一个 web 应用程序,并使用 Odoo 作为后端。

我的网络应用将托管在 abc.com,后端位于 xyz.com。

现在,当我在后端调用登录 API 时,它会给出一个 JWT 令牌作为响应。现在我的问题是我们应该在哪里存储这个 JWT 令牌以供后续使用。

我发现了一些类似的问题,但我不确定它们应该存储在我的用例中的什么位置。 任何人都可以向我建议我们应该将它存储在客户端的哪个位置?

提前非常感谢!

【问题讨论】:

    标签: javascript reactjs jwt odoo


    【解决方案1】:

    您有几个选项可以存储令牌。每个选项都有其缺陷,您应该选择哪一个取决于您的具体需求和用例。很高兴知道在浏览器中没有安全的方式来存储令牌。

    1. 存储在内存中。您可以将令牌保存在脚本内存中的变量中。使用 XSS 攻击很难窃取令牌,但每次用户刷新页面时都需要一个新令牌。

    2. 存储在本地存储中。这使您可以在用户刷新页面时重用令牌。但是,使用此选项,XSS 攻击更容易窃取您的令牌。

    3. 存储在仅 http 的、安全的同站点 cookie 中。这目前被认为是 SPA 最安全的选项,但在这种情况下,您将无法直接从 SPA 设置 Authorization 标头,您只能依靠浏览器将安全 cookie 添加到您的请求中。这意味着,您可能需要一些额外的后端组件,这些组件将从 cookie 中提取令牌(并可能首先将它们放入这些 cookie 中)。这通常被称为 Token Handler 组件,或 Backend-for-Frontend。如果这是您需要的安全级别,您可以查看我们在 Curity 所做的此类 BFF 的示例实现:https://curity.io/resources/learn/back-end-for-front-end/

    还可以观看 Philippe de Ryck 制作的关于浏览器中令牌安全性的精彩视频:https://pragmaticwebsecurity.com/talks/xssoauth.html

    【讨论】:

    • 提取 jwt 客户端并将其作为不记名令牌添加到每个请求似乎是有意义的。
    • 您所描述的是我回答中的选项 1。这确实有意义,但不如将令牌保存在仅 http 的安全 cookie 中安全。
    • 我错了。您显然无法读取 httponly cookie 客户端。当 XSS 攻击可以向您的后端发送 ajax 请求并将 cookie 连同它一起发送给后端将验证时,这将如何提高安全性。
    • 攻击只能在用户打开浏览器的情况下发送请求。在令牌的情况下,XSS 可以读取令牌,将其发送到攻击者的网站,然后只要它有效,就可以使用它。但通常尝试避免 XSS 应该是优先事项,因为无论采用哪种解决方案,成功的攻击仍然能够造成一些伤害。
    【解决方案2】:

    您可以将获得的令牌存储在 cookie 中。如果你的请求使用 axios 库,你可以在 axios 的拦截器中设置要处理的令牌

    export function getToken() {
      for (const i in TokenKey) {
        if (Cookies.get(TokenKey[i])) return Cookies.get(TokenKey[i])
      }
    
    service.interceptors.request.use(
      config => {
        const token = getToken() || store.getters.token
        if (token) {
          config.headers['Authorization'] = token
        }
        return config
      },
      error => {
        // Do something with request error
        console.log(error) // for debug
        Promise.reject(error)
      }
    

    )

    【讨论】:

    • 这违背了使用 cookie 的安全目的(使用本地存储会更直接)。如果你想要一个 cookie,请使用 HttpOnly cookie,这样潜在的 XSS 攻击就无法窃取它。您不需要在代码中使用 nothing 来使用令牌,因为浏览器会在后续请求中自动将其传递回服务器!
    • Storing Token in webStorage(localStorage,sessionStorage) 可以被同域的js访问,容易被xss攻击,特别是项目中引入了很多第三方js库,如果js脚本被盗,攻击者很容易访问你的网站,将Token存储在cookie中,可以指定httponly防止js被读取,也可以指定secure保证Token只在HTTPS下传输。
    • 在cookie中可以指定httponly防止js被读取,也可以指定secure保证Token只在HTTPS下传输,缺点是容易受到CSRF攻击。
    • @Przeblysk 如果您在 cookie 中指定 httponly,则无法使用您在答案中发布的代码,因为没有脚本能够访问 cookie。但确实最好将令牌存储在 httponly cookie 中,因为这样更安全。
    • @MichalTrojanowski 是的,你是对的。
    猜你喜欢
    • 2020-08-22
    • 2019-05-09
    • 2016-03-15
    • 2019-12-30
    • 1970-01-01
    • 2019-04-25
    • 2021-02-27
    • 2020-12-21
    • 2020-09-08
    相关资源
    最近更新 更多