정의
다른 출처(origin) 간의 리소스 요청을 제어하는 브라우저 보안 정책
기본적으로 브라우저는 보안 상의 이유로 동일 출처(Same-Origin)가 아닌 요청을 차단하지만, 서버가 특정 헤더를 통해 허용할 수 있습니다.
특히 REST API 또는 마이크로서비스 환경에서 클라이언트-서버 분리가 일반화됨에 따라 필수적인 설정이 되었습니다.
특징
서버가 허용한 경우에만 교차 출처 요청 허용
출처(origin): 프로토콜 + 도메인 + 포트 조합을 의미합니다.
Preflight 요청: 실제 요청 전에 브라우저가 OPTIONS 요청을 통해 서버가 요청을 허용하는지 확인함
Access-Control-Allow-Origin: 허용된 출처를 명시 (예: https://example.com)
Access-Control-Allow-Methods: 허용된 HTTP 메서드 (예: GET, POST, PUT)
Access-Control-Allow-Headers: 허용된 요청 헤더 (예: Content-Type, Authorization)
Access-Control-Allow-Credentials: 인증 정보를 포함한 요청 허용 여부
Access-Control-Expose-Headers: 브라우저에서 접근 가능한 응답 헤더 지정
Access-Control-Max-Age: Preflight 요청 결과를 캐싱할 수 있는 시간(초 단위)
CORS 정책
CORS 정책은 서버가 브라우저의 교차 출처 요청을 수락할지 거부할지를 정의합니다.
즉, 서버가 응답 시 헤더를 통해 명시한 정책에 따라, 브라우저는 교차 출처 요청을 허용하거나 차단합니다.
- 정책의 주체: 브라우저는 정책을 실행하고, 서버는 정책을 설정합니다.
- 허용 방식: 명시된 출처만 허용되며, 인증 정보 포함 여부도 정책에 따라 달라집니다.
- 보안 목적: CORS 정책은 악의적인 도메인에서 무단으로 API를 호출하지 못하게 차단합니다.
사용 예시
프론트엔드 서버와 API 서버가 분리된 환경에서 사용
예시: http://localhost:3000에서 http://api.example.com으로 요청 시
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 86400
보안 고려사항
Access-Control-Allow-Origin: *로 설정할 경우, 모든 도메인에서 접근이 가능하므로 민감한 데이터가 노출되지 않도록 주의해야 합니다.
인증 정보(Credentials)를 포함한 요청에서는 와일드카드(*)를 사용할 수 없습니다. 명시적인 출처만 허용해야 합니다.
서버 설정이 허술하면 CSRF와 같은 공격에 취약해질 수 있으므로, 항상 신뢰할 수 있는 도메인만을 화이트리스트로 등록해야 합니다.