그렇다면 이러한 정책이 왜 필요한가?
먼저 "동일 출처 정책"에 대해서 알아야 한다.
쉽게 말하면, URL 주소이다.
하지만 "동일한 출처"는 정확히 똑같은 URL을 의미하는 것을 아니다.
동일한 출처는 URL 중에서도 프로토콜, 도메인 주소, 포트 번호가 같은 것을 의미한다.
예를 들면 아래와 같다.
그렇다면 CORS는 어떻게 안전하게 다른 출처와 리소스를 공유하는 것일까?
바로 두 가지 방법이 있는데,
이 있다.
Access-Control-Request-Method
요청을 할 때 어떤 메서드를 사용할 것인지를 알려주는 것
Access-Control-Request-Headers
요청을 할 때 어떤 헤더를 사용할 것인지 알려주는 것
Access-Control-Allow-Origin
리소스에 접근할 수 있도록 허용하는지를 알려주는 것
Access-Control-Expose-Headers
브라우저에게 접근할 수 있는 리스트들을 알려주는 것
Access-Control-Max-Age
캐싱되는 시간을 알려주는 것
Access-Control-Allow-Credentials
크레덴셜이 true일 때 요청할지에 대한 것을 알려주는 것
Access-Control-Allow-Methods
허용되는 메서드를 알려주는 것
Access-Control-Allow-Headers
사용 가능한 HTTP 헤더를 알려주는 것
이제 헤더에 대해 알아 보았으니 본격적으로 요청에 대해 다뤄보도록 하겠다.
조금 더 구체적으로 말하면 헤더에 Access-Control-Request-Method를 통해 요청하는 HTTP 메서드 GET,POST,PUT,DELETE 중 하나의 메서드와 Access-Control-Request-Headers를 통해 OPTIONS라는 헤더를 넣고 요청을 보낸다.
이 때 예비로 확인하는 것 뿐이기 때문에 바디에 아무것도 작성하지 않고 헤더만 보낸다,
해당 메서드와 헤더가 유효하다면 서버는 응답 헤더를 통해 접근 가능한지(Access-Control-Allow-Origin), 사용할 수 있는 리소스의 리스트(Access-Control-Expose-Headers), 캐싱 되는 시간(Access-Control-Max-Age) 등을 알려주는 것이다.
그렇다면 미리 확인하지도 않고 어떻게 안전하게 리소스를 요청하는 것일까?
그 방법은 조금 까다로운 조건들을 거는 것이다.
이렇게 까다로운 조건을 걸고 해당 조건에 부합하다면 안전한 요청이라 인식하고 데이터를 응답하는 형식이다.