Cross-Origin Resource Sharing (CORS)

정미·2022년 7월 13일
0

Computer Science

목록 보기
30/81

교차 출처 리소스 공유

cross-origin

아래 중 한 가지라도 다른 경우

  1. 프로토콜 - http와 https
  2. 도메인 - abc.com과 abc-x.com
  3. 포트 번호 - 8080과 3000

CORS 정의

추가 HTTP 헤더를 사용하여 한 출처에서 실행 중인 웹 어플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제

브라우저는 보안을 이유(클라이언트가 무분별하게 다른 리소스로 접근하는 것을 막기 위함)로 cross-origin HTTP 요청을 제한하기 때문에 cross-origin 요청을 하려면 서버의 동의가 필요하다. 만약 서버가 동의한다면 브라우저는 요청을 허락하고, 서버가 동의하지 않으면 브라우저는 요청을 거절한다.
HTTP header를 이용하여 허락을 구하고 거절하는 메커니즘을 CORS라고 한다.
CORS를 통해 브라우저에서 cross-origin 요청을 안전하게 할 수 있다.

등장 이유

  • CORS 없이 모든 곳에서 데이터를 요청할 수 있게되면 다른 사이트에서 원래 사이트를 흉내낼 수 있게 된다. 이때 사용자가 모방 사이트에 로그인을 하면 로그인 세션을 탈취하여 정보를 빼가거나 공격을 할 수 있다.
  • CORS를 통해 브라우저는 공격을 할 수 없도록 보호하고, 필요한 경우에만 서버와 협의하여 요청할 수 있다.

동작 방식

Simple Request

  1. HTTP method가 다음 중 하나이고,
    • GET
    • HEAD
    • POST
  2. 자동으로 설정되는 헤더 제외, 설정할 수 있는 헤더들만 변경하면서,
    • Accept
    • Accept-Language
    • Content-Language
  3. Content-Type이 다음 중 하나인 경우
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

Simple Request의 경우

  1. 추가 확인 없이 바로 서버에게 본 요청을 보낸다.
  2. 응답이 오면 브라우저가 요청한 origin과 응답 헤더의 Access-Control-Request-Headers의 값을 비교하여
    1. 유효한 요청이라면 리소스 응답을 받는다.
    2. 유효하지 않은 요청이라면 브라우저에서 막고 에러를 발생시킨다.

Preflight Request

Simple Reqeust가 아닌 모든 cross-origin 요청

  1. 실제 요청을 보내는 것이 안전한지 확인하기 위해 cross-origin HTTP 요청을 보낸다.
    • Origin 헤더에 현재 요청하는 origin & Access-Control-Request-Method 헤더에 요청 HTTP method & Access-Control-Request-Headers 요청시 사용할 헤더를 OPTIONS 메서드로
    • Body 없이 Header만 전송
  2. 브라우저가 응답 헤더를 보고 유효한 요청인지 확인한다.
    1. 유효한 요청이라면 본 요청을 보내고 리소스 응답을 받는다.
    2. 유효하지 않은 요청이라면 요청은 중단되고 에러가 발생한다.

헤더 목록

요청

  • Origin
  • Access-Control-Request-Method
    • preflight 요청 시 실제 요청에서 어떤 메서드를 사용할 것인지 서버에게 알리기 위함
  • Access-Control-Request-Headers
    • preflight 요청 시 실제 요청에서 어떤 헤더를 사용할 것인지 서버에게 알리기 위함

응답

  • Access-Control-Allow-Origin
    • 브라우저가 해당 origin이 자원에 접근할 수 있도록 허용
    • * : credentials이 없는 요청에 한해 모든 origin에서 접근이 가능하도록 허용
  • Access-Control-Expose-Headers
    • 브라우저가 엑세스할 수 있는 서버 화이트리스트 헤더 허용
  • Access-Control-Max-Age
    • preflight 요청이 얼마나 오랫동안 캐싱될 수 있는지
  • Access-Control-Allow-Credentials
    • Credentials이 true일 때 응답이 노출될 수 있는지
    • preflight 요청에 대한 응답의 일부로 사용되는 경우 실제 자격 증명을 사용하여 본 요청을 수행할 수 있는지
    • 간단한 GET 요청(simple request)이 자격 증명이 있는 리소스를 요청일 때 헤더가 리소스와 함께 반환되지 않으면 브라우저는 응답을 무시하고 웹 컨텐츠로 반환하지 않는다.
  • Access-Control-Allow-Methods
    • preflight 요청에 대한 응답으로 허용되는 메서드들
  • Access-Control-Allow-Headers
    • preflight 요청에 대한 응답으로 실제 요청 시 사용할 수 있는 HTTP 헤더

출처

0개의 댓글