不少朋友在学习Spring Security的时候,会将CORS(跨站资源共享)和CSRF(跨站请求伪造)弄混,觉得两者是一回事。其实不是,先解释一下:前端
当咱们使用Spring Security的时候,这种CSRF漏洞默认的被防护掉了。可是你会发如今跨域请求的状况下,咱们的POST、DELETE、PUT等HTTP请求方式失效了。因此在笔者以前的文章中,咱们使用http.csrf.disable()
暂时关闭掉了CSRF的防护功能,可是这样是不安全的,那么怎么样才是正确的作法呢?就是本文须要向你们介绍的内容。web
一般的CSRF攻击方式以下:ajax
首先,咱们要先开启防御功能,在用户登录操做以后,生成的CSRF Token就保存在cookies中。spring
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringAntMatchers("/authentication");
.and()
...
}
}复制代码
至此,咱们生成了CSRF token保存在了cookies中,浏览器向服务端发送的HTTP请求,都要将CSRF token带上,服务端校验经过才能正确的响应。这个校验的过程并不须要咱们本身写代码实现,Spring Security会自动处理。可是咱们须要关注前端代码,如何正确的携带CSRF token。后端
在thymeleaf模板中可使用以下方式,在发送HTTP请求的时候携带CSRF Token。若是是先后端分离的应用,或者其余模板引擎,酌情从cookies中获取CSRF Toekn。跨域
var headers = {};
headers['X-CSRF-TOKEN'] = "${_csrf.token}";
$.ajax({
headers: headers,
});复制代码
$.ajax({
data: {
"_csrf": "${_csrf.token}"
}
});复制代码
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}">复制代码