# 05-01 CORS 정책

### Q. CORS 정책이란 무엇이고 왜 사용하나요?

`CORS(Cross-Origin Resource Sharing)` 정책은 웹 브라우저가 다른 출처(Origin)로부터의 리소스 요청을 허용하거나 제한하는 보안 메커니즘입니다. 브라우저는 기본적으로 보안을 위해 동일 출처 정책(Same-Origin Policy)을 따르는데, 이는 한 출처의 웹페이지가 다른 출처의 리소스에 마음대로 접근하는 것을 막습니다.

CORS를 사용하는 주된 이유는 보안 때문입니다. 만약 동일 출처 정책이 없다면, 악성 웹사이트가 사용자의 브라우저를 통해 다른 도메인의 민감한 정보를 무단으로 읽어가거나 조작할 수 있게 됩니다. 예를 들어, 사용자가 로그인한 온라인 쇼핑몰의 개인 정보를 악성 사이트가 가로챌 위험이 생길 수 있죠.

하지만 현대 웹은 API 서버와 프론트엔드 서버가 다른 도메인에 있는 등 교차 출처 통신이 필수적입니다. 이때 CORS 정책이 없다면 브라우저가 이러한 정상적인 요청마저 차단해 버립니다.

CORS는 이러한 상황에서 안전하게 교차 출처 요청을 허용하는 표준화된 방법을 제공합니다. 서버가 `Access-Control-Allow-Origin` 같은 특정 `HTTP` 헤더를 응답에 포함하여, 브라우저에게 어떤 출처의 요청을 허용할지 명시적으로 알려주는 방식입니다. 이를 통해 개발자는 필요한 교차 출처 통신은 허용하면서도 웹 보안을 유지할 수 있습니다.

### Q. 만약 터미널에서 curl과 같은 도구를 사용하거나 postman 같은 도구를 이용해 백엔드 서버에 요청을 보내면 CORS로 막을 수 있나요?

아니요, `curl`이나 `Postman`과 같은 도구를 이용해 백엔드 서버에서 데이터를 가져오는 경우에는 **CORS 정책으로 막을 수 없습니다.**

`CORS(Cross-Origin Resource Sharing)` 정책은 오직 웹 브라우저가 주로 자바스크립트를 통해 다른 출처의 리소스에 접근하려 할 때만 적용되는 보안 메커니즘입니다. 이는 브라우저가 사용자 보호를 위해 웹 페이지에서 발생하는 교차 출처 요청을 통제하는 역할입니다.

`curl`이나 `Postman`과 같은 도구들은 웹 브라우저의 보안 모델이나 샌드박스 환경에 종속되지 않습니다. 이들은 웹 브라우저를 거치지 않고, 직접 HTTP 요청을 생성하고 서버로 전송합니다. 따라서 브라우저가 수행하는 동일 출처 정책 검사나 CORS 사전 요청인 `Preflight Request` 같은 일련의 보안 절차를 우회하게 됩니다. 서버 입장에서는 `curl`이나 `Postman`의 요청이 마치 일반적인 서버 대 서버 통신처럼 보일 뿐, 이들이 어떤 클라이언트 도구에서 왔는지 `CORS` 정책을 통해 구분하고 차단할 수는 없습니다.

이런 이유로 보통 백엔드에서는 CORS 외에 따로 인증과 인가에 관한 기능을 개발하여 보안을 강화합니다.

### Q. 말씀하신 내용 중 CORS 프리플라이트(Preflight) 요청은 무엇인가요?

브라우저는 요청이 `단순 요청(Simple Request)`의 조건을 충족하면, 프리플라이트 없이 바로 요청을 보내고, 그렇지 않으면 먼저 `프리플라이트 요청(Preflight Request)`을 보냅니다.

그 중 프리플라이트(Preflight) 요청은 실제 교차 출처 요청을 보내기 전에, 브라우저가 서버에게 "너 이 요청 받아줄 거야?" 하고 미리 허락을 구하는 과정입니다. 쉽게 말해, 본 통신 전에 예비 점검을 하는 거죠. 보통 HTTP `PUT`, `DELETE` 메서드와 같이 복잡한 교차 출처 요청일 때 트리거됩니다.

프리플라이트 요청은 `OPTIONS` 메서드를 사용하며, 실제 요청에 사용될 메서드, 헤더, 출처 등의 정보를 `Access-Control-Request-Method`, `Access-Control-Request-Headers`, `Origin` 등의 헤더에 담아 서버로 보냅니다.

서버는 이 `OPTIONS` 요청을 받으면, 자신이 허용하는 메서드, 헤더, 출처 등을 응답 헤더(예: `Access-Control-Allow-Methods`, `Access-Control-Allow-Headers`, `Access-Control-Allow-Origin`)에 담아 브라우저에게 알려줍니다.

만약 서버가 프리플라이트 요청을 통해 해당 교차 출처 요청을 허용하지 않는다고 응답하면, **브라우저는 실제 본 요청을 아예 보내지 않습니다.** 이렇게 함으로써 잠재적으로 위험하거나 서버가 예상하지 못한 교차 출처 요청이 서버에 도달하기 전에 미리 차단할 수 있습니다. 예를 들어, 민감한 데이터를 `DELETE` 메서드로 삭제하려 할 때, 서버의 명시적인 허용이 없으면 브라우저가 먼저 차단하여 의도치 않은 데이터 손실을 막는 데 도움을 주는 것이죠. 즉, **서버가 통신을 시작하기도 전에 보안 정책을 미리 파악하고 제어할 수 있게 해주는 안전장치** 역할을 합니다.
