CORS(Cross-Origin Resource Sharing)는 서버가 특정 헤더로 '이 오리진의 자바스크립트가 내 응답을 읽어도 좋다'고 허락하면 브라우저가 동일 출처 정책을 완화해 주는 표준입니다.
핵심은 CORS가 서버 측 보안 장치가 아니라 '브라우저가 강제하는' 규칙이라는 점입니다. 응답을 읽을지 말지 결정하는 주체는 브라우저입니다.
동작은 이렇습니다. 브라우저가 교차 오리진 요청에 `Origin` 헤더를 붙여 보내면, 서버는 `Access-Control-Allow-Origin`으로 허용 오리진을 응답합니다. 값이 요청 오리진과 맞아야 브라우저가 자바스크립트에 응답을 넘겨줍니다. 쿠키 등 자격증명을 함께 보내려면 요청에 `credentials`를 켜고 서버가 `Access-Control-Allow-Credentials: true`를 주어야 하며, 이때 `Allow-Origin`에 와일드카드 `*`는 쓸 수 없습니다.
자주 하는 오해가 있습니다. (1) CORS는 서버를 보호하지 않습니다 — curl·서버 간 호출·모바일 앱은 CORS의 영향을 받지 않고 자유롭게 접근합니다. CORS는 오직 '브라우저 안의 다른 오리진 자바스크립트가 응답을 읽는 것'만 통제합니다. (2) 'CORS 에러'는 대개 서버 응답이 도착했는데 브라우저가 읽기를 차단한 것이지, 요청 자체가 실패한 게 아닙니다. 복잡한 요청은 실제 요청 전에 프리플라이트(OPTIONS)로 허가를 먼저 확인합니다.