기업 VPN 프록시 뒤의 407: npm, Maven, VS Code
407은 레지스트리 장애가 아니라 프록시가 자격 증명을 원한다는 뜻이다. npm, Maven, VS Code와 컨테이너를 설정하고 내부 호스트는 제외하라.
브라우저에서 사내 페이지가 열린다는 것은 프록시가 브라우저에 대해 동작한다는 증거일 뿐, npm이나 Maven에 대해서는 아니다. 클라이언트마다 자기 설정을 읽고, VPN으로만 닿는 네트워크에서는 프록시에 도달하는지가 두 번째 질문이 된다. 먼저 상태 코드를 보고, 실패한 도구의 설정 사슬을 따라가라. 그래서 한쪽은 되고 옆은 실패한다.
407이 실제로 증명하는 것
407 Proxy Authentication Required는 프록시에서 오고, 레지스트리나 저장소에서 오지 않는다. 클라이언트는 프록시에 닿았고 프록시가 요청을 거부했다. 보통 자격 증명이 없거나, 형식이 틀렸거나, 그 대상에 대해 받아들여지지 않았기 때문이다.
시간 초과는 다른 이야기다. 프록시 주소가 틀렸거나, 터널이 서기 전에 프록시로 가는 경로가 없거나, 내부 호스트용 우회 항목이 빠졌다는 뜻이다. 자격 증명을 바꾸기 전에 오류 본문을 읽어라.
프록시 호스트, 포트, 인증 방식, 사용자 이름에 도메인 접두사가 필요한지 확인한다. 다음으로 실패한 도구가 값을 파일에서, 환경 변수에서, 아니면 둘 다에서 읽는지 본다. 도메인이 붙은 사용자 이름은 407의 흔한 원인이고, 잘못된 인코딩으로 저장된 비밀번호도 마찬가지다.
npm은 자기 설정 사슬을 읽는다
npm은 사용자 또는 프로젝트 .npmrc에서 proxy와 https-proxy 키를 받는다. 값이 URL이므로 스킴을 적고, 비밀번호의 예약 문자를 인코딩해 at 기호가 값을 쪼개지 않게 한다.
proxy=http://proxy.example.com:8080
https-proxy=http://proxy.example.com:8080
strict-ssl=true
npm config list로 어떤 파일이 유효한 값을 주었는지 본다. npm_config_proxy 같은 셸 내보내기는 파일을 덮어쓸 수 있고, 개인 비밀번호가 든 프로젝트 .npmrc는 절대 커밋하지 말아야 한다. 값과 함께 출처 경로를 출력한다.
strict-ssl는 켜 둔다. TLS를 검사하는 프록시는 트러스트 스토어의 사내 CA를 요구할 수 있다. 오류를 피하려고 검증을 끄면 진짜 신뢰 문제를 숨기게 된다.
Maven은 프록시와 미러를 나눈다
Maven은 프록시와 미러를 사용자 settings 파일에서 읽고 프로젝트 pom에서는 읽지 않는다. 네트워크별 프록시와 내부 저장소 미러는 ~/.m2/settings.xml에 두고, 공개 저장소 선언은 프로젝트에 남긴다.
프록시 블록에는 id, 활성 플래그, 프로토콜, 호스트와 포트, 내부 저장소용 nonProxyHosts 항목이 필요하다. 이 항목들은 프로젝트 pom이 아니라 사용자 settings에 두어, 네트워크 변경이 팀 전체 빌드를 다시 쓰지 않게 한다.
Maven이 직접 연결하도록 내부 저장소를 nonProxyHosts에 추가한다. 이 항목이 없으면 프록시가 불필요한 경유지가 되고 장애는 저장소 중단처럼 보인다. 미러 항목은 내부 저장소를 가리키며 프록시 설정을 대체하지 않는다.
네트워크를 옮기는 개발자는 네트워크마다 settings 파일을 하나 두고 셸이 시작될 때 올바른 사본을 고를 수 있다. 옮길 때마다 파일 하나를 손으로 고치면 잘 돌아가던 노트북이 지원 요청이 된다.
VS Code와 dev 컨테이너는 이름 공간이 다르다
VS Code는 http.proxy를 사용자 또는 작업 영역 설정에서 읽고 스킴과 포트도 포함한다. 이것은 편집기 자체의 확장과 마켓플레이스 요청을 덮지만, 터미널이나 편집기에서 띄운 컨테이너를 자동으로 설정하지는 않는다. 설정의 범위와 값을 모두 확인한다. 작업 영역 설정은 한 프로젝트에서 사용자 설정을 덮을 수 있다.
dev 컨테이너는 자체 네트워크 이름 공간을 가진다. 호스트의 프록시 변수나 VPN 경로를 상속하지 않으므로 컨테이너 안의 마켓플레이스 호출이 실패할 수 있다. 같은 호출이 호스트에서는 동작한다.
컨테이너에 그 변수를 주거나, 자체 리졸버와 경로를 주어라. 안에서 이름은 풀리는데 프록시가 응답하지 않는다면 빠진 것은 대개 경로이지 주소가 아니다.
우회 목록과 환경 우선순위
VPN 게이트웨이, 내부 레지스트리, 사설 DNS 접미사를 우회 목록에 넣는다. 터널이 생기기 전에 클라이언트가 프록시로 게이트웨이에 가려 하면 연결은 프록시 중단처럼 실패한다. 터널을 내린 상태로 그 우회를 시험한다.
환경 변수와 파일은 어긋날 수 있다. 셸이 아니라 도구 자체의 설정 덤프를 실행하고 보고된 값을 비교한다. 소문자 중복 변수, 상위 셸의 오래된 값, 프로젝트 파일이 방금 고친 설정을 덮을 수 있다.
CI에서는 프록시를 비밀 변수로 넘기고 같은 이미지에서 패키지 하나 설치를 시험한다. 컨테이너 안의 407은 그곳에 변수가 없다는 뜻인 경우가 많고, 호스트 셸에는 있다.
도구마다 프록시 호스트, 포트, 우회 접미사, 그것을 주는 파일이나 변수를 기록한다. 한쪽이 407을 돌려주고 다른 쪽이 동작할 때, 그 기록은 네 가지 설정 비교를 짧은 점검으로 바꾼다.