CORS는 Cross-Origin Resource Sharing의 줄임말이다. 도메인 주소가 다른 서버에 http request를 전송해 리소스에 접근할 수 있도록 하는 매커니즘을 말한다. 다른 출처(도메인, 프로토콜 혹은 포트)를 가진 리소스를 요청할 때, 웹 프로그램은 cross-origin http request를 실행한다.
예를 들어, naver.com
에서 api.google.com
으로 http request를 보내면 CORS가 된다. top level domain, 심지어 포트번호만 틀려도 CORS이다.
ex)
만일 내가 서비스하고 있지 않은 사이트에서 http request를 통해 리소스에 접근이 가능하다면, 보안상의 문제가 발생할 수 있다. 따라서 최신 웹 브라우저들은 보안상의 이유로 자신이 속한 도메인내에서만 서버 요청을 허용하고, 다른 도메인의 서버 요청을 차단한다.
위 문제를 해결하기 위해 일반화된 CORS 표준이 제안되었다. CORS 표준은 브라우저와 서버에 그들의 권한을 가진 원격 URL을 요청할 수 있는 방법을 제공하는 HTTP 헤더를 정의해준다. 이 헤더에서는 내 origin에 대한 정보, 어떤 http method (GET, POST, PUT, DELETE 등)을 사용해 request를 보낼 것이고 어떤 헤더들을 포함할 것인지를 담는다. 외부 브라우저는 이 헤더를 보고 리소스에 대한 접근을 허용여부를 판단한다.
CORS의 종류는 다음 4가지가 있다
그 중 Simple Request와 Preflight Request에 대해 알아보자.
Simple Request : 굳이 CORS로 막을 필요가 없는 simple한 http request다. 이 조건을 충족하려면 다음과 같은 사항을 만족해야 한다
Preflight Request (사전 요청) : 사전 요청을 보내서 서버가 해당 엔드포인트에 CORS request를 해도 되는지 허락을 받고 난 후에 request를 보내는 방법이다. OPTION 메소드를 사용한다. OPTION 메소드는 웹 서버에서 지원되는 메소드의 종류를 확인할 경우 사용된다. 과정은 다음과 같다
[Request]
OPTIONS /
Host: service.example.com
Origin: http://www.example.com
[Respose]
Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Methods: PUT, DELETE
퍼가요~💟