5.2.0.RELEASEにてSpring Securityを使用する場合、以下のVaryレスポンスヘッダーが重複することがある。
- Origin
- Access-Control-Request-Method
- Access-Control-Request-Headers
特にこんな感じで@CrossOrigin
なControllerのテストを実行する際に重複してしまう。
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(SecurityMockMvcConfigurers.springSecurity()).build();
}
対象
Spring Framework 5.2.0.RELEASE (spring-web)
+ Spring Security使用
原因
エンドポイントに対し、Spring SecurityのCORSの設定と@CrossOrigin
アノテーションの両方を設定していると発生する。
これはDefaultCorsProcessor.java
のhandleInternal
メソッドからprocessRequest
メソッドにてVary headerを追加するように変更となったため。
Spring SecurityでのCORSとWebMVCでのCORSのFilterがかぶるようで2回実行されてしまうことがある。
public boolean processRequest(@Nullable CorsConfiguration config, HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.addHeader(HttpHeaders.VARY, HttpHeaders.ORIGIN);
response.addHeader(HttpHeaders.VARY, HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD);
response.addHeader(HttpHeaders.VARY, HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS);
...
回避方法
Spring Security configで以下のように設定しているcorsの設定をやめる。
@Override
public void configure(HttpSecurity http) throws Exception {
http...
.cors()
.configurationSource(this.corsConfigurationSource());
}
private CorsConfigurationSource corsConfigurationSource() {
...
}
これまではCorsFilterが2回走っても問題なかったが、ヘッダー付加の場所が変わってしまったため2回走ると重複するようになってしまった。
Spring SecurityのCORSの設定と@CrossOrigin
の2つ設定しちゃだめなんですかね。。
なにか他に良い解決方法があれば。。。。。
ちなみに、その他変更点も結構ある。5.2.0怖
https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-5.x