CORS(Cross-Origin Resource Sharing)

Gwon SeolHyeong·2020년 12월 3일
0

웹 어플리케이션 보안 완벽 가이드라는 책을 공부하면서 가장 먼저 나온 것이 CORS(교차 출처 리소스 공유) 이다.

웹 응용 프로그램에서 자바스크립트의 활용이 가능해지면서 동일 출처 정책 제한을 넘어 사이트 간 데이터 교환 요구가 강해졌다. 이 때문에 XMLHttpRequest 등 여러 방법으로 사이트 간 데이터를 교환할 수 있는 사양이 만들어진 것이 바로 CORS 이다.

결국, CORS는 기존 동일 출처 정책에 의존하는 응용 프로그램의 호환성을 유지하면서 데이터 교환을 가능하게 하는 정책인 것이다.

자, 그렇다면 우선 CORS가 무엇인지 자세히 알아보자.

CORS (Cross-Origin Resource Sharing)

CORS는 Domain 이나 포트가 다른 서버의 자원을 요청하는 일종의 매커니즘이다.

교차 출처 요청의 예시

https://domain-a.com의 프론트 엔드 JavaScript 코드가 XMLHttpRequest를 사용하여 https://domain-b.com/data.json을 요청하는 경우.

보안 상의 이유로, 브라우저는 스크립트에서 시작한 교차 출처 HTTP 요청을 제한한다. 예를 들어, XMLHttpRequest와 Fetch API는 동일 출처 정책을 따릅니다. 즉, 이 API를 사용하는 웹 애플리케이션은 자신의 출처와 동일한 리소스만 불러올 수 있으며, 다른 출처의 리소스를 불러오려면 그 출처에서 올바른 CORS 헤더를 포함한 응답을 반환해야 한다.

자, 그렇다면 예시로 책에 제공되는 사이트에서 자바스크립트로 다른 출처의 API를 호출하게 된다면 어떤 오류를 보여주는지 확인해보자.

(원인 : 'Access-Control-Allow-Origin' CORS 헤더가 없음) 이라고 표시되는 것을 볼 수 있다. 그렇다면 이제 'Access-Control-Allow-Origin' 이 무엇인지 알아보도록 하자.

Access-Control-Allow-Origin

Access-Control-Allow-Origin이란 교차 출처에서 읽기를 허가하기 위한 장치로, 정보의 출처가 HTTP 응답 헤더로 출력된다. 위 사이트에서 접근을 허가하려면 다음과 같은 HTTP 응답을 전송해야 한다

Access-Control-Allow-Origin: http://example.jp

간단한 요청의 요건

'간단한 요청;이란 다음 조건을 모두 만족하는 것이다. 이 조건은 HTML 폼으로 전송되는 요청보다 위험이 커지지 않는 범위로 정했다. HTML 폼은 원래 다른 사이트(출처)에 요청을 무조건 전송할 수 있기 때문에 HTML 폼 전송에 제한을 걸면 XMLHttpRequest로 교차 출처에 요청을 전송해도 위험도는 크게 변하지 않기 때문이다.

간단한 요청은 다음 중 하나의 메소드를 선택해야 한다.

  1. GET
  2. HEAD
  3. POST

XMLHttpRequest 객체의 setRequestHeader 메소드에서 설정하는 요청의 헤더는 다음으로 한정

Accept
Accept-Language
Content-Language
Content-Type

Content-Type 헤더는 다음 중 하나

application/x-www-form-urlencoded
multipart/form-data
text/plan

책에 수록되어 있는 CORS 내용에는 이 외에도 다양한 사전 점검 요청 처리에 대한 내용이 수록되어 있다. 이 글은 개발자의 시선으로 담는 내용이 아니기 때문에 자세한 소스코드는 생략하도록 한다.

마무리

책을 읽으면서 CORS를 통해서 쿠키를 요청 값에 포함시킬 수 있고 이를 방지할 수도 있다는 것을 알 수 있었다. 보안을 공부하는 사람의 입장으로 개발자의 의도를 파악하는 것이 중요하기 때문에 어떠한 목적으로 CORS 정책을 수립하였는지 파악할 수 있는 것도 중요하다고 생각이 된다.
또한, 헤더를 설정하는 것은 보안 상으로 CSRF 공격에 취약할 수 있으니 나중에 모의해킹을 시도할 때 응용할 수 있을 것으로 판단됨

요약

  • CORS는 Domain 이나 포트가 다른 서버의 자원을 요청하면 발생하는 메소드
  • 서버와 클라이언트가 분리되어 있다면 Cross-Origin HTTP 요청을 적용시키는 것이 좋은 방법
  • 공격을 하기 이전에 개발자의 의도를 파악하는 것이 우선
profile
정보보안 공부

0개의 댓글