웹 애플리케이션이 다른 도메인이나 출처의 리소스에 접근할 수 있도록 해주는 규칙
이미지 출처: https://www.descope.com/blog/post/cors-errors
요청(첫번째 화살표)
사용자가 웹 브라우저에서 특정 웹 페이지를 요청할 때 발생
위그림에서는 example.com에서 api.example.com에 데이터를 요청하는 경우, 이 요청의 출처는 example.com
요청 헤더(두번째 화살표)
브라우저는 요청을 보낼 때 여러 헤더를 포함하며 이 중 Origin 헤더는 요청이 발생한 출처를 나타내고 서버는 이 헤더를 통해 요청의 출처를 확인함
서버 응답(세번째 화살표)
서버는 요청을 처리한 후 응답을 반환하며, 이 응답에 CORS 관련 헤더를 포함함 위 그림에서, Access-Control-Allow-Origin 헤더를 통해 허용된 출처를 명시합니다.
Access-Control-Allow-Origin(네번쨰 화살표)
이 헤더는 서버가 특정 출처에서 오는 요청을 허용하는지를 정의하고 요청한 출처가 허용된 경우, 브라우저는 응답을 사용가능 그렇지 않으면 요청이 차단
(has been blocked by CORS policy: 라고 뜨면서 API 통신 막히면 아주 짜증난다 CORS....)
CORS 헤더 확인: 서버가 올바르게 CORS 헤더(Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers)를 설정하고 있는지 확인
올바른 경로 및 출처 설정: CORS 설정이 요청을 보내는 출처와 일치하는지 확인하고 특정 경로에만 CORS를 허용했다면 요청하는 경로가 그에 포함되어야 함
프리플라이트: 실제 요청을 보내기 전에,서버가 해당 요청을 허용할지를 확인하기 위해 사용되는 것
Access-Control-Allow-Origin: 요청을 허용할 출처를 지정
Access-Control-Allow-Methods: 허용할 HTTP 메서드를 지정
Access-Control-Allow-Headers: 클라이언트가 요청 시 사용할 수 있는 사용자 정의 헤더를 지정
서버측 예시 코드
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 상용(실제 라이브 서비스중인 어플리케이션)에서는 모든 허용인 * 로 하면 안댐!!)
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}