---
title: "npm 12, 설치 스크립트와 원격 의존성을 기본 차단한다"
published: 2026-06-09T21:01:00.000Z
canonical: https://jeff.news/article/3972
---
# npm 12, 설치 스크립트와 원격 의존성을 기본 차단한다

npm 12부터 `npm install`의 기본 동작이 보안 중심으로 바뀐다. 의존성의 설치 스크립트, Git 의존성, 원격 URL 의존성이 자동 실행·해결되지 않고 프로젝트에서 명시적으로 허용해야 한다. npm 11.16.0 이상에서 미리 경고를 확인하고 허용 목록을 커밋해두는 게 핵심이다.

- npm 12에서 `npm install` 기본값이 꽤 크게 바뀜
  - 출시 예상 시점은 2026년 7월
  - 핵심 방향은 “설치 중 자동으로 실행되던 위험한 동작을 기본 차단하고, 프로젝트가 명시적으로 허용하게 만들기”임
  - npm 11.16.0 이상에서는 이미 경고 형태로 확인할 수 있어서 미리 준비 가능함

> [!WARNING]
> npm 12로 올라가면 지금은 조용히 돌아가던 설치 스크립트나 Git 의존성이 갑자기 멈출 수 있음. 특히 네이티브 모듈이 많은 프로젝트는 CI에서 먼저 터질 가능성이 큼.

- 첫 번째 변화는 `allowScripts` 기본값이 꺼지는 것임
  - npm 12부터 `npm install`은 의존성 패키지의 `preinstall`, `install`, `postinstall` 스크립트를 자동 실행하지 않음
  - 신뢰하는 패키지만 프로젝트에서 명시적으로 허용해야 계속 실행됨
  - Git, file, link 의존성의 `prepare` 스크립트도 같은 방식으로 막힘

- 여기서 중요한 함정은 `node-gyp` 네이티브 빌드도 막힐 수 있다는 점임
  - 패키지에 명시적인 install 스크립트가 없어도 `binding.gyp`가 있으면 npm이 암묵적으로 `node-gyp rebuild`를 돌리는 경우가 있음
  - npm 12에서는 이것도 설치 중 실행되는 동작으로 보고 차단 대상에 포함함
  - 즉 네이티브 애드온을 쓰는 패키지는 단순 JS 패키지보다 영향 확인이 더 필요함

- 준비 방법은 npm 11.16.0 이상에서 경고를 먼저 보는 것임
  - 평소처럼 설치를 돌리면 어떤 스크립트가 차단될 예정인지 경고를 볼 수 있음
  - `npm approve-scripts --allow-scripts-pending`을 실행하면 허용 후보를 확인할 수 있음
  - 신뢰하는 패키지는 `npm approve-scripts`로 허용하고, 나머지는 `npm deny-scripts`로 막으면 됨
  - 결과 허용 목록은 `package.json`에 기록되므로 커밋해야 함

- 두 번째 변화는 Git 의존성이 기본적으로 막힌다는 것임
  - npm 12에서 `--allow-git` 기본값은 `none`이 됨
  - 직접 의존성이든 전이 의존성이든 Git 저장소에서 패키지를 가져오려면 명시적으로 허용해야 함
  - 이 변경은 2026년 2월 18일에 이미 예고됐고, npm 11.10.0 이상에서 사용할 수 있음

- Git 의존성을 막는 이유는 코드 실행 경로가 있었기 때문임
  - Git 의존성의 `.npmrc`가 Git 실행 파일을 바꿀 수 있는 문제가 있었음
  - 심지어 `--ignore-scripts`를 써도 이 경로가 완전히 닫히지 않았다는 게 포인트임
  - 그래서 npm은 스크립트 차단만으로 부족하다고 보고 Git 의존성 해석 자체를 opt-in으로 바꿈

- 세 번째 변화는 원격 URL 의존성 차단임
  - npm 12에서 `--allow-remote` 기본값도 `none`이 됨
  - `https` tarball 같은 원격 URL 의존성은 직접이든 전이든 명시적으로 허용하지 않으면 해결되지 않음
  - 이 플래그는 npm 11.15.0 이상에서 이미 사용할 수 있음
  - 관련 플래그인 `--allow-file`, `--allow-directory`는 npm 12에서 기본값이 바뀌지 않음

