为什么我必须禁用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 过滤器上禁用。