CORS(Cross-Origin Resource Sharing)는 브라우저의 동일 출처 정책(Same-Origin Policy) 때문에 기본적으로 차단되는
다른 출처(Origin)로의 리소스 요청을 “허용할지 말지” 서버가 결정하게 해주는 HTTP 기반 보안 메커니즘이다.
출처(Origin)는 아래 3가지 조합으로 결정된다.
즉, 셋 중 하나라도 다르면 다른 출처다.
https://example.com ↔ https://example.comhttps://www.google.com ↔ https://www.naver.comhttp://localhost:3000 ↔ http://localhost:8080http://example.com ↔ https://example.com너가 적은 내용 중 “프로토콜이나 포트 번호는 같을 수 있지만 도메인이 다르기 때문에 다른 출처”는 맞고,
더 정확히는 “도메인뿐 아니라 프로토콜/포트도 출처 구성요소”라서 하나만 달라도 다른 출처다.
브라우저는 기본적으로 보안 때문에 다른 출처로의 요청/응답을 제한한다.
domain1.comdomain2.com브라우저 입장에서는 서로 다른 출처라서,
domain1.com에서 실행 중인 JS가 domain2.com로 요청을 보내면 브라우저가 “서버가 허용했는지” 확인한다.
중요한 포인트: 요청이 아예 안 나가는 게 아니라, 브라우저가 응답을 막거나 사전검사(Preflight)를 한다.
브라우저가 강제하는 정책이라서,
해결은 보통 API 서버(domain2)에서 허용 설정을 해줘야 한다.
서버가 응답에 아래 같은 헤더를 내려주면 된다.
Access-Control-Allow-Origin: https://domain1.comAccess-Control-Allow-Credentials: trueAccess-Control-Allow-Methods: GET,POST,...Access-Control-Allow-Headers: ...CORS는 “다른 출처 요청을 브라우저가 기본적으로 막는데, 서버가 허용 여부를 HTTP 헤더로 알려주게 만드는 규칙”이다.