CORS란 무엇인가! 완벽정리
코스 정리
CORS : Cross-Origin Resource Sharing
1. 브라우저 정책과 보안
브라우저는 보안상 이유로 서버와 클라이언트가 정해진 헤더를 통해 서로 요청이나 응답에 반응할지 특정 규칙에 따라 제한함.
SOP : Same-Origin Policy
- 정의: 동일한 출처에서만 자원을 요청할 수 있도록 제한하는 보안 정책
- 목적: 서로 다른 출처 간의 정보 공유를 방지하여, 악의적인 스크립트가 사용자 데이터를 도용하거나, 웹사이트 간의 공격을 시도하는 것을 차단
- 구성: 프로토콜, 호스트, 포트 -
https://www.example.com:443
CORS : Cross Origin Resource Sharing
- 정의: CORS는 다른 출처에서 자원을 공유할 수 있도록 허용
- 역할: 기본적으로 SOP에 의해 차단되는 요청을 허용해 주는 역할. 서버에서 특정 조건을 만족시키면, 브라우저가 다른 출처의 요청을 허용함
2. CORS 동작 원리
CORS는 브라우저와 서버 간의 요청/응답 헤더를 통해 다른 출처의 자원을 공유할 수 있도록 설정함
리퀘스트와 리스폰스 헤더
- Origin 헤더 (요청 헤더)
- 브라우저가 요청을 보낼 때, 현재 페이지의 출처를
Origin
헤더에 포함시킴
- 브라우저가 요청을 보낼 때, 현재 페이지의 출처를
-
Access-Control-Allow-Origin 헤더 (응답 헤더)
- 서버가 응답 시, 허용할 출처를 이 헤더에 지정
- 브라우저는 요청의
Origin
과 응답의Access-Control-Allow-Origin
을 비교하여 출처가 같은지 파악하여 허용 여부를 결정
CORS 동작 시나리오
- Simple Request
- 조건 : 특정한 헤더와 메서드(
GET
,POST
,HEAD
)만 사용해야 하며, 기본적인 콘텐츠 타입만 허용 - 특징 : 추가적인 검증 없이 요청이 바로 전송. 거의 사용하지 않음
- 조건 : 특정한 헤더와 메서드(
- Preflight Request
- 역할 :
- 브라우저는 본 요청을 보내기 전에, 서버가 요청을 허용하는지 미리 확인하기 위해
OPTIONS
메서드로 예비 요청을 보냄. - 서버가 허용한 경우에만 본 요청이 전송
- 브라우저는 본 요청을 보내기 전에, 서버가 요청을 허용하는지 미리 확인하기 위해
- 특징 :
- 대부분의 CORS 요청이 이 방식으로 처리
- 서버는
Access-Control-Allow-Origin
에 와일드카드(*
)를 사용해 모든 출처를 허용가능
- 역할 :
- Credentialed Request
- 조건 : 요청에 쿠키나 인증 헤더 같은 자격 증명(Credentials)이 포함된 경우 사용됨
- 특징 :
- 서버는
Access-Control-Allow-Origin
에서 와일드카드를 사용할 수 없고 허용할 특정 출처를 지정해야 함 Access-Control-Allow-Credentials
헤더를true
로 설정해야 함
- 서버는
3. CORS 에러와 해결책
브라우저에서 SOP 정책때문에 요청이 막히면 콘솔에 CORS 에러가 발생한다. 그런데 왜 SOP 에러가 아니라 CORS에러라고 하는 거지? -> 브라우저 입장에서 다른 출처 요청이 들어왔을때, 별도의 CORS 설정을 해주면 다른 출처 요청을 보내줄께~ 라고 해서 CORS 에러를 던진다고 생각하면 됨
CORS 문제 해결 방법
- 서버 측 설정 : 서버에서 응답 헤더에
Access-Control-Allow-Origin
을 추가하여, 요청을 허용할 출처를 명시 - 프론트엔드 설정 : 프론트엔드에서 서버에 요청할 때, 서버가 허용할 수 있도록 CORS 설정을 요청