[CS] CORS(Cross Origin Resource Sharing)

해니·2023년 10월 1일
0

CS

목록 보기
8/15
post-thumbnail

CORS란?

  • Cross Origin Resource Sharing의 약자로, origin 간 리소스를 공유할 수 있도록 하는 정책
  • 브라우저는 보통 다른 origin에서 요청을 보내는 것을 금지하고, 같은 origin 간 공유를 허용하는 정책 (SOP,same-origin-policy) 을 사용한다
  • 브라우저는 http 관련 통신이 일어날 때 cors 검증을 해야하는 지 아닌 지 판단하고, 서버에 cors 검증을 요청한다.

💡 Open API 등 다른 출처(origin)에 자원을 요청하는 경우가 많아졌다. 다른 origin의 요청을 허용하기 위해 서버에서 허용한 origin과 헤더의 origin을 비교해 검사하는 것이 CORS의 핵심 원리이다.



출처(Origin)란?

  • Protocol, Host, port 번호 를 합친 것을 의미한다.
    • 같은 origin은 위 3개가 모두 동일한 것을 말한다.
  • origin 비교 과정
    • 클라이언트에서 서버로 요청을 보내게 되면 헤더에 origin이 담겨 보내진다.
    • 서버는 'Access-Control-Allow-Origin' 속성을 추가해 응답을 내려주는데, 이때 내려준 값과 헤더의 origin을 비교해 동일한 출처인지, 허용된 출처인지를 비교한다.



SOP(Same-Origin Policy)

  • 브라우저에서는 보안을 위해 같은 출처인 경우만 정보를 주고 받을 수 있도록 정책
  • CORS 에러는 브라우저가 보안을 위해 설정한 SOP 때문에 일어나는 것
  • 인터넷상의 악의적인 사이트들의 공격들을 막는데 도움이 된다. (CSRF, XSS, Clickjacking등의 공격)



Simple Request

  • 예비요청 없이 서버에 바로 요청을 보내는 방법
  • 서버에 바로 본요청을 보낸 뒤, 서버는 헤더에 Access-Control-Allow-Origin 값 등을 붙여 보내주면 브라우저가 CORS 정책 위반 여부를 검사한다.
  • 대부분의 REST API가 Content-Type 으로 application/json 을 사용하기 때문에 사실상 지켜지기 어려운 조건이고, 거의 대부분은 Preflight 방식으로 처리한다.


preflight request

  • 서버로 바로 요청을 보내는 Simple Request와는 다르게, 지금 보내는 요청이 유효한지를 확인하기 위해 OPTIONS 메서드로 예비 요청을 보내는 것
  • 용량이 큰 데이터를 body에 담은 요청이 CORS 정책을 위반하는 요청인 경우, 서버로 바로 요청을 보낼 시 불필요하게 리소스를 낭비하게 되고 서버 부하도 커진다.
  • 위와 같은 상황을 방지하기 위해 특정 조건인 경우 예비요청을 먼저 날려, 이게 유효한 요청인지 확인한다.




CORS 에러 해결 방법

  • 서버에서 응답 헤더에 특정 헤더를 포함하는 방식으로 해결
    • Access-Control-Allow-Origin: 특정 브라우저가 리소스에 접근이 가능하도록 허용한다
    • Access-Control-Allow-Method: 특정 HTTP Method만 리소스에 접근이 가능하도록 허용한다
    • Access-Control-Expose-Headers: 자바스크립트에서 헤더에 접근할 수 있도록 허용한다.
    • credentials: 쿠키 등의 인증 정보를 전달한다.






출처
CORS
[개발자 면접 질문] CORS에 대해서 설명해보세요.
[기술면접] CORS
[Interview] CORS에 대해 말씀해주세요.
Same-origin-Policy(SOP)
CORS와 관련 있는 preflight request란?
CORS의 기본 개념과 동작 방식(부제: Preflight 요청이란?)

profile
💻 ⚾️ 🐻

0개의 댓글