CORS란

CORS(Cross-Origin Resource Sharing: 교차 출처 자원 공유)란 웹 브라우저에서 도메인이 서로 다른 서버끼리 요청을 주고 받을 수 있게 하는 보안 정책이다. 만약 요청을 처리하는 도메인 서버가 요청을 보내는 도메인 서버에 대해 공유 설정을 하지 않았다면 CORS 에러가 발생한다.

기본적으로 SOP(Same Origin Policy)를 따른다. SOP는 같은 출처에서만 리소스를 공유할 수 있다는 보안 정책이다. 그러나 웹 환경에서 서로 다른 출처에 있는 리소스를 가져와서 사용하는 것은 흔한 일이기 때문에 몇 가지 예외 조항을 두고 이 조항에 해당하는 리소스 요청은 출처가 다르더라도 허용하기로 했는데, 그 중 하나가 CORS 정책을 지킨 리소스 요청이다.

왜 이런 정책이 만들어졌을까?

웹에서 동작하는 애플리케이션은 사용자의 공격에 취약하다. 브라우저의 개발자 도구를 열면 DOM이 어떻게 작성되었는지, 리소스의 출처는 어디인지와 같은 각종 정보를 쉽게 확인할 수 있다. 이런 상황 속에서 서로 다른 출처를 가진 애플리케이션 간의 통신에 대해 아무런 제약도 존재하지 않는다면 악성 사용자가 정보를 탈취하기 쉬워지고, 일반 사용자를 악성 사이트로 접속을 유도하는 등의 문제가 발생할 수 있다.

같은 출처의 구분

host, scheme, port가 동일하면 같은 출처로 간주한다.

Simple Request

(출처: Mozilla)

 

CORS Preflight(일종의 사전작업, 예비 요청)을 거치지 않는 요청이다.

  • 조건
      1. 요청의 메소드는 GET, HEAD, POST 중 하나여야 한다.
      1. Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, Width를 제외한 헤더를 사용하면 안된다.
      1. 만약 Content-Type를 사용하는 경우에는 application/x-www-form-urlencoded, multipart/form-data, text/plain만 허용된다.
  • 2, 3번 조건으로 인해 현실적으로 만족시키기 어렵다.

 

Preflight Request

(출처: Mozilla)

 

Preflight Request에서 브라우저는 요청을 예비 요청과 본 요청으로 나누어 서버에 전송하게 된다. preflighted request는 위에서 논의한 simple requests와 달리, 먼저 OPTIONS 메서드를 통해 다른 도메인의 리소스로 HTTP 요청을 보내 실제 요청이 전송하기에 안전한지 확인한다. Cross-site 요청은 유저 데이터에 영향을 줄 수 있기 때문에 이와 같이 미리 전송(preflighted)한다.

즉, POST와 같은 비멱등인 경우, 허용하지 않은 도메인이 서버 자원을 변경시킬 수 있기 때문에 이를 신경써줘야한다. 따라서 POST와 같은 경우는 위처럼 동작한다.

 

참고

https://velog.io/@usreon/CORS

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기