Overview

C.O.R.S(Cross-Origin Resource Sharing) 이며, 웹 브라우저에서 다른 출처(origin)의 리소스를 요청하는 걸 의미한다.

  1. 백엔드 API 서버와 프론트엔드 웹 애플리케이션이 다른 도메인에 호스팅 되있을때 사용한다.
  2. 여러개의 서비스가 서로 다른 도메인에서 운영될 때 CORS가 필요함.
  3. 외부 API를 사용하는 웹 애플리케이션에서 CORS 설정이 필요하기도 한다.

Usage

전역설정지역설정 을 통해 설정해줄 수 있다.

#1. 전역설정 : CoreRegistry
WebMvcConfigurer를 구현하여 Override를 통해 전역으로 설정한다.

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("*")
            .allowedMethods("GET", "POST")
            .allowedHeaders("Authorization", "Content-Type")
            .exposedHeaders("Access-Control-Allow-Origin")
            .allowCredentials(true)
            .maxAge(3600); // 브라우저가 preflight 요청의 결과를 캐시하는 시간을 초 단위로 지정한다.
    }
}


#2. 지역설정 : @CrossOrigin
@CrossOrigin 어노테이션을 사용하여 특정 컨트롤러나 메소드에 대해서만 적용해준다.

@RestController
@CrossOrigin(origins = "http://localhost:8080"
            , methods = RequestMethod.GET
            , allowedHeaders = {"*"}
            , exposedHeaders = {"Access-Contorl-Allow-Origin"}
            , allowCredentials = "true"
)
public class MainController {
    @GetMapping("/hello")
    public String main() {
        return "mainjson";
    }
}


추가적으로..

CORS는 많은 마이크로서비스 , api등의 환경에서 고려해야 될 기능으로 요구사항 및 보안정책에 따라 적절히 설정되어야 하며 io / nio, block / non-block 상황에서 request, response에 대한 처리 signal 등도 고려해야 된다. 나의 상황에서는 호출하는 API가 SSE로 응답이 비동기 스트리밍형식으로 응답을 주기 때문에 Origin, 헤더 설정, Credentials 설정에 대한 상세한 설정이 필요하다. 서버와 클라이언트간의 설정을 적절히 해야된다.