본문 바로가기
TIL/기술면접 대비

CORS(Cross Origin Resource Sharing)

by J1-H00N 2023. 8. 22.

우선 cross-origin 에 대해 알아야 하는데, cross-origin이란 다음 세 가지 중 하나라도 다른 경우다.

  1. 프로토콜
  2. 도메인
  3. 포트 번호

cors란

보안적인 이유로 브라우저가 cross-origin HTTP 요청들을 제한하는데, 이 요청을 허락하기 위해선 서버에서 동의를 해줘야 한다. 이러한 허락을 구하고 거절하는 메커니즘을 cors라 부른다.

즉, 브라우저에 cross-orign 요청을 안전하게 할 수 있도록 해주는 메커니즘이다.

 

그렇다면 cross-origin 요청을 제한하는 이유는 무엇일까?

해당 요청을 제한하지 않는다면 모든 곳에서 데이터를 요청할 수 있게 되는데, 그러면 다른 사이트에서 원래 사이트를 흉내낼 수 있게 된다. 그러면 사용자가 로그인한 세션을 탈취할 수 있고, 악의적으로 사용될 수 있다.

 

cross-origin 요청을 동의하는 이유는 무엇일까?

인터넷에서 다른 출처의 리소스를 가져와 사용하는 일은 매우 흔한 일이기 때문에, 무턱대고 막을 수는 없다. 그래서 몇 가지 예외 조항을 두고 다른 출처의 리소스 요청이더라도 이 조항에 해당한다면 허가하기로 했는데, 그 중 하나가 cors 정책을 지킨 리소스 요청이다.

 

cors 동작 원리

Simple requests인 경우

  1. 서버로 요청을 합니다.
  2. 서버의 응답이 왔을 때 브라우저가 요청한 Origin과 응답한 헤더 Access-Control-Request-Headers의 값을 비교하여 유효한 요청이라면 리소스를 응답합니다. 만약 유효하지 않은 요청이라면 브라우저에서 이를 막고 에러가 발생합니다.

Simple requests란?

HTTP method가 다음 중 하나이면서

  • GET
  • HEAD
  • POST

자동으로 설정되는 헤더는 제외하고, 설정할 수 있는 다음 헤더들만 변경하면서

  • Accept
  • Accept-Language
  • Content-Language

Content-Type이 다음과 같은 경우

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

Simple requqets라고 부릅니다. 이 요청은 추가적으로 확인하지 않고 바로 본 요청을 보냅니다.

 

preflight 요청일 경우

  1. Origin헤더에 현재 요청하는 origin과, Access-Control-Request-Method헤더에 요청하는 HTTP method와 Access-Control-Request-Headers요청 시 사용할 헤더를 OPTIONS 메서드로 서버로 요청합니다. 이때 내용물은 없이 헤더만 전송합니다.
  2. 브라우저가 서버에서 응답한 헤더를 보고 유효한 요청인지 확인합니다. 만약 유효하지 않은 요청이라면 요청은 중단되고 에러가 발생합니다. 만약 유효한 요청이라면 원래 요청으로 보내려던 요청을 다시 요청하여 리소스를 응답받습니다.

preflight 요청이란?

Simple requests가 아닌 cross-origin요청은 모두 preflight 요청을 하게 되는데, 실제 요청을 보내는 것이 안전한지 확인하기 위해 먼저 OPTIONS 메서드를 사용하여 cross-origin HTTP 요청을 보냅니다. 이렇게 하는 이유는 사용자 데이터에 영향을 미칠 수 있는 요청이므로 사전에 확인 후 본 요청을 보냅니다.

 

정리

프로토콜, 도메인, 포트 번호 중 하나라도 다른 HTTP 요청을 cross-origin 요청이라고 하는데, 이를 무조건 거절하면 다른 출처의 리소스를 가져와 사용할 수 없게 되고, 무조건 허가하면 해커가 심어놓은 코드가 실행돼 로그인 등의 상호작용에 따른 개인정보 응답 값을 가로채거나 내부망의 IP와 포트를 가져와 브라우저를 프록시처럼 악용할 수 있다. 따라서 몇몇 예외 상황을 두고 그에 해당할 때만 요청을 허가하거나 거절해야 하는데, 이 메커니즘이 cors다.

'TIL > 기술면접 대비' 카테고리의 다른 글

쿠키, 세션의 개념과 차이  (0) 2023.08.24
브라우저의 작동방식  (0) 2023.08.23
HTTP 메서드  (0) 2023.08.21
Primary Key, Foreign Key  (0) 2023.08.20
RDBMS의 정규화  (0) 2023.08.18