Spring MVC와 CORS 설정 - Preflighted Request

K PizzaCola·2021년 6월 3일
0

Spring

목록 보기
1/3
post-thumbnail

CORS 설정

Spring에서, CORS 설정을 하려면 @CrossOrigin을 컨트롤러 클래스나 메소드에 추가를 하거나, WebMvcConfigurer를 구현한 설정 클래스에 addCorsMappings 메소드를 오버라이드 하여 설정할 수 있다.

그러나 여기서 기본 설정만 했을 경우, Preflighted Requests에 대해서는 Cross Origin을 허가하지 않아 문제가 발생할 수 있다.

Spring의 CORS 기본설정은 다음과 같다.
@CrossOrigin의 경우는

  • All origins
  • All headers
  • @CrossOrigin와 연결된 컨트롤러 메소드의 HTTP 메소드

전역 설정의 경우

  • All origins.
  • All headers.
  • GET, HEAD, and POST methods.

기본 설정 시 문제점

허나, Simple Request 조건이 맞지 않아 Preflighted Request를 보내게 되는 경우엔 먼저 OPTIONS 요청을 보낸 후에 원래 요청을 보내게 된다.

그러므로, Spring에서 기본 설정만 한 경우에 OPTIONS 요청에 대해서는 CORS 허가가 되지 않아 요청에 실패하게 된다.

한편, HTTP 메소드에 대해서는 허가를 하더라도 Interceptor 등 에서 200 OK 응답을 보내지 않는 경우에도 요청에 실패하게 된다.

글로벌 설정 예

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/api/**")
            .allowedOrigins("https://domain2.com")
            .allowedMethods("PUT", "DELETE", "OPTIONS") // OPTIONS 메소드 허용
            .allowedHeaders("header1", "header2", "header3")
            .exposedHeaders("header1", "header2")
            .allowCredentials(true).maxAge(3600);

        // Add more mappings...
    }
}

결론

그러므로 CORS 요청을 완전히 지원하려면 추가로

  • HTTP OPTIONS 요청에 대해서 허가를 해야하며
  • OPTIONS 요청이 실패하지 않도록 해야한다.

나의 경우, JWT를 이용한 로그인 처리를 위해서 Interceptor를 사용했는데, OPTIONS 요청의 경우에도 Authorization 헤더가 없으면 에러가 발생하게 되어 CORS 요청이 실패하였다.

참고 문서

https://spring.io/guides/gs/rest-service-cors/
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-cors
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

profile
공부하는 개발자입니다.

0개의 댓글