Spring Boot の CORS 設定を全許可する
Spring Boot のリファレンス 4.7.1. The “Spring Web MVC Framework” > CORS Support を見ると、次のように設定すれば良いように見えます。
// https://docs.spring.io/spring-boot/docs/2.4.2/reference/htmlsingle/#boot-features-cors
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(final CorsRegistry registry) {
registry.addMapping("/**").allowedMethods("*").allowedHeaders("*");
}
};
}
}
この設定は Spring MVC だけを使っている場合には上手くいきますが、 spring-boot-starter-security
を導入するとクライアントサイドでCORSの問題で通信が失敗するような状況が発生します。
なぜならば、 プリフライトリクエスト には Authorization
ヘッダ(等、規定されていないヘッダ)が含まれないため、プリフライトリクエストがSpring Securityフィルタで 401 Unauthorized
になって Spring MVC 部分まで到達しないからです。
幸い、Spring Securityには 上記で設定したCORS設定を CorsFilter
で統合できます。
コンフィグで CORS 有効化すればデフォルトでそのような設定になります。
// https://docs.spring.io/spring-security/site/docs/5.4.2/reference/html5/#cors
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
// ...
// 大抵の場合、CSRF対策機能は無効化する必要があるでしょう
// (CORSを許可する必要がある = JSリクエスト なので)
http.csrf().disabled();
// if Spring MVC is on classpath and no CorsConfigurationSource is provided,
// Spring Security will use CORS configuration provided to Spring MVC
http.cors(Customizer.withDefaults());
}
}