CORS는 'Cross Origin Resource Sharing'의 약자이다.
한국말로 풀이하면 교차 출처 자원 공유라고 할 수 있는데 이게 뭔 말이냐면
어떤 한 출처(origin)에서 실행되고 있는 웹 어플리케이션이
다른 출처(cross origin)에도 접근할 수 있도록 브라우저에게 알려주는 걸 말한다.
출처(origin)는 프로토콜, 도메인, 포트의 세 가지를 말한다.
이 세 가지가 일치하면 동일 출처, 하나라도 일치하지 않는다면 다른 출처가 되는 것이다.
(http와 https는 프로토콜이 다르므로 다른 출처이다.)
아래는 그 예시이다.
쉽게 말해 교차 출처 자원 공유는
다른 출처의 자원도 공유하게 해 준다라는 뜻이다.
현재 모든 cross site HTTP에는 SOP(Same-Origin-Policy)라고
동일 출처 정책이 적용돼 있는데 웹에서 다른 출처의 자원을 가져오는 건 흔한 일이기 때문에
몇 가지 예외사항을 둬서 교차 출처(다른 출처)를 사용할 수 있도록 되어 있다.
예외 사항의 종류로는,
이 정도가 있다.
웹은 개발자 도구를 이용해 DOM의 구조, 서버와의 통신 정보, 리소스 출처 등을
자유롭게 열람이 가능하기 때문에 XSS나 CSRF와 같은 취약점을 노린
해킹 기법들로부터 안전하지 못했다.
그래서 위와 같은 정책이 만들어지게 되었다.
Simple Request와 Preflight Request, Credentialed Request로 나눌 수 있다.
1. Simple Request
서버로 요청을 보내면 서버는 응답을 하게 되는데,
이때 요청한 출처와 응답한 헤더값(Access-Control-Request-Headers)을 비교해서
유효 요청일 때 자원을 응답한다.
만약 유효하지 않다면 브라우저에서 막고 에러를 발생시킨다.
특징
제약사항
2. Preflight Request
예비 요청이라는 뜻으로 개발할 때 가장 많이 마주치는 시나리오이다.
브라우저가 요청을 한 번에 보내지 않고 예비 요청과 본 요청을 나누어
서버에 전송하는 방식이다.
특징
3. Credentialed Request
보통 API 요청 메서드는 쿠키 정보를 싣지 않는다.
하지만 Credentials 옵션을 통해 요청 헤더에 쿠키를 넣을 수도 있다.
특징