Spring security CSRF 跨域访问限制问题

1,249 阅读1分钟

为什么我必须禁用CSRF

在设置 springSecurity 的时候总有这一句话

httpSecurity.csrf().disable()

从这句话的字面意思就很明白就是禁用 csrf,什么是 csrf,为啥要禁用。

因为你很有可能会遇到一个错误:

HTTP Status 403-Invalid CSRF Token 'null' was found on the request 
parameter '_csrf' or header 'X-CSRF-TOKEN'.

Spring Security 后,引入了CSRF,默认是开启。不得不说,CSRF和RESTful技术有冲突。

具体原理

跨站请求伪造(Cross Site Request Forgery)

详细原理可看 juejin.cn/post/684490…

在跨域 (同一个 IP、同一个网络协议、同一个端口,三者都满足就是同一个域,否则就有跨域问题)时,用户可以伪造请求,然后对服务器进行攻击和修改。httpSecurity.csrf()就是为了防御这种风险而设置的, 具体原理是:

  • 最开始浏览器向服务器发起请求时,服务器生成一个CSRF Token。CSRF Token其实就是服务器生成的字符串,然后将该字符串种植到返回的页面中(可以通过Cookie)

  • 浏览器之后再发起请求的时候,需要带上页面中的 CSRF Token(在request中要带上之前获取到的Token,比如 x-csrf-token:xxxx), 然后服务器会验证该Token是否合法。第三方网站发出去的请求是无法获取到 CSRF Token的值的

但是在 RESTFul 开发的时候,这个情况就没有办法避免,因为我们的 API 会暴露给不同的用户,用户可能也会使用不同的 IP 地址,尤其用户可能还部署了多个服务器的情况下。

因此,我们在 Spring 安全配置下,需要禁用 CSRF。

禁用方法

有你需要在,程序 http 过滤器上禁用。

image.png