Spring에서, CORS 설정을 하려면 @CrossOrigin
을 컨트롤러 클래스나 메소드에 추가를 하거나, WebMvcConfigurer
를 구현한 설정 클래스에 addCorsMappings
메소드를 오버라이드 하여 설정할 수 있다.
그러나 여기서 기본 설정만 했을 경우, Preflighted Requests에 대해서는 Cross Origin을 허가하지 않아 문제가 발생할 수 있다.
Spring의 CORS 기본설정은 다음과 같다.
@CrossOrigin
의 경우는
@CrossOrigin
와 연결된 컨트롤러 메소드의 HTTP 메소드전역 설정의 경우
허나, 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 요청을 완전히 지원하려면 추가로
나의 경우, 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