CORS란
브라우저에서는 보안적인 이유로 cross-origin HTTP 요청들을 제한한다. 그래서 cross-origin 요청을 하려면 서버의 동의가 필요하다. 만약 서버가 동의한다면 브라우저에서는 요청을 허락하고, 동의하지 않는다면 브라우저에서 거절한다.
이러한 허락을 구하고 거절하는 메커니즘을 HTTP-header를 이용해서 가능한데, 이를 CORS(Cross-Origin Resource Sharing)라고 부른다. 그래서 브라우저에서 cross-origin 요청을 안전하게 할 수 있도록 하는 메커니즘이다.
-> cross origin 이란?
cross-origin이란 다음 중 한 가지라도 다른 경우를 말한다.
- 프로토콜 - http와 https는 프로토콜이 다르다.
- 도메인 - domain.com과 other-domain.com은 다르다.
- 포트 번호 - 8080포트와 3000포트는 다르다.
CORS가 필요한 이유
CORS가 없이 모든 곳에서 데이터를 요청할 수 있게 되면, 다른 사이트에서 원래 사이트를 흉내낼 수 있게 된다.
예를 들어서 기존 사이트와 완전히 동일하게 동작하도록 하여 사용자가 로그인을 하도록 만들고, 로그인했던 세션을 탈취하여 악의적으로 정보를 추출하거나 다른 사람의 정보를 입력하는 등 공격을 할 수 있다.
이러한 공격을 할 수 없도록 브라우저에서 보호하고, 필요한 경우 에만 서버와 협의하여 요청할 수 있도록 하기 위해서 필요하다.
CORS의 동작방식
Simple requests인 경우
- 서버로 요청을 한다.
- 서버의 응답이 왔을 때 브라우저가 요청한 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
'IT정보 > 북마크털기 📚' 카테고리의 다른 글
[북털] Spring VS Spring Boot (0) | 2022.08.23 |
---|---|
[북털] 브라우저는 어떻게 렌더링될까? (0) | 2022.02.16 |
[Javascript] var, let, const 차이, Hoisting(호이스팅) (0) | 2022.02.15 |
[북털] HTML vs PHP (0) | 2022.02.15 |
[북털] async & await, Promise와 차이 (0) | 2022.02.15 |