CORS란
CORS(Cross-Origin Resource Sharing: 교차 출처 자원 공유)란 웹 브라우저에서 도메인이 서로 다른 서버끼리 요청을 주고 받을 수 있게 하는 보안 정책이다. 만약 요청을 처리하는 도메인 서버가 요청을 보내는 도메인 서버에 대해 공유 설정을 하지 않았다면 CORS 에러가 발생한다.
기본적으로 SOP(Same Origin Policy)를 따른다. SOP는 같은 출처에서만 리소스를 공유할 수 있다는 보안 정책이다. 그러나 웹 환경에서 서로 다른 출처에 있는 리소스를 가져와서 사용하는 것은 흔한 일이기 때문에 몇 가지 예외 조항을 두고 이 조항에 해당하는 리소스 요청은 출처가 다르더라도 허용하기로 했는데, 그 중 하나가 CORS 정책을 지킨 리소스 요청이다.
왜 이런 정책이 만들어졌을까?
웹에서 동작하는 애플리케이션은 사용자의 공격에 취약하다. 브라우저의 개발자 도구를 열면 DOM이 어떻게 작성되었는지, 리소스의 출처는 어디인지와 같은 각종 정보를 쉽게 확인할 수 있다. 이런 상황 속에서 서로 다른 출처를 가진 애플리케이션 간의 통신에 대해 아무런 제약도 존재하지 않는다면 악성 사용자가 정보를 탈취하기 쉬워지고, 일반 사용자를 악성 사이트로 접속을 유도하는 등의 문제가 발생할 수 있다.
같은 출처의 구분
host, scheme, port가 동일하면 같은 출처로 간주한다.
Simple Request
(출처: Mozilla)
CORS Preflight(일종의 사전작업, 예비 요청)을 거치지 않는 요청이다.
- 조건
-
- 요청의 메소드는 GET, HEAD, POST 중 하나여야 한다.
-
- Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, Width를 제외한 헤더를 사용하면 안된다.
-
- 만약 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와 같은 경우는 위처럼 동작한다.
참고
'Backend > 📬Server' 카테고리의 다른 글
[Server] Redis와 서버 성능 개선을 위한 몇 가지 캐싱 전략들 (1) | 2021.11.29 |
---|---|
[Server] Elasticsearch 개념 이해 (0) | 2021.11.28 |
[Server] Websocket과 Stomp (0) | 2021.11.26 |
[Server] OAuth와 JWT 도입하기 (0) | 2021.11.24 |
[Server] RESTful API (0) | 2021.11.23 |