CORS 에러는 왜 발생하는 것일까? 이 에러는 CORS 정책을 위반할 때 발생 하는 에러로 서버쪽에서 발생한 문제이다. CORS를 이해하기 위해 SOP를 먼저 살펴보자.
📍우선 URL 구조를 알아보자!
[이미지 출처]
url 구조에서 우리가 봐야할 부분은 protocol, host, port이다. 이 세가지의 부분을 합쳐서 출처(Origin)이라고 한다. 이 중 하나라도 다를 시에는 다른 출처로 판단되어지며 다른 출처로 판단된 리소스를 사용하는 것을 제안하는 방식을 SOP라고 한다.
🔎SOP(Same Origin Policy)
SOP는 다른 출처의 리소스를 사용하는 것을 제안하는 보안 방식이다. 하지만 웹을 사용할 때 다른 출처의 리소스를 비교적 자유롭게 사용할 수 있다. 다른 출처의 리소스를 자유롭게 사용할 수 있도록 하는것에 SOP의 예외조항인 CORS가 있다.
📜CORS(Cross-Origin Resource Sharing)
브라우저에서 다른 출처의 리소스를 공유하는 방법이다. CORS는 3가지의 동작 방식을 가진다.
Preflight Request
- options 메서드를 통해 다른 도메인의 리소스에 요청이 가능한지 먼저 확인 후에 요청이 가능할 경우 실제 요청(Actual Request)을 보내는 방식
- 한번 요청을 보낼 경우 두번의 요청이 보내짐
- Preflight Request
- origin :요청 출처
- Access-Control-Reqeust-Method : 실제 요청을 보낼 매서드
- Access-control-request-headers :실제 요청의 추가 헤더
- Preflight Response :
- Access-Control-Allow-Origin : 서버측 허가 출처
- Access-Control-Allow-Methods : 서버측 허기 메서드
- Access-Control-Allow-Headers : 서버측 허가 헤더
- Access-Control-Max-Age : preflight 응답 캐시시간
- Response Cache - preflight 응답을 브라우저에 캐싱해두고 요청을 보낼 때 캐싱된 내용을 먼저 확인한 후에 내용이 있다면 사전요청을 보내지 않고 실제 요청을 바로 보냄
[이미지 출처]
Simple Request
- preflight 요청 없이 바로 실제 요청을 날림
- Simple Request의 조건
- GET, POST, HEAD 메서드 중 한가지여야 함
- Content-Type :
- Application/x-www-form-unlencoded
- Multipart/form-data
- Text/Plain
- 헤더는 Accept, Accept-Language, Content-Language, Content-Type만 허용
[이미지 출처]
Credentialed Request
- HTTP Coockie나 HTTP Authentication 등을 Client에서 Request에 담아 서버로 보내고 싶을 때 사용하는 요청
- 기본적으로 브라우저는 Non credential로 설정되어 있기 때문에 재설정 필요
- 서버에서 Response Header에 Access-Control-Allow-Credentials :true를 포함해야 함
- 서버에서 응답 시에 Access-Control-Allow-Origin 헤더의 값으로 정확한 출처를 명시
🔑Preflight가 필요한 이유는 뭘까?
서버가 CORS를 모르고 있는 상태인 경우 발생할 에러를 방지하기 위해서이다. 서버가 CORS를 모르는 상태에서 실제 요청이 들어왔을 경우 에러가 발생하면 이미 서버에서 요청 처리를 해버렸기 때문에 큰 문제가 발생할 수 있다. 이를 방지하기 위해 미리 요청을 보내 CORS에러가 발생하는지를 확인하는 것이다.
[이미지 출처]
이를 통해 CORS 에러가 먼저 터진다면 서버에선 아무 문제를 일으키지 않고 이 에러를 해결할 수 있다.
🎉CORS 해결 방법
- Access-Control-Allow-Origin 설정 : Access-Control-Allow-Origin을 '*'를 설정하여 모든 외부 출처에서 접속할 수 있도록 설정, 편리해보이지만 보안문제가 있기 때문에 필요한 외부 출처를 일일이 적용하는 것이 좋음
참고자료
https://www.youtube.com/watch?v=-2TgkKYmJt4