브라우저는 기본적으로 SOP ( Same Origin Policy ) 정책을 따르고 있기에 같은 출처가 아닌 다른 출처 ( 도메인, 서브 도메인, 프로토콜, 포트가 다른 것 )에 요청을 보낼 경우 제한됨
다른 출처 간의 상호작용을 해야하므로 ( 다른 출처의 API를 사용한다던지 외부 리소스를 쓴다던지 )몇 가지 예외 조항을 두고, 이 조항에 해당하는 리소스 요청은 출처가 다르더라도 허용
⇒ CORS 정책을 지킨 리소스 요청
⇒ 즉, CORS 라는 정책에 위반되지 않으면 정상적으로 리소스를 요청할 수 있게 해줌
교차 출처 리소스 공유 ( 교차 출처 : 다른 출처 )
도메인이 다른 서버끼리 리소스를 주고 받을 때 보완을 위해 설정된 정책
도메인 1의 웹 브라우저가 도메인 2의 서버에서 리소스를 요청
도메인 2 서버는 응답을 반환하지만, 웹 브라우저는 CORS 정책을 검토 후 응답을 사용할지 결정
만약 CORS 정책이 지켜지지 않았다면 응답 받은 것을 폐기
같은 출처인지 다른 출처인지를 구분하는 방법은 URL의 구성 요소 중 Protocol, Host, Port 이 세 가지만 동일하면 됨
Origin 헤더를 포함하며, 서버는 Access-Control-Allow-Origin 헤더로 응답하여 요청을 허용할지 결정Simple Request ( 단순 요청 )
조건을 만족하면 별도의 검증 없이 바로 요청을 보냄
Simple Request의 조건
Authorization 같은 인증 헤더 사용 불가)Content-Type이 다음 중 하나application/x-www-form-urlencodedmultipart/form-datatext/plain동작 방식
Origin 헤더를 포함하여 서버에 요청 보냄Access-Control-Allow-Origin 응답 헤더를 반환주의사항
application/json을 사용하면 Simple Request가 아님 ( Preflight Request로 전환됨 )Authorization 헤더를 포함하면 Simple Request가 아님Preflight Request ( 사전 요청 )
브라우저가 요청을 보내기 전에 "이 요청이 안전한지" 미리 확인하는 과정
Preflight Request가 필요한 경우
Content-Type이 Simple Request에서 허용되지 않는 값 (예: application/json)Authorization, X-Custom-Header 등)동작 방식
Access-Control-Allow-Origin: https://example.comAccess-Control-Allow-Methods: POST, GET, OPTIONSAccess-Control-Allow-Headers: Authorization, Content-TypeAccess-Control-Max-Age: 86400 (Preflight 요청을 캐싱)주의사항
Access-Control-Max-Age를 설정하면 Preflight 요청을 캐싱하여 성능 최적화 가능Credential Request ( 인증된 요청 )
쿠키, 토큰 등 인증 정보가 포함된 요청
Credential Request의 조건
credentials 옵션 사용)fetch("https://example.com/data", {
method: "GET",
credentials: "include", // 쿠키 포함
});Access-Control-Allow-Credentials: true 필수Access-Control-Allow-Origin 값은 ( 와일드카드 ) 사용 불가, 특정 Origin 지정 필요Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true동작 방식
Access-Control-Allow-Credentials: true 헤더를 포함하여 응답주의사항
Access-Control-Allow-Origin: * 와 Access-Control-Allow-Credentials: true를 함께 사용할 수 없음https://example.com 등)CORS 예외: 왜 Postman은 CORS 정책에 안 걸릴까?
CORS는 브라우저에서만 적용되는 정책이기 때문!
CORS 오류 해결 방법
Access-Control-Allow-Origin에 클라이언트 Origin 명시Access-Control-Allow-Methods, Access-Control-Allow-Headers 설정Access-Control-Max-Age 설정)Access-Control-Allow-Origin에 사용 불가Access-Control-Allow-Credentials: true 설정CORS 정책을 이해하고 적절한 설정을 하면, 다양한 도메인 간 안전한 통신이 가능하다!
웹 브라우저의 동작 원리
요청을 보낼 때 브라우저는 Origin 헤더를 포함
Origin: https://domain1.com
도메인 2 서버가 응답을 반환
Access-Control-Allow-Origin 헤더가 포함되어 있어야 함Access-Control-Allow-Origin: https://domain1.com브라우저가 응답을 확인
Access-Control-Allow-Origin에 domain1.com이 없으면즉, CORS는 서버가 응답을 보내는 것이 아니라, 브라우저가 이를 사용할 수 있는지 여부를 판단하는 보안 정책 !!