CORS는 Cross-Origin Resource Sharing의 줄임말로, 교차 출처 리소스 공유를 의미하며, 교차 출처는 '다른 출처'라고 생각하면 이게하기 쉽습니다. 즉, 다른 출처 간의 자원을 공유하는 정책이라고 생각하면 됨.
Protocol, Host, Path, Query String, Fragment 구성 요소 중 출처(origin)는 Protocol과 Host, 그리고 :80, :443같은 포트번호까지 모드 합친 것을 의미한다.
CORS에 대한 개념을 이해하기 전에 SOP이 무엇인지 알아야함.
SOP란 같은 Origin에만 요청을 보낼 수 있게 제한하는 보안 정책을 의미함.
이 중에 하나라도 구성이 다르면 SOP 정책에 걸리기 때문에 ajax 요청을 보낼 수 없음.
http://www.example.com/dir/page.html 에 요청을 보낼 때 예시
기본적으로 웹 클라이언트 애플리케이션이 다른 출처의 리소스를 요청할 때는 HTTP프로토콜을 사용하여 요청을 보내게 되고 이때 브라우저는 요청 헤더에 Origin 이라는 필드에 요청을 보내는 출처를 함께 담는다.
Origin: https://google.com 과 같이 출처를 담아서 서버로 보내면, 서버는 응답 헤더의 Access-Control-Allow-Origin이라는 값에 이 리소스를 접근하는 것이 허용된 출처 목록을 담아준다. 이후 응답을 받은 브라우저는 자신이 보냈던 요청의 Origin과 서버가 보내준 응답의 Access-Control-Allow-Origin을 비교한다. 만약 허용되지 않는 Origin이면 CORS 정책 위반 이슈가 발생하며, 여기서 주의할 점은 서버의 응답은 200번이 온다는 것이다.
Preflight Request 방식은 일반적으로 사용하는 방식으로, 브라우저는 요청을 한 번에 보내지 않고 예비 요청과 본 요청으로 나누어서 서버로 전송한다. 이때 예비 요청은 OPTIONS 메소드를 사용하여 본 요청을 보내기 전에, 브라우저 스스로 이 요청이 안전한지 확인하는 역할을 한다.