0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Spring Framework 5.2.0 - CORSハンドリング変更によるVary header重複

Last updated at Posted at 2019-10-31

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.javahandleInternalメソッドからprocessRequestメソッドにてVary headerを追加するように変更となったため。
Spring SecurityでのCORSとWebMVCでのCORSのFilterがかぶるようで2回実行されてしまうことがある。

DefaultCorsProcessor.java
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の設定をやめる。

SpringSecurityConfig.java
@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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?