react에서 axios를 이용해 nest서버로 요청을 보냈는데
network error가 발생했다.
에러의 종류는 CORS 에러였는데
간단하게 CORS에 대해 알아보자면
CORS는 Cross Origin Resource Sharing의 약자다.
한글로는 교차 출처 리소스 공유라고 부르는데
여기서 Origin에 주목할 필요가 있다.
origin은 protocol, hostname, port의 집합이다.
예를들어 http://localhost:3000이 프론트 주소고
http://localhost:8080이 백엔드 주소라면
이 둘은 protocol이 http로 동일하고,
hostname이 localhost로 동일하지만,
port는 3000과 8080으로 서로 다르다.
그렇기 때문에 프론트와 백엔드 서버는 Origin이 다른게 된다.
다음으로는 웹에서 규정된 SOP에 대해 알아야 한다.
SOP는 Same Origin Policy인데
한글로는 동일 출처 정책이라고 한다.
특정 origin에서 불러온 데이터가
다른 출처에서 불러온 리소스와 상호작용하는 것을
제한해서 서버가 공격 받을 수 있는 경로를 줄여주는 보안 정책이다.
결국 웹에서는 SOP 때문에 다른 origin의 리소스에 접근하는 것을 제한한다.
내가 만난 network error도
origin이 http://localhost:3000인 리액트 앱에서
origin이 http://localhost:8080인 네스트 서버에
요청을 했기 때문에 발생한 에러였다.
다시 CORS로 돌아와서,
아까 CORS는 교차 출처 리소스 공유라고 했다.
말그대로 origin(출처)이 다른 데이터(리소스)를 공유한다는 뜻인데
내 경우와 같이 origin이 다르면 SOP에 의해
데이터를 공유하지 못하므로 이를 CORS에러라고 한다.
CORS 에러의 해결방법은 쉽다.
리액트에서 package.json 파일에 코드 한줄을 추가하면 된다.
{
"name": "likelionsnsmusic",
"version": "0.1.0",
...
// 아래 코드 한 줄(리액트앱이 사용중인 origin)을 추가하면 된다.
"proxy":"http://localhost:3000",
...
}
이렇게 하면 프록시 설정이 되어서
프론트와 백엔드의 origin을 동일하게 설정해줄 수 있다.
프론트와 백엔드의 origin이 동일하면
SOP를 위반하지 않고, CORS 에러가 발생하지 않게 된다.
'코딩 > 오류 모음집' 카테고리의 다른 글
React Hook useEffect has a missing dependency 오류 해결하기 (0) | 2023.08.26 |
---|---|
react에서 axios 사용 시 404에러 해결 방법 (0) | 2023.08.24 |
이 시스템에서 스크립트를 실행할 수 없으므로 어쩌구 .ps1 파일을 로드할 수 없습니다. 오류 해결 방법 (0) | 2023.08.22 |
리액트에서 axios로 POST 요청할 때 401 오류 해결 후기(feat : object형 데이터 사용 오류) (0) | 2023.08.17 |
PC카톡에서 [동영상 뷰어에서 재생할 수 없는] 오류 발생 시 (0) | 2023.04.24 |