GitHub에서 저장소를 가져오는 시간이 길고, Docker 이미지 다운로드가 중간에 멈추거나, npm install이 간헐적으로 실패하면 개발 환경 전체가 불안정해집니다. 이 문제는 단순히 회선 속도가 느려서만 발생하지 않습니다. 브라우저에는 프록시가 적용되어도 Git, Docker 데몬, Node.js 패키지 매니저는 별도의 설정을 사용하거나 프록시를 전혀 사용하지 않을 수 있기 때문입니다.
이 가이드는 PC의 시스템 프록시와 터미널 환경을 먼저 구분하고, GitHub·Docker Hub·npm 레지스트리에 각각 어떤 방식으로 연결 설정을 적용해야 하는지 설명합니다. Windows, macOS, Linux에서 공통으로 이해해야 할 원리와 Clash Verge, sing-box, Shadowrocket 같은 호환 클라이언트를 사용할 때의 주의점도 함께 정리합니다. 목표는 모든 트래픽을 무조건 우회하는 것이 아니라, 개발 도구에 필요한 요청만 안정적으로 연결하고 문제가 생겼을 때 원인을 빠르게 좁히는 것입니다.
개발 도구의 다운로드가 느린 이유부터 구분하기
웹 브라우저에서 사이트가 정상적으로 열리는데 GitHub fetch나 Docker pull만 느리다면 먼저 애플리케이션별 연결 경로를 의심해야 합니다. 브라우저는 운영체제의 HTTP 또는 SOCKS 프록시 설정을 자동으로 읽을 수 있지만, Git은 자체 설정이나 환경 변수를 우선할 수 있습니다. Docker CLI도 명령을 실행하는 셸과 실제 이미지를 가져오는 Docker 데몬이 서로 다른 프로세스이므로, 터미널에 프록시를 지정했다고 해서 데몬까지 같은 설정을 사용한다는 보장은 없습니다.
npm 역시 설정 파일인 .npmrc, 셸 환경 변수, 레지스트리 주소, 인증 토큰의 영향을 받습니다. 회사 네트워크나 공용 Wi-Fi에서는 HTTPS 연결 검사, DNS 지연, 방화벽, 패킷 손실이 추가로 발생할 수 있습니다. 이때 VPN 클라이언트가 연결되어 있어도 특정 앱만 직접 연결되거나, 반대로 로컬 저장소와 사내 도메인까지 외부 경로로 보내는 일이 생길 수 있습니다.
90+
국가 커버리지
200+
회선 수
5
지원 플랫폼
14일
환불 보장
개발 작업에서는 연결 상태만 확인하지 말고 요청의 종류를 나눠서 봐야 합니다. Git은 저장소와 객체를 가져오는 HTTPS 또는 SSH 연결을 사용하고, Docker는 레지스트리의 인증 및 이미지 레이어 다운로드를 수행합니다. npm은 레지스트리에서 메타데이터와 패키지 압축 파일을 여러 번 요청합니다. 하나가 정상이어도 다른 서비스가 같은 방식으로 동작한다고 단정할 수 없습니다.
개발 환경에 맞는 클라이언트와 분배 방식 선택하기
Windows와 macOS에서 GUI 클라이언트를 사용하는 경우에는 시스템 프록시 모드와 TUN 모드를 먼저 구분하세요. 시스템 프록시는 운영체제의 프록시를 인식하는 프로그램에 적합하지만, 모든 명령줄 도구와 백그라운드 서비스가 이를 따르는 것은 아닙니다. TUN 모드는 가상 네트워크 인터페이스를 만들어 더 많은 애플리케이션의 트래픽을 포착할 수 있지만, 관리자 권한, 네트워크 확장 권한, 방화벽 설정이 필요할 수 있습니다.
Clash Verge 계열 클라이언트는 일반적으로 HTTP 또는 SOCKS 포트와 규칙 기반 라우팅을 제공합니다. sing-box 기반 클라이언트는 JSON 구성과 TUN, mixed inbound 같은 기능을 사용할 수 있지만, 가져온 구독이 해당 코어의 문법과 기능을 지원하는지 확인해야 합니다. Shadowrocket은 iOS에서 앱별 규칙을 세밀하게 조정하는 데 유용하지만, iOS 기기에서 실행되는 개발 도구와 PC의 Docker 데몬을 직접 제어하는 도구는 아닙니다.
구독에 포함된 프로토콜이 Shadowsocks, VMess, Trojan, Hysteria2 또는 WireGuard라고 해서 모든 클라이언트에서 같은 방식으로 동작하는 것은 아닙니다. Hysteria2는 UDP 및 QUIC 계열 전송에 의존하므로 UDP가 제한된 네트워크에서는 오히려 연결이 불안정할 수 있습니다. WireGuard는 운영체제 수준의 터널로 동작하는 경우가 많아 라우팅과 DNS 설정을 별도로 확인해야 합니다. 클라이언트가 프로토콜 이름만 표시한다고 해서 전송 방식과 보안 옵션의 모든 조합을 지원한다는 뜻은 아닙니다.
| 환경 | 우선 확인할 방식 | 주의할 점 |
|---|---|---|
| 터미널에서 Git·npm 사용 | HTTP/HTTPS 프록시와 환경 변수 | 셸을 새로 열어 변수 적용 여부 확인 |
| Docker Desktop | Docker 엔진 또는 Desktop 프록시 설정 | CLI 프록시와 데몬 프록시는 별개일 수 있음 |
| Linux 서버 | 서비스 유닛과 daemon 환경 설정 | 사용자 셸 설정만으로 systemd 서비스가 바뀌지 않음 |
| 모바일 개발 환경 | 앱별 규칙과 DNS 동작 | 백그라운드 제한과 VPN 권한을 확인해야 함 |
- ✅ 먼저 시스템 프록시와 TUN 중 현재 필요한 범위를 선택합니다.
- ✅ Git, Docker, npm이 실제로 사용하는 연결 방식을 각각 확인합니다.
- ❌ 두 개의 VPN 클라이언트를 동시에 TUN 모드로 실행하지 않습니다.
- ❌ 프록시 주소와 포트를 확인하지 않고 설정 파일을 무작정 복사하지 않습니다.
GitHub fetch와 clone을 안정적으로 설정하는 방법
GitHub 저장소에 HTTPS로 접근한다면 Git 전역 설정에 HTTP 및 HTTPS 프록시를 지정할 수 있습니다. 클라이언트가 제공하는 HTTP 프록시 포트가 127.0.0.1에 열려 있다면 다음과 같이 현재 환경에 맞는 주소와 포트를 입력합니다.
git config --global http.proxy http://127.0.0.1:포트
git config --global https.proxy http://127.0.0.1:포트
git config --global --get-regexp 'http\..*proxy|https\..*proxy'
위 명령의 포트는 사용 중인 클라이언트 화면에 표시된 값을 사용해야 합니다. 임의의 포트를 넣으면 Git이 연결되지 않습니다. SOCKS 프록시만 제공되는 경우에는 Git 버전과 설치된 네트워크 라이브러리의 지원 상태가 다를 수 있으므로, 가능한 경우 클라이언트가 제공하는 HTTP 또는 mixed 포트를 우선 사용하는 편이 호환성 측면에서 간단합니다.
SSH 방식으로 저장소를 가져오는 경우에는 Git의 HTTP 프록시 설정이 적용되지 않습니다. SSH는 별도의 전송 경로와 키 인증을 사용하므로, HTTPS 주소로 저장소를 다시 확인하거나 SSH 클라이언트와 네트워크 환경에 맞는 별도 구성을 준비해야 합니다. 조직 저장소에서 SSH가 필수라면 키 파일 권한, 호스트 키 검증, 포트 차단 여부를 함께 확인하세요. 인증 오류와 네트워크 시간 초과는 원인이 다르므로 같은 문제로 취급하면 안 됩니다.
문제가 해결된 뒤에는 프록시 설정을 계속 유지할 필요가 있는지도 판단해야 합니다. 현재 네트워크에서만 필요한 임시 설정이라면 작업이 끝난 뒤 다음처럼 삭제할 수 있습니다.
git config --global --unset http.proxy
git config --global --unset https.proxy
Docker 이미지 다운로드에서 CLI와 데몬을 분리해 보기
Docker에서 가장 흔한 오해는 터미널의 프록시 환경 변수만 설정하면 docker pull에도 자동으로 적용된다고 생각하는 것입니다. 실제 이미지 다운로드는 Docker 데몬이 담당합니다. Docker Desktop을 사용한다면 Desktop의 네트워크 또는 프록시 설정을 확인해야 하고, Linux에서 Docker Engine을 systemd 서비스로 실행한다면 데몬 서비스에 프록시 환경을 지정해야 합니다.
셸에서 다음과 같은 환경 변수를 임시로 설정하면 Git이나 일부 명령줄 프로그램의 연결에 영향을 줄 수 있습니다.
export HTTP_PROXY=http://127.0.0.1:포트
export HTTPS_PROXY=http://127.0.0.1:포트
export NO_PROXY=localhost,127.0.0.1
Windows PowerShell에서는 환경 변수 문법이 다릅니다. 또한 이 변수는 현재 셸과 그 셸에서 시작한 프로세스에 전달되는 값일 뿐, 이미 실행 중인 Docker 데몬의 설정을 바꾸지는 않습니다. Docker Desktop과 원격 Docker 호스트를 혼동하지 않는 것도 중요합니다. 명령을 실행하는 PC와 이미지를 실제로 다운로드하는 서버가 다르면 서버 쪽 네트워크와 프록시를 설정해야 합니다.
프록시를 적용한 뒤에는 이미지 레이어 다운로드, 레지스트리 인증, 일반 웹 요청을 구분해서 확인하세요. 인증 토큰은 정상적으로 발급되지만 큰 레이어에서 중단될 수 있고, 반대로 레이어는 받아지지만 레지스트리 도메인 조회가 실패할 수도 있습니다. 사설 레지스트리나 사내 도메인은 NO_PROXY에 넣어야 하는 경우가 있지만, 범위를 넓게 지정하면 의도하지 않은 직접 연결이 생길 수 있으므로 필요한 도메인만 관리하는 편이 안전합니다.
npm install 실패를 줄이는 레지스트리와 프록시 점검
npm은 패키지 이름과 버전 정보를 조회하는 레지스트리 요청, 패키지 파일 다운로드, 의존성 잠금 파일 처리, 인증 토큰 검증을 순서대로 수행합니다. 따라서 브라우저에서 npm 관련 웹페이지가 열리는 것만으로 npm install이 정상이라는 의미는 아닙니다. 현재 npm이 어떤 레지스트리와 프록시를 사용하는지 먼저 확인하세요.
npm config get registry
npm config get proxy
npm config get https-proxy
npm config list
npm에 프록시를 지정해야 한다면 클라이언트가 제공한 HTTP 프록시 주소를 사용합니다. 조직 환경에서 인증 프록시를 이용하는 경우에는 사용자 이름과 비밀번호가 설정 파일이나 셸 기록에 남지 않도록 주의하세요. 토큰과 프록시 인증 정보는 공개 저장소, CI 로그, 화면 공유 자료에 포함되면 안 됩니다.
설정 파일에 오래된 레지스트리 주소가 남아 있으면 VPN을 켜고 끄는 것과 상관없이 설치가 실패할 수 있습니다. 프로젝트 폴더의 .npmrc가 사용자 전역 설정을 덮어쓸 수도 있으므로, 개인 설정과 프로젝트 설정을 따로 읽어야 합니다. 사설 패키지와 공개 패키지를 함께 사용하는 프로젝트라면 범위별 레지스트리 규칙이 올바른지 확인하고, 인증 토큰을 단순히 삭제하기보다 발급 주체와 만료 정책을 확인하세요.
CI에서 문제가 반복된다면 로컬 PC의 VPN 설정을 그대로 복사하는 방식은 피해야 합니다. CI 실행기는 별도의 네트워크에 있고, 비밀 변수와 프록시 환경 변수를 안전하게 주입해야 합니다. 로그에 HTTP_PROXY, HTTPS_PROXY, 토큰이 그대로 출력되지 않는지도 확인하세요. 패키지 캐시를 사용하는 환경에서는 캐시가 정상이어도 새 의존성 메타데이터 요청이 실패할 수 있으므로 캐시 문제와 네트워크 문제를 분리해 판단해야 합니다.
- 현재 레지스트리 주소와 프로젝트별
.npmrc를 확인합니다. - 프록시 환경 변수와 npm 자체 프록시 설정이 서로 충돌하지 않는지 봅니다.
- 인증 토큰의 저장 위치와 CI 로그 노출 여부를 점검합니다.
- 새 터미널에서 같은 명령을 실행해 환경 변수 적용 상태를 확인합니다.
- 특정 패키지만 실패하는지, 모든 패키지 요청이 실패하는지 구분합니다.
문제가 생겼을 때의 표준 점검 순서
개발 도구의 연결 문제를 해결할 때는 노드를 계속 바꾸기보다 범위를 좁혀 가는 것이 효율적입니다. 첫 단계는 클라이언트가 실제로 연결되어 있고 시스템 프록시 또는 TUN 모드가 의도한 상태인지 확인하는 것입니다. 다음은 터미널에서 프록시 변수와 Git·npm 설정을 출력해 서로 다른 값이 적용되고 있지 않은지 확인하는 단계입니다. Docker는 별도의 데몬 설정을 확인해야 합니다.
그다음 도메인 이름이 정상적으로 조회되는지, TCP 또는 TLS 연결이 설정되는지, 인증 단계에서 실패하는지 구분합니다. DNS만 실패한다면 프록시 노드보다 DNS 모드와 로컬 네트워크를 먼저 보아야 합니다. TLS 인증서 오류가 나타난다면 시스템 시간, 인증서 검사, 회사 네트워크의 HTTPS 검사 여부를 확인해야 합니다. 연결 시간 초과와 401 또는 403 같은 인증 응답은 서로 다른 유형의 문제입니다.
- ✅ 한 번에 하나의 VPN 클라이언트만 활성화하고 충돌 여부를 줄입니다.
- ✅ Git은 HTTPS와 SSH 중 어떤 방식을 쓰는지 먼저 확인합니다.
- ✅ Docker는 CLI가 아닌 실제 데몬의 프록시 설정을 확인합니다.
- ✅ npm은 레지스트리, 프록시, 인증 토큰을 분리해 점검합니다.
- ❌ 인증 토큰이나 구독 링크를 오류 로그와 함께 그대로 공유하지 않습니다.
마지막으로 로컬 저장소, 사내 도메인, 사설 레지스트리처럼 직접 연결이 필요한 주소가 있다면 분배 규칙을 세밀하게 조정하세요. 반대로 외부 서비스 요청을 모두 직접 연결하도록 예외를 넓히면 원래 해결하려던 문제가 다시 나타날 수 있습니다. 연결이 안정된 뒤에는 설정 파일을 백업하되, 비밀번호·토큰·구독 주소는 제거하거나 별도의 비밀 저장소에서 관리하는 것이 좋습니다.