Spring Boot CORS 설정하기

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{ } }
댓글을 사용할 수 없습니다.