是否需要为每个请求/响应在JWT令牌中续订CSRF令牌?

时间:2019-02-19 07:31:59

标签: symfony jwt csrf-protection lexikjwtauthbundle

我正在开发使用symfony和JWT令牌进行身份验证的Web应用程序。为了防止XSS,JWT令牌存储在具有HttpOnly属性的cookie中。为了防止CSRF,我使用了随机的CSRF令牌。该令牌存储在cookie和JWT令牌中(已加密)。我想知道的是,是否需要在每个响应中都更新csrf令牌?什么是最佳实施?

这是我的详细设置:

  • 我们有一个单页应用程序。大多数请求将使用ajax发送。
  • 用户使用POST进行身份验证。
  • 成功进行身份验证后,服务器将生成随机的csrf令牌,然后将其存储在cookie(HttpOnly)和JWT有效负载内部。在将其存储在JWT有效负载中之前,csrf令牌将被加密。
  • 对JWT令牌进行编码后,它将存储在cookie中(HttpOnly)
  • 每次用户请求访问另一个页面时,服务器都会在解码JWT令牌时验证cookie和JWT令牌中的csrf令牌。
  • 未使用LocalStorage,因为可以通过javascript访问

1 个答案:

答案 0 :(得分:1)

通常不需要在每次请求时都更新CSRF令牌。

但是让我们看看您的设置会发生什么:

  • 您将JWT和CSRF令牌存储在cookie中,
  • 您访问的恶意网站会向您的网站发出带有恶意数据的恶意请求,
  • 您的浏览器使用JWT + CSRF将cookie附加到此请求,
  • 您的安全性已被破坏。

因此,您不得将CSRF令牌放入cookie中,因为无论您是否续签它都无用。

如果您使用“单页应用程序”,则最好在Authorization标头中传递JWT。这使得CSRF攻击成为不可能(警惕其他威胁)。

如果您使用“经典Web应用程序”,则最好使用“经典” CSRF令牌和“经典”会话标识符。