springsecurity为什么说使用JWT就可以disable csrf

Cross-Site Request Forgery (CSRF) 是一种攻击,它利用了用户在浏览器中对特定网站的登录状态。攻击者可以在他们控制的网站上构造一个请求,当用户访问这个网站时,这个请求会在用户的浏览器中执行,并带有用户对目标网站的凭证(例如,cookies)。如果目标网站没有合适的防护措施,攻击者就可以在用户不知情的情况下以用户的身份执行操作。

Spring Security 默认启用了 CSRF 保护,它通过一个 CSRF token 来确保只有知道这个 token 的请求才能执行改变状态的操作。这个 CSRF token 会在每个 session 中生成,并在每次请求中验证。

然而,当你使用 JWT 进行认证时,你可能会选择不使用 session,因为 JWT 是无状态的,它包含了所有必要的用户信息。在这种情况下,没有 session,也就没有地方存储 CSRF token,所以 CSRF 保护实际上是无效的。

此外,JWT 通常不会存储在 cookie 中,而是存储在前端的本地存储中,然后在每个请求的 Authorization 头中发送。因为 CSRF 攻击是通过 cookie 来携带用户凭证的,所以如果你不使用 cookie 存储用户凭证,你就不会受到 CSRF 攻击的影响。

因此,当使用 JWT 进行认证时,你通常可以关闭 Spring Security 的 CSRF 保护。但是,请注意,你应该仍然防范其他的安全威胁,例如 Cross-Site Scripting (XSS) 攻击,它可以用来窃取前端存储中的 JWT。

在使用 JWT 的情况下,应对 CSRF 的最佳做法主要取决于你如何存储和传输 JWT

  1. 不存储 JWT 在 Cookie 中: 如果你将 JWT 存储在前端的一个地方(例如,localStorage 或 sessionStorage),并且在每次请求时手动把 JWT 添加到 Authorization header,那么你的应用本质上就是免疫于 CSRF 攻击的。这是因为 CSRF 攻击是通过利用浏览器会自动发送 Cookie 的特性,而浏览器不会自动添加 JWT 到 Authorization header。

  2. 存储 JWT 在 Cookie 中: 如果你选择将 JWT 存储在 Cookie 中,那么你的应用就有可能受到 CSRF 攻击。在这种情况下,你可以使用 Double Submit Cookie 方案来防止 CSRF 攻击。这个方案的实现方法是,在设置 JWT 的同时,设置一个额外的 CSRF Token Cookie,并将这个 CSRF Token 也返回给前端。然后,前端在每次请求时,除了浏览器自动发送的 JWT Cookie,还要手动把 CSRF Token 添加到请求的 headers 或 body。服务器在接收到请求时会比较 CSRF Token Cookie 和请求的 headers 或 body 中的 CSRF Token 是否一致,从而防止 CSRF 攻击。

无论你选择哪种方法,都应当注意防止其他类型的攻击,例如 Cross-Site Scripting (XSS) 攻击和 Man-in-the-Middle (MITM) 攻击。例如,你应当使用 HTTPS 来防止 MITM 攻击,使用适当的策略和技术(例如,Content Security Policy,对用户输入的严格检查和清理)来防止 XSS 攻击。

你可能感兴趣的:(spring,security,csrf,前端)