webpack-dev-server로 프록시 설정하기

문제 상황

로컬 개발 환경에서 프론트엔드는 3000번 포트, API 서버는 8080번 포트로 띄워서 작업하고 있었다. 당연히 CORS 에러가 발생했다.

fetch('http://localhost:8080/api/users')
  .then(res => res.json())
  .then(data => console.log(data));
// Error: No 'Access-Control-Allow-Origin' header

백엔드 팀에 CORS 헤더 설정을 요청할 수도 있었지만, 개발 환경에서만 발생하는 문제였고 프로덕션에서는 같은 도메인을 사용할 예정이라 프론트엔드에서 해결하기로 했다.

해결 방법

webpack-dev-server의 프록시 기능을 사용했다.

// webpack.config.js
module.exports = {
  // ...
  devServer: {
    port: 3000,
    proxy: {
      '/api': {
        target: 'http://localhost:8080',
        changeOrigin: true
      }
    }
  }
};

이제 /api로 시작하는 요청은 자동으로 8080 포트로 프록시된다.

// 같은 포트로 요청하면 됨
fetch('/api/users')
  .then(res => res.json())
  .then(data => console.log(data));

changeOrigin: true 옵션은 Origin 헤더를 타겟 URL로 변경해준다. 일부 API 서버에서 Host 헤더를 체크하는 경우 필요하다.

추가 옵션

API 경로를 재작성해야 하는 경우도 있었다. 예를 들어 /api/v1/users/users로 보내야 할 때:

proxy: {
  '/api': {
    target: 'http://localhost:8080',
    pathRewrite: { '^/api': '' },
    changeOrigin: true
  }
}

간단한 설정으로 개발 환경의 CORS 문제를 해결했다. 프로덕션에서는 Nginx 등에서 동일한 방식으로 처리하면 된다.