프로젝트 회고, 리팩토링/스택오버플로우 팀 프로젝트

[Pre-Project] CORS Proxy우회 트러블슈팅

plla2 2023. 6. 25. 18:53

6/22

오늘은 백엔드팀에서 준 api를 받아서 원래 사용하고 있었던

express 로컬 대신 aws를 통해 배포된 api를 가지고 데이터 패칭을 해볼 수 있었다.

하지만 그 과정이 쉽지않았다.

일단 먼저 cors를 하기위해서 프록시 설정을 해주어야 했는데

프록시를 써볼일이 잘 없었던터라 여기저기 구글링해보고 gpt의 힘을 빌릴수밖에 없었다.

 

하지만 프록시를 우리 프론트엔드팀이 제대로 잘못쓰고 있었다...

 

❌ 에러 발생과정

  • 서버에서 데이터를 가져오기 위해서 axios 라이브러리로 서버와 통신 -> CORS 에러발생
  • CORS 에러를 처리하기 위해서 vite빌드도구의 프록시 설정법은 vite.config.js파일에서 프록시를 설정해주었다.
  • vite.config.js 파일에 서버와 통신을 하는 모든 api주소를 작성하였다. (뭔가 이때부터 쎄했음. 이렇게 통신하는 api를 하나하나 다 프록시 설정을 해주어야한다고..??) 하지만 질문전체리스트는 잘 받아와지기에 어? 되네??
  • 하지만 되네??는 잠시였고 질문상세페이지의 데이터들을 받아오려는 api에서는 계속 에러코드404가 계속 발생됐다.
  • 분명 param, url 오타없고 잘 설정해주었는데 그리고 여러방법으로 수정을 반복했지만 404에러는 없어지지 않았다.

프론트엔드팀 한분이 매우 집요하게 밤늦게까지 검색해보고 알아본 결과

프록시 설정자체를 잘못했다는 것이였다.

 

✅ 해결방법

수정 전 코드

 

위처럼 api요청 하나하나마다 프록시 설정을 해주어야한다고 생각하여 위처럼 작성하였었다.

하지만 id파라미터가 동적으로 바뀌는 api에서는 계속 404에러가 발생하였다.

 

수정 후 코드

 

❗️ 수정 전 문제점

  • 수정 전에는 axios를 통해 get요청하는 부분에는 proxy 타겟을 똑같이 적어야 된다고 생각했다.
  • 그리고 타겟인 백엔드 api주소에도 그대로 파라미터를 추가해서 작성했다.
// vite.config.js

	'/question/:id':{
        target: http://ec2-13-209-35-180.ap-northeast-2.compute.amazonaws.com:8080/question/:id,
        changeOrigin: true,
        secure: false,
        rewrite: (path) => path.replace(/^/api/, '/question/:id'),
      },
// axios 요청 코드부분

  useEffect(() => {
    axios.get(/question/${params.id})
    .then(res => {
       setQuestionList(res.data.data)
        console.log(res.data.data);
      })
      .catch(error => console.log(error));

 

🔓 정리

  • 프록시 설정을 해줄 때는 /api (해당 이름은 자유롭게 설정가능) 라는 경로를 설정을 먼저 해두고,
    axios 주소 적는 곳에 /api 경로를 포함한 주소 뒤에 파라미터를 붙여야한다.

  • rewrite를 통해 /api는 empty해지고, 결국 위의 수정 전 문제 예시로는 question.id가 1인 질문을 클릭하면 프록시상으로는 
    axios.get('/api/question/1')와 같이 요청이 되는 것이고, 실제로는 http://ec2-13-209-35-180.ap-northeast-2.compute.amazonaws.com:8080/question/1 로 요청이 전달되는 것이다.