본문 바로가기
Network

CORS

by orioncsy 2023. 2. 18.

CORS

개념

Origin

SOP & CORS

  • SOP(Same Origin Policy)
    • 다른 origin으로 요청을 보낼 수 없도록 금지하는 브라우저 기본 보안 정책이다.
    • 예외
      • RFC 6454에서 <script> 태그로 javaScript를 실행하는 경우
      • <link> 태그로 스타일 시트 불러오는 경우
      • HTML 문서를 화면에 보여주는 경우
      • CORS 정책을 지키는 요청
    • CSRF 같은 공격을 방지하기 위한 것이다.
      • 브라우저에서 로그인한 사용자에게 해커가 다른 링크를 누르도록 유도하여 인증 정보를 담아서 해커가 작성한 javascript를 코드를 실행하도록 하는 공격
  • CORS(Cross Origin Resource Sharing)
    • 다른 Origin의 요청도 처리할 수 있도록 하는 브라우저 정책

CORS 동작 원리

기본 동작

  • 브라우저가 헤더에 있는 origin에 자신의 origin을 담아서 요청을 보낸다.
  • 서버가 요청을 받아 응답 헤더 중 Access-Controll-Allow-Origin에 허용하는 origin 목록을 담아서 보낸다.
  • 브라우저가 응답 헤더 Access-Controll-Allow-Origin에서 요청 Origin이 있는지 검사한다.
  • Access-Controll-Allow-Origin에 와일드카드(*)를 사용하면 모든 origin을 허용한다.

Simple Request

  • 특정 조건을 만족하는 경우에 preflight 요청 없이 한 번에 요청을 전송할 수 있다.
  • 이름과는 달리 특정한 조건을 맞추기 까다롭다.
  • 메서드가 GET, POST, HEAD 중 하나여야하고 User Agent가 자동으로 설정한 헤더를 제외하면 쓸 수 있는 헤더가 제한적이며 Content-type도 한정적이다.
  • 동작 방식은 기본 동작과 같다.

Preflight Request

  • Simple Request의 조건에서 벗어난 요청의 경우 해당된다.
  • 말 그대로 사전 요청을 보내고 안전한 origin인지 확인 후 요청을 보내는 방식
  • 동작 방식
    • 클라이언트에서 메서드로 OPTIONS를 사용, Origin은 자신, Access-Control-Request-Method와 Access-Control-Request-Headers에 실제 요청에 사용할 메서드와 헤더를 작성해서 사전 요청을 보낸다.
    • 요청을 받은 서버가 Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers, Access-Control-Max-Age에 허용되는 origin, method, header, 사전 요청을 캐싱할 시간을 설정하여 응답한다.
    • 클라이언트에서 확인 후 실제 요청을 보낸다.

Credentialed Request

  • 요청할 때 쿠키나 Authorization 헤더에 토큰 값 등 인증 정보가 포함될 때 별도로 따라야 하는 요청
  • XMLHttpRequest, jQuery의 ajax나 axios를 사용하면 withCredentials를 true로 설정
  • fetch API를 사용하면 credentials 옵션을 include로 설정
  • 서버는 Access-Control-Allow-Origin에 와일드 카드(*)가 아닌 origin을 설정해야 하고 Access-Control-Allow-Credentials를 true로 설정해야 한다.

Reference

[Web] CORS (Cross Origin Resource Sharing) 이해하기

'Network' 카테고리의 다른 글

HTTP Status Code  (0) 2023.04.08
OSI 7 Layers  (0) 2023.02.18
REST  (0) 2023.02.17
HTTP 메서드  (0) 2023.02.16
HTTP와 HTTPS의 차이점  (0) 2023.02.15