브라우저는 Cross-Origin HTTP요청들을 받으면, 이를 보안상의 이유로 제한한다. Cross-Origin 요청에 대한 응답을 받기 위해서는 서버의 동의가 필요한데, 서버가 이를 동의할 경우 요청에 대한 응답을 처리하고, 그렇지 않을 경우 브라우저에서 거절한다.
이렇게 허락을 구하는 메커니즘은 HTTP-header를 통해 이뤄진다. HTTP-header를 통해 Cross-Origin HTTP 요청에 대한 허락을 구하는 것을 CORS(Cross-Origin Resource Sharing)라고 한다.
다음 중 하나에라도 포함된다면 Cross-Origin이다.
앞서 브라우저는 보안상의 이유로 Cross-Origin HTTP요청을 제한한다고 했다. 이렇게 Cross-Origin HTTP요청을 제한하고, CORS를 통해 서버로부터 허가를 받는 이유는 무엇일까?
CORS없이 모든 곳에서 데이터를 요청할 수 있게 된다면, 다른 사이트에서 기존의 사이트를 흉내낼 수 있게 된다. 이렇게 기존의 사이트를 흉내낼 경우, 사용자의 모방 사이트 로그인 세션을 통해 사용자의 로그인 정보를 얻고, 이를 통해 기존 사이트에 방문하여 사용자의 개인 정보를 악의적으로 탈취하거나, 피해를 입힐 위험이 생긴다. 이러한 사이버 공격을 예방하기 위해 CORS를 통해 서버로부터 허가를 받도록 해야한다.
Access-Control-Request-Headers
의 값을 비교하여 유효한 요청일 경우, 리소스를 반환하고, 그렇지 않다면 브라우저에서 이를 막고 에러를 발생시킨다.GET
, HEAD
, POST
) 중 하나이다. Accept
, Accept-Language
, Content-Language
)만 변경한다.application/x-www-form-urlencoded
, multipart/form-data
, text/plain
중 하나이다.위 조건들을 만족할 때 Simple request라고 한다. 이 경우, 추가적으로 확인하지 않고 바로 본 요청을 보낸다.
Access-Control-Request-Headers
헤더에 요청하는 HTTP method와 Access-Control-Request-Headers
요청 시 사용할 헤더를 OPTIONS 메서드로 내용물 없이 헤더만 서버로 전송한다.Simple request가 아닌 Cross-Origin 요청은 모두 preflight요청을 한다.