1. ホーム
  2. java

スプリングセキュリティ CSRF対策

2022-02-20 21:30:34
<パス

CSRFとは、Web上でよく見られる攻撃の1つであるCSRF(Cross-site request forgery)のこと。
Spring Security 4.0から、アプリケーションへのCSRF攻撃を防ぐためにCSRF保護機能がデフォルトで有効になり、PATCH、POST、PUT、DELETEメソッドに対してSpring Security CSRFが保護されるようになりました。
私の側はspring bootのプロジェクトで、@EnableWebSecurityアノテーションを有効にすると自動的にcsrf保護が有効になります。
そのため、デフォルトの設定では、ログインしていても、ページ内で起動したPATCH、POST、PUT、DELETEリクエストは拒否されて403を返してしまい、そのためにはリクエストインターフェースにcsrfTokenを追加する必要があります。
freemarkerなどのテンプレートエンジンやjspを使用している場合、フォーム送信のために、以下の隠しフィールドを追加することができます。

<input type = "hidden" name = "${_csrf.parameterName}" value = "${_csrf. token}" /> 


JSONを使用している場合、HTTPパラメータでCSRFトークンを送信することはできません。代わりに、HTTP ヘッダーでトークンを送信することができます。典型的なパターンは、CSRF トークンをメタトークンに含めることです。JSPの例を以下に示します。

<html> 
<head> 
	<meta name = "_csrf" content = "${_csrf.token}" /> 
	<! -- The default title name is X-CSRF-TOKEN --> 
	<meta name = "_csrf_header" content = "${_csrf.headerName}" /> 
</ head> 


その後、すべての Ajax リクエストにトークンを含めることができます。jQueryを使用している場合、これは以下を使用して行うことができます。

var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$.ajax({
	url:url,
	type:'POST',
	async:false,
	dataType:'json', //returned data format: json/xml/html/script/jsonp/text
	beforeSend: function(xhr) {
		xhr.setRequestHeader(header, token); //Set the csrfToken to the request header before sending the request
	},
	success:function(data,textStatus,jqXHR){
	}
});


CSRF保護を有効にしたくない場合は、以下のようにspring securityの設定でcsrfを無効にすることができます。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
            	...
        http.csrf().disable(); //unprotect csrf
    }
}