Post

nvm으로 Node 버전 변경 후 webpack-dev-server 프록시 ECONNREFUSED 해결기

nvm으로 Node 버전 변경 후 webpack-dev-server 프록시 ECONNREFUSED 해결기

문제 상황

nvm으로 Node.js 버전을 변경한 뒤, 프런트 개발 서버를 띄우면 아래와 같은 에러가 반복해서 발생했다.

1
2
[webpack-dev-server] [HPM] Error occurred while proxying request 
localhost:9000/api/ods to http://localhost:8080/ [ECONNREFUSED]
  • 프런트엔드: localhost:9000 → 정상 기동
  • 백엔드(Spring): localhost:8080 → 정상 기동
  • 하지만 프록시 요청이 백엔드까지 도달하지 않음
  • 백엔드 로그에도 요청 흔적이 없음

즉, 서버는 둘 다 떠 있는데 프록시만 안 붙는 상태였다.


처음 의심했던 것들 (하지만 아니었음)

  • 백엔드가 안 떠있나? ❌
  • 포트가 다른가? ❌
  • Docker 컨테이너 문제? ❌
  • CORS 문제? ❌ (아예 요청이 안 감)

여기서 중요한 힌트는:

브라우저 직접 접근은 되는데, webpack-dev-server 프록시만 실패한다

였다.


원인: Node 버전 변경 + IPv6 (localhost)

결론부터 말하면 원인은 IPv6였다.

무슨 일이 벌어졌나?

  • Node 17+ (특히 18, 20 이후) 부터는 👉 DNS 해석 시 IPv6(::1)를 우선 사용
  • localhost::1 (IPv6)
  • 하지만 백엔드(Spring)는 보통:

    • 127.0.0.1 (IPv4)에만 바인딩
  • 결과:

    1
    
    프록시(Node) → ::1:8080 ❌ (연결 거부)
    

그래서:

  • 브라우저에서는 잘 되고
  • webpack-dev-server 프록시만 ECONNREFUSED 발생

이 패턴, nvm으로 Node 바꾼 직후 자주 터진다.


해결 방법 (가장 확실한 방법)

✅ webpack 프록시 target을 localhost127.0.0.1 로 변경

변경 전

1
2
3
4
5
6
7
proxy: {
  '/api': {
    target: 'http://localhost:8080',
    secure: false,
    changeOrigin: true,
  },
},

변경 후

1
2
3
4
5
6
7
proxy: {
  '/api': {
    target: 'http://127.0.0.1:8080',
    secure: false,
    changeOrigin: true,
  },
},

실제 프로젝트에서는 webpack/webpack.dev.js 에서 아래 두 군데를 수정했다.

1
2
3
4
5
- target: `http${options.tls ? 's' : ''}://localhost:8080`
+ target: `http${options.tls ? 's' : ''}://127.0.0.1:8080`

- target: `http${options.tls ? 's' : ''}://localhost:${options.watch ? '8080' : '9060'}`
+ target: `http${options.tls ? 's' : ''}://127.0.0.1:${options.watch ? '8080' : '9060'}`

변경 후 npm start프록시 정상 동작 🎉 백엔드 로그에도 요청이 정상적으로 찍힘.


다른 해결 방법 (참고)

1️⃣ Node에 IPv4 우선 옵션 주기

1
set NODE_OPTIONS=--dns-result-order=ipv4first

하지만:

  • 환경변수 관리가 번거롭고
  • 팀원/CI 환경까지 고려하면

👉 프록시 target 수정이 가장 깔끔


정리

  • nvm으로 Node 버전 변경 후
  • webpack-dev-server 프록시에서 ECONNREFUSED
  • 서버는 다 떠 있는데 요청이 안 간다면?

👉 IPv6 (localhost → ::1) 문제를 의심하자

핵심 요약

  • http://localhost:8080
  • http://127.0.0.1:8080
This post is licensed under CC BY 4.0 by the author.