不少朋友在學習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}">複製代碼