CORS 란?

Cross-Origin Resource Sharing, CORS 다른 출처의 자원을 공유할 수 있도록 설정하는것을 말합니다. CORS를 제대로 설정하지 않으면 원하는 리소스를 공유받지 못한다. CORS 문제를 Spring으로 해결하는 방법을 체크해본다. 

Configuration 해결하기

addMapping

registry.addMapping 을 이용해서 CORS를 적용할 URL패턴을 정의할 수 있다. 아래처럼 "/**" 와일드 카드를 사용할 수 있다. 

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

기본값은 아래와 같다.

  • Allow All Origins.
  • Allow Method GET, HEAD and POST.
  • Allow all headers
  • Set max age to 1800 seconds (30 min).

allowedOrigins

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*");
}

allowedOrigins 메소드를 이용해서 자원 공유 허락할 Origin 지정할 수 있다. 위 처럼 "*"로 모든 Origin을 허락할 수 있다. 

한번에 여러 Origin을 설정할 수 있다. 

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8080", "http://localhost:8081");
    }
}

 

allowedMethods

allowedMethods를 이용해서 허용할 HTTP method를 지정할 수 있다. "*"를 이용하여 모든 method를 허용할 수 있다. 

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST");
}

 

maxAge

maxAge를 이용해서 원하는 시간만큼 캐싱을 할 수 있다. 

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST")
                .maxAge(3000);
}

 

 

Annotation 이용하기

CrossOrigin 어노테이션을 이용하면 허용할 origins, methods 지정할 수 있다. 

@RequestMapping("/somePath")
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class SomeController {

	@CrossOrigin(origins="*")
    @RequestMapping(value = "/{something}",method = RequestMethod.DELETE)
    public ResponseEntity<String> delete(@PathVariable Long reservationNo) throws Exception{
    }
}