> [!TIP]
> 지금 할 일은 npm을 11.16.0 이상으로 올리고 평소 설치 루틴을 그대로 돌려보는 것임. 경고를 보고 허용할 패키지를 정리한 뒤 `package.json` 변경분을 커밋해두면 npm 12 업그레이드 충격을 줄일 수 있음.

- 이 변화는 자바스크립트 생태계의 오래된 공급망 보안 문제를 정면으로 건드림
  - 지금까지는 패키지를 설치하는 것만으로 의존성의 임의 스크립트가 실행될 수 있었음
  - 빌드 편의성은 좋았지만, 악성 패키지나 탈취된 패키지에는 너무 좋은 공격 표면이었음
  - npm 12는 “자동 실행”을 줄이고 “프로젝트가 신뢰를 선언”하는 모델로 옮겨가는 셈임

- 실무적으로는 CI, Docker 빌드, 온보딩 문서까지 같이 봐야 함
  - 로컬에서는 이미 캐시나 빌드 산출물이 있어서 괜찮아 보여도, 깨끗한 CI 환경에서 설치가 실패할 수 있음
  - 네이티브 모듈, Git 기반 사내 패키지, 원격 tarball을 쓰는 프로젝트는 특히 먼저 확인해야 함
  - 글로벌 설치나 `npx` 관련 설정은 `allow-scripts` 설정 문서를 같이 봐야 함

---

## 기술 맥락

- npm 12의 선택은 설치 편의성보다 공급망 보안을 우선하겠다는 쪽이에요. 지금까지 npm은 패키지 설치 과정에서 필요한 빌드 스크립트를 자동으로 돌려줬는데, 이 자동 실행이 악성 패키지 입장에서는 가장 쉬운 진입로가 되거든요.

- 특히 `postinstall` 같은 lifecycle script는 개발자가 앱 코드를 실행하기도 전에 돌아가요. 그래서 공격자는 사용자가 패키지를 설치하는 순간 토큰을 빼가거나 추가 코드를 내려받게 만들 수 있어요. npm이 허용 목록 방식으로 바꾸는 이유가 여기에 있어요.

- `node-gyp`까지 포함된 점도 현실적인 변경이에요. 네이티브 애드온은 설치 시점에 빌드가 필요해서 자동 실행에 많이 기대왔거든요. 하지만 보안 모델 입장에서는 암묵적 `node-gyp rebuild`도 결국 로컬에서 코드를 실행하는 동작이라 별도로 신뢰를 확인해야 해요.

- Git 의존성과 원격 tarball 차단은 패키지 레지스트리 바깥 경로를 줄이려는 조치예요. 레지스트리 패키지는 그래도 npm의 일반적인 검증과 추적 흐름 안에 있지만, Git이나 임의 URL은 프로젝트가 의도치 않게 더 넓은 실행 경로를 열 수 있어요.

- 팀에서 해야 할 일은 단순히 npm 버전을 올리는 게 아니라, 어떤 의존성이 설치 중 코드를 실행해야 하는지 목록화하는 거예요. 허용 목록이 `package.json`에 남기 때문에 리뷰 가능한 정책 파일처럼 다룰 수 있고, 이게 npm 12 업그레이드의 실질적인 마이그레이션 포인트예요.

## 핵심 포인트

- npm 12는 2026년 7월 출시 예정이며 설치 과정의 자동 동작을 명시적 허용 방식으로 바꿈
- 의존성의 `preinstall`, `install`, `postinstall`, `prepare` 스크립트가 기본 차단됨
- 네이티브 `node-gyp` 빌드도 암묵적 설치 스크립트로 취급돼 차단될 수 있음
- Git 의존성과 원격 tarball 의존성도 기본적으로 해결되지 않으며 별도 플래그가 필요함

## 인사이트

자바스크립트 공급망 보안에서 오래된 아픈 지점인 ‘설치만 했는데 코드가 실행됨’을 npm이 기본값 차원에서 막으려는 변화임. Node.js 프로젝트는 빌드가 깨진 뒤 대응하기보다 지금 npm 11.16.0 이상에서 경고를 확인해두는 게 낫다.
