프로젝트를 해봤다면 아마 대부분은 CORS 이슈와 구면일 것 같다. CORS 이슈가 왜 발생할까?
우선 지금 만들고 있는 프로젝트를 예로 들어보자.
현재 Server는 localhost:4000 이고, Client는 localhost:3000 이다. 둘이서 request와 response를 주고 받는데 두 origin이 서로 다른 포트를 가지고 있기 때문에 서버는 아무 설정 없이 Request를 보낼 수가 없다. 보안적인 이슈가 생기기 때문이다. 다른 도메인을 가진 웹 사이트에서 우리 서버에 뭔가를 자꾸 보낼 수 있게 된다면 보안 이슈가 발생하고, 요것을 방지하기 위해서 CORS 정책이 존재한다.
즉, CORS(Cross-Origin Resource Sharing) 은 origin(Server와 Client)가 resource 를 sharing 할 때 발생할 수 있는 보안 이슈를 막기 위해 만들어 둔 정책이다.
위의 그림은 강의에서의 예제다. web document와 위의 web server의 도메인은 같은 도메인으로(domain-a.com) 항상 허용을 하지만 아래의 web server의 도메인은(domain-b.com)으로 다른 도메인이기 때문에 CORS 정책에 의해서 컨트롤이 된다.
해결하는 방법은 여러가지가 있다.
프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다. 서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 부른다.
위키백과에는 위와 같이 설명하고 있다.
유저 <-> Proxy Server <-> 인터넷
원래는 Client와 Server 둘이서 request와 response를 주고 받는데 중간에 Proxy Server를 넣어준다.
유저가 proxy server에 무언가를 보냈을 때 proxy server에서 어떤 것을 할 수 있는지 알아보자.
IP뿐만 아니라 data도 임의로 변경
방화벽 기능
웹 필터 기능
캐쉬 데이터, 공유 데이터 제공 기능
요 create-react-app 사이트에서 제공하는 proxy 세팅 방법를 보면서 따라해보자.
npm install http-proxy-middleware --save
위의 명령어로 모듈을 다운받자!
const { createProxyMiddleware } = require("http-proxy-middleware");
module.exports = function (app) {
app.use(
"/api",
createProxyMiddleware({
target: "http://localhost:4000",
changeOrigin: true,
})
);
};
사이트를 참조해서 요렇게 작성해주자! target에 본인의 프로젝트에 맞게 포트를 수정해주자.
useEffect(() => {
axios.get("api/hello").then((response) => console.log(response.data));
});
기존에 localhost:4000/api/hello 에서 api/hello 요렇게 변경해주자!
다시 실행해주면 CORS 정책 에러가 아니라 요렇게 servers/index.js 파일에서 /api/hello가 요청될 때 설정해둔 res.send 문구가 뜬다! 최고!👍
따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 를 공부하며 작성한 글입니다.