CSRF与CORS没有直接的联系。
在CSRF攻击时,不是通过跨域访问来攻击的,比如从恶意B网站下载的javascript执行时,访问正常网站A,不是这样的。一般是从恶意网站B下载的网页里边有一个超级链接,链接到网站A,这是由于用户登陆过网站A,便会携带身份信息(主要是cookie),向A网站发起操作,比如银行转账等。
Spring Security通过设定一个csrf_token的方式,并且这个token下次访问时,通过header、parameter、cookie的方式携带上来,这样Spring Security的CSRF Filter就会检查cookie里边的CSRF token值和header或者parameter里的CSRF token值是否相同来判断是否是合法请求。
由于CSRF攻击时,只能将网站A的cookie携带过来,但是header是无法携带的,所以请求到了Spring Security的CSRF Filter就会被拒绝。
(以上是对Spring Security CSRF这块儿的粗浅理解,还没有详细看源码,理解肯定会有偏差)
对于前后端分离项目,一般认为是天然免受CSRF攻击的,因为前后端分离项目,后端一般使用token来进行鉴权,而不是使用cookie,所以恶意网站一般不容易对这种后台服务做CSRF攻击。
而CORS一般是指客户端浏览器在收到网站B的javascript或者一些网页的标签比如<image>时,这些标签或者javascript尝试访问、加载另外一个非同源的网站A的资源,这时,网站A可以设定是否允许CORS访问,对于CORS访问限制,是浏览器设置的。浏览器在正式访问网站A前,会发一个OPTION请求,询问网站A是否允许跨域访问。
所以CSRF与CORS的区别还是很大的。CSRF对于浏览器来说就是一个正常的访问,没有OPTION操作,不涉及同源、跨域的问题。