티스토리 뷰
브라우저에서는 보안적인 이유로 cross-origin HTTP 요청들을 제한한다.
서로 다른 도메인의 리소스 요청을 보내고 받게 되면, CORS 에러가 발생한다 !
예시로, 프론트엔드와 백엔드가 협업하게 되면, 각각 따로 서버를 띄우기에 CORS 문제가 발생할 수 있다.
그래서 cross-origin 요청을 하려면 서버의 동의가 필요하다.
만약 서버가 동의한다면 브라우저에서는 요청을 허락하고, 동의하지 않는다면 브라우저에서 거절한다.
.❗❕❗
이러한 허락을 구하고 거절하는 메커니즘을 HTTP-header를 이용해서 가능한데,
이를 CORS(Cross-Origin Resource Sharing)라고 부른다.
그래서 브라우저에서 cross-origin 요청을 안전하게 할 수 있도록 하는 메커니즘이다.
CORS란, (=Cross Origin Resource Sharing)
서로 다른 도메인간에 자원을 공유하는 것을 의미하며 기본적으로 차단되어 있다.
Origin이란 출처를 의미하며 Protocol + Host + Port를 합친 것을 말한다.
Origin이 같으면 CORS 에러는 발생하지 않는다.
예를 들어 아래 개발 환경은 포트가 다르기 때문에, Origin이 다른 것으로 판단되어 자원 요청 시 CORS 에러가 발생한다.
- http://localhost:8080
- http://localhost:8000
CORS 에러 해결 방법
CORS를 통해 다른 출처 리소스에 접근하기 위해서는 HTTP의 헤더를 사용해야 하는데, 이 방법을 통해 브라우저에게 권한을 부여하도록 알려줄 수 있다.
이 방법은 Simple request, Preflight 2가지 방법으로 나뉜다.
Simple request
- preflight를 사용하지 않고 바로 CORS 요청을 한다.
- GET, POST, HEAD Method 중 하나
- 서버는 request의 Origin의 정보 검사 후 옳다고 판단한 경우 Access-Control-Allow-Origin에 Origin 또는 *을 담아 response를 보낸다. Access-Control-Allow-Origin에 정보가 없다면 응답은 실패이다.
- 조건에 맞춰 HTTP 헤더 작성 후 서버에 request를 보낸다.
- 서버에서 request의 헤더 정보를 검사하고 Origin에 정보를 담아 응답한다.
- response 헤더의 Access-Control-Allow-Origin안을 확인하고 서버가 요청을 허용하는지 브라우저가 확인한다.
- 만약 헤더에 정보가 있다면 리소스에 접근할 수 있고, 없다면 에러가 발생한다.
Preflight
- 실제 요청을 하기 전에 이 도메인이 안전한지 확인하기 위한 request이다.
- GET, POST 뿐만 아닌 PATCH와 DELETE와 같은 메서드를 사용할 때 필요하다.
- 안전하지 않은 요청을 할 때 사용이 되는데, 안전하지 않은 요청이란 데이터에 직접적인 영향을 줄 수 있는 요청이라 할 수 있다. GET, POST 뿐만 아닌 PATCH와 DELETE와 같은 메서드를 사용할 때 필요하다.
- preflight는 OPTIONS 메서드와 두가지의 헤더가 사용된다.
- Access-Control-Request-Method: 요청하는 메서드
- Access-Control-Request-Headers: 추가적인 헤더
- 본 요청을 보내기 전 preflight request를 서버에 보낸다.
- 서버가 허락한다면 HTTP Status 200과 Access-Control-Request-Method , Access-Control-Request-Headers 를 응답한다. 만약 아니라면 에러를 발생시킨다.
- 이후부턴 Simple request 요청과 같다.
# 요약
CORS란 서로 다른 Origin간에 자원을 공유하는 것을 말하며 기본적으로 브라우저간에 차단되어있다.
Origin이란 출처를 말하며, Protocol + Host + Port를 합친 것을 의미한다.
CORS 에러는 서버에서 응답 헤더에 특정 헤더를 포함하는 방식으로 해결할 수 있다.
예를 들어 Access-Control-Allow-Origin을 통해 브라우저가 리소스에 접근이 가능하도록 허용할 수 있다.
CORS를 통해 다른 출처 리소스에 접근하기 위해서는HTTP의 헤더를 사용해야 하는데, 이 방법을 통해 브라우저에게 권한을 부여하도록 알려줄 수 있다. 이 방법은 Simple request, Preflight 2가지 방법으로 나뉜다.
'CS > 컴퓨터네트워크' 카테고리의 다른 글
REST API에 대해 설명해주세요. (0) | 2023.07.23 |
---|---|
TCP/IP Socket과 WebSocket의 차이점에 대해 설명해주세요. (0) | 2023.07.23 |
HTTP 요청방법중 GET과 POST에 대해 비교 설명해주세요. (0) | 2023.07.07 |
쿠키와 세션을 이용한 로그인 방식을 설명해주세요. (0) | 2023.07.07 |
쿠키와 세션 (0) | 2023.07.07 |