참조
웹 개발을 하다 보면, 한 번쯤은 다음과 같은 에러를 마주하게 된다.
⚠️ “Access to fetch at … has been blocked by CORS policy”
이 글에서는 CORS가 무엇인지, 왜 필요한지, 그리고 실제로 어떻게 동작하는지를 정리한다.

📚 CORS(Cross-Origin Resource Sharing) 는
서로 다른 출처(origin) 간의 리소스 요청을 브라우저가 제어하기 위한 보안 정책이다.
웹 브라우저는 기본적으로 같은 출처(Same-Origin)에서만 서버 응답을 사용할 수 있도록 제한한다.
브라우저에서 말하는 origin은 다음 세 요소의 조합이다.
1. 프로토콜 (http/https)
2. 도메인
3. 포트번호
예시:
http://localhost:3000http://localhost:8000CORS의 근본적인 배경은 Same-Origin Policy(SOP)이다.
🎯 Same-Origin Policy는 다음과 같은 공격을 방지하기 위해 존재한다.
🎯 따라서 브라우저는 기본적으로:
✨ 이때 서버가 "이 요청은 안전하다"고 명시적으로 알려주면, 브라우저가 응답 사용을 허용한다.
이 규칙이 바로 CORS이다.
중요한 것은 다음이다.

서버 응답에 포함되는 대표적인 헤더는 다음과 같다.
1️⃣ Access-Control-Allow-Origin
http://localhost:3000* (모든 origin 허용): ⚠️ 모든 웹사이트에 API를 공개하는 것과 같다🤓 언제 *를 써도 되는가?
→ 다음 조건을 모두 만족할 때만 고려할 수 있다: 인증 정보가 전혀 없는 API & 공개되어도 문제없는 데이터
(예: 공공 데이터, 상태 체크, 단순 헬스 API)
2️⃣ Access-Control-Allow-Methods
GET, PUT, POST, DELETE3️⃣ Access-Control-Allow-Headers
Content-Type, Authorization일부 요청은 실제 요청 전에 사전 확인 요청을 수행한다.
이를 Preflight 요청이라고 한다.
🎮 Preflight가 발생하는 경우
POST, PUT, DELETE 요청Content-Type: application/jsonAuthorization 헤더 사용🧑💻 동작 과정
⚙️ 1) “서버는 정상인데 프론트에서만 에러 난다”
⚙️ 2) “Postman에서는 되는데 브라우저에서는 안 된다”
⚙️ 3) “CORS 에러 = 서버 에러”
CORS는 브라우저가 다른 출처의 서버 응답을 사용해도 되는지를 서버의 허가를 통해 판단하는 보안 정책이다.