npm v12 파괴적 변경: 설치 스크립트 및 원격 종속성에 대한 새로운 보안 기본값
npm v12는 공급망 취약점을 완화하기 위해 npm install에 대한 중요한 보안 관련 기본 변경을 도입합니다. 주요 변화는 스크립트와 원격 종속성 해결에 대해 자동 실행 모델에서 명시적 옵트인 모델로 전환하는 것입니다. 이 변경은 2026년 7월에 출시될 예정이지만 npm 11.16.0+에서는 이미 경고 형태로 제공되고 있습니다.
설치 스크립트 기본 비활성화
v12부터 npm install은 종속성의 preinstall, install, postinstall 스크립트를 자동으로 실행하지 않습니다. 이 변경에는 binding.gyp 파일이 포함된 패키지에 대한 암시적 node-gyp rebuild 작업과 git, file, link 종속성에 대한 prepare 스크립트도 포함됩니다.
이 스크립트를 관리하려면 사용자는 이제 신뢰할 수 있는 패키지를 명시적으로 허용해야 합니다:
- 식별:
npm approve-scripts --allow-scripts-pending을 실행하여 차단될 패키지를 확인합니다. - 승인:
npm approve-scripts를 사용해 신뢰할 패키지를 허용하고npm deny-scripts로 다른 패키지를 차단합니다. - 영구성: 결과 허용 목록은
package.json에 저장되며 버전 관리에 커밋해야 합니다.
제한된 Git 및 원격 종속성 해결
잠재적인 코드 실행 경로를 차단하기 위해 npm v12는 외부 소스에서 종속성을 해결하는 방식을 제한합니다:
Git 종속성
npm install은 --allow-git 플래그를 사용하지 않으면 Git 종속성(직접 또는 전이적)을 해결하지 않습니다. 이는 Git 종속성의 .npmrc가 Git 실행 파일을 재정의할 수 있는 상황을 방지하며, 스크립트를 무시해도 지속되는 취약점입니다.
원격 URL 종속성
HTTPS tarball과 같은 원격 URL에서 해결되는 종속성은 --allow-remote 플래그가 제공되지 않으면 기본적으로 차단됩니다. --allow-file 및 --allow-directory 플래그는 v12에서도 현재 기본값을 유지합니다.
준비 및 마이그레이션 경로
개발자는 npm 11.16.0 이상으로 업그레이드하여 v12 전환을 준비할 수 있습니다. 이 버전에서는 v12에서 차단될 동작에 대해 경고를 제공합니다. 권장 워크플로는 표준 설치를 실행하고 경고를 검토한 뒤 npm approve-scripts --allow-scripts-pending을 사용해 필요한 허용 목록을 package.json에 생성하고 커밋하는 것입니다.
커뮤니티 관점 및 기술 비판
이 발표는 개발자들 사이에서 이러한 변경의 시기와 효과에 대해 큰 논의를 불러일으켰습니다.
공급망 보안
일부 사용자는 이러한 변경이 오래전부터 알려진 취약점을 해결한다고 언급했으며, 한 사용자는 10년 전에 보고된 취약점을 지적했습니다. 공급망 공격에 대응하기 위해 옵트인 모델로 전환하는 것이 필요하다는 일반적인 합의가 있지만, 일부는 이것이 pnpm과 같은 다른 패키지 매니저에 이미 존재하는 패턴을 늦게 도입한 것이라고 주장합니다.
효과와 한계
비평가들은 실행을 설치 단계에서 런타임 단계로 옮기는 것이 위험을 제거하는 것이 아니라 단지 이동시킨다고 주장합니다:
"이제 모든 악성코드는 설치 스크립트에서 모듈 자체로 이동할 수 있으며, 결국 여전히 실행될 것입니다"
다른 개발자들은 허용 목록에 의존하는 대신, 실제 실행 전에 어떤 프로그램이 실행되는지 출력하는 샌드박스나 시뮬레이션 실행과 같은 보다 견고한 솔루션이 필요하다고 제안했습니다.
사용성 우려
CLI 사용성에 대한 비판이 있으며, 특히 npm approve-scripts --allow-scripts-pending이라는 명령어 이름이 직관적이지 않다고 생각하는 사람도 있습니다. 이 명령은 승인 작업을 수행하기보다 목록을 표시하기 때문입니다.