spring.svg

【Spring Security】CORSの設定

SpringBoot

前提

ここではSpring SecurityのCORSの設定について説明します。 CORSについてよくわからない方は、こちらの記事を参考にしてください。 またSpring BootのCORSの設定が関係しているため、こちらの記事も参考にしてください。

設定方法

Spring Securityでは、様々なフィルターが実行されており、その中の1つにCorsFilterが動作しています。 CorsFilterについては、Spring Bootでの設定の記事に記載しています。

つまり、Spring Securityでも、Spring Bootと同様の設定になりますが、少しだけ記載方法が異なります。

WebSecurityConfig.java
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain secutiryFilterChain(HttpSecurity http) throws Exception {
        http.cors((cors) -> cors.configurationSource(corsConfigurationSource()))
            .csrf((csrf) -> csrf.disable());
        return http.build();
    }
    
    private CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
        configuration.setAllowedHeaders(Arrays.asList("X-Custom-Header"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

Spring Securityでは、フィルターの設定はSecurityFilterChainで行います。 CORSは、HttpSecuritycors()が該当します。 CORSの設定自体はSpring Bootの場合と同じでCorsConfigurationSourceに行い、引数として渡せば完了です。

内容は同じですが、以下のようにCorsConfigurationSource@Beanを付与する方法もあります。

WebSecurityConfig.java
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
    
    @Bean
    public SecurityFilterChain secutiryFilterChain(HttpSecurity http) throws Exception {
        http.cors(Customizer.withDefaults())
            .csrf((csrf) -> csrf.disable());
        return http.build();
    }
    
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

CORSを無効果する場合は、以下のようにdisable()を使用します。

WebSecurityConfig.java
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
    
    @Bean
    public SecurityFilterChain secutiryFilterChain(HttpSecurity http) throws Exception {
        http.cors((cors) -> cors.disable())
            .csrf((csrf) -> csrf.disable());
        return http.build();
    }
}