본문 바로가기
IT정보/북마크털기 📚

[북털] CORS란? CORS 에러

by narang111 2022. 2. 16.

CORS란

브라우저에서는 보안적인 이유로 cross-origin HTTP 요청들을 제한한다. 그래서 cross-origin 요청을 하려면 서버의 동의가 필요하다. 만약 서버가 동의한다면 브라우저에서는 요청을 허락하고, 동의하지 않는다면 브라우저에서 거절한다.

이러한 허락을 구하고 거절하는 메커니즘을 HTTP-header를 이용해서 가능한데, 이를 CORS(Cross-Origin Resource Sharing)라고 부른다. 그래서 브라우저에서 cross-origin 요청을 안전하게 할 수 있도록 하는 메커니즘이다.

 

 

-> cross origin 이란?

cross-origin이란 다음 중 한 가지라도 다른 경우를 말한다.

  1. 프로토콜 - http와 https는 프로토콜이 다르다.
  2. 도메인 - domain.com과 other-domain.com은 다르다.
  3. 포트 번호 - 8080포트와 3000포트는 다르다.

 

CORS가 필요한 이유

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

 

 

 

CORS에러 해결 방법

에러는 다음과 같은 환경에서 나는 것 같다

- 클라이언트에서 외부 API 서버로 바로 요청을 보내서 CORS 문제가 발생.. 등

 

 프록시 서버 사용해서(프록시 서버를 사용해서 우회하는 방법) 해결할 수 있다.

 

 

 

-> 프록시 서버란?

클라이언트가 프록시 서버 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해준다.

브라우저와 서버 간의 통신을 도와주는 중계서버라고 생각하면 쉽다.

 

 

react 공부를 하면서 영화 목록에 들어갈 영화 API를 가져오려고 할 때 CORS에러가 났던 것이 생각났다....

잘 기억해두기

 

 

참고블로그

https://hannut91.github.io/blogs/infra/cors

 

CORS란 무엇인가? – Yunseok's Dev Blog

 

hannut91.github.io

https://xiubindev.tistory.com/115

 

나를 너무나 힘들게 했던 CORS 에러 해결하기 😂

🔥 사건의 발단 : 외부 API 호출 때는 바야흐로 2020년 3월. 프론트엔드 공부를 시작한 지 얼마 되지 않은 채 홀로 토이 프로젝트를 진행하던 중이었다. 코로나 바이러스 관련 웹서비스를 만들고자

xiubindev.tistory.com