AI 생성npm 쓰는 개발자라면 지금 확인하세요 — npm 12부터 install 스크립트가 기본 차단됩니다

npm 쓰는 개발자라면 지금 확인하세요 — npm 12부터 install 스크립트가 기본 차단됩니다

🤖 AI 생성 콘텐츠 — 이 글은 AI가 자료를 수집하고 초안을 작성했으며, 발행 전 누슘 운영자가 검수했습니다.

npm 12가 정식 출시되면서 npm install 시 의존성의 preinstall·install·postinstall 스크립트 실행이 기본 차단된다. Git·원격 URL 의존성 해석도 기본 꺼짐. 대비 방법을 정리했다.

결론부터 — npm 12부터는 npm install이 의존성 패키지의 설치 스크립트를 더 이상 자동 실행하지 않습니다. GitHub이 npm 12 출시를 공식 발표하면서, 16년 넘게 이어져온 npm의 기본 동작이 뒤집혔습니다. 지금까지는 npm install 한 번이면 의존성 트리 속 모든 패키지가(내가 직접 고른 적 없는, 몇 단계 아래 패키지까지) 내 컴퓨터에서 임의의 셸 명령을 실행할 권리를 자동으로 얻었습니다. 공급망 공격의 단골 통로였죠. 그 문이 이제 기본으로 닫힙니다.

목차

  • 뭐가 바뀌나 — 세 가지 기본값 변경
  • 왜 바뀌나 — postinstall은 왜 위험했나
  • 내 프로젝트·CI는 어떻게 대비하나
  • 토큰(GAT) 정책도 바뀐다 — 8월과 내년 1월

뭐가 바뀌나 — 세 가지 기본값 변경

핵심은 “지금까지 자동으로 되던 것”이 “명시적으로 허용해야 되는 것”으로 바뀐다는 겁니다. GitHub 공식 체인지로그 기준으로 세 가지입니다.

변경 이전(npm 11까지) npm 12 기본값
allowScripts 의존성의 preinstall·install·postinstall 자동 실행 꺼짐 — 프로젝트에서 허용한 패키지만 실행
--allow-git Git 의존성(직접·전이) 자동 해석 none — 명시 허용 필요
--allow-remote 원격 URL(https tarball 등) 의존성 자동 해석 none — 명시 허용 필요

몇 가지 눈에 띄는 디테일이 있습니다.

  • 명시적 install 스크립트가 없어도 binding.gyp가 있으면 npm이 암묵적으로 돌리던 node-gyp rebuild(네이티브 빌드)도 똑같이 차단됩니다.
  • git·file·link 의존성의 prepare 스크립트도 같은 방식으로 막힙니다.
  • --allow-git 기본 차단은 단순 스크립트 문제가 아니라, Git 의존성의 .npmrc가 Git 실행 파일 경로를 바꿔치기해 --ignore-scripts를 우회하던 코드 실행 경로를 막는 조치입니다.
  • --allow-file·--allow-directory의 기본값은 이번에 바뀌지 않습니다.
npm 12에서 세 가지 자동 동작이 허용제로 바뀌는 구조도

왜 바뀌나 — postinstall은 왜 위험했나

postinstall이 뭐냐면, 패키지가 설치된 직후 자동으로 실행되는 스크립트입니다. 원래는 네이티브 모듈 컴파일 같은 정상 용도인데 — 문제는 “설치만 해도 코드가 실행된다”는 성질 그 자체입니다. 택배 상자를 문 앞에 두기만 했는데 상자가 스스로 열리면서 안의 로봇이 집 안을 돌아다니는 격이죠. 실제로 최근 몇 년간 npm 생태계를 강타한 공급망 공격 다수가 인기 패키지를 탈취한 뒤 설치 스크립트에 악성코드를 심어 자격증명을 훔치는 수법이었습니다. 그래서 보안 도구들이 한결같이 “--ignore-scripts 켜라”고 권고해왔는데, npm 12는 아예 그걸 기본값으로 못 박은 겁니다.

The Hacker News 보도에 따르면 이번 조치는 npm 라이프사이클 훅을 악용해 npm install 시점에 악성코드를 실행하는 공격 기법에 대한 직접 대응입니다. 참고로 pnpm은 이미 설치 스크립트를 기본 차단해왔고, 최근 pnpm 11.10은 레지스트리 인증정보(_auth)를 프로젝트 파일에서 읽지 않도록 하는 강화도 추가했습니다. 생태계 전체가 “기본값부터 안전하게” 방향으로 움직이는 중입니다.

내 프로젝트·CI는 어떻게 대비하나

당장 npm 12로 올리면 postinstall에 의존하던 패키지들(네이티브 빌드, 바이너리 다운로드형 패키지 등)이 조용히 멈출 수 있습니다. GitHub이 안내한 준비 절차는 이렇습니다.

# 1. npm 11.16.0 이상으로 업그레이드 (v12 변경사항이 경고로 미리 보임)
npm install -g npm@11

# 2. 평소처럼 설치해보고 경고 확인
npm install

# 3. 어떤 패키지가 스크립트를 실행하려 했는지 확인
npm approve-scripts --allow-scripts-pending

# 4. 신뢰하는 패키지만 허용, 나머지는 차단
npm approve-scripts   # 허용
npm deny-scripts      # 차단

허용 목록은 package.json에 기록되니 커밋해서 팀 전체가 공유하면 됩니다. 이렇게 미리 정리해두면 v12로 올라가도 승인한 스크립트만 계속 돌고, 승인 안 한 것만 멈춥니다. CI에서 빌드가 갑자기 깨졌다면 이 지점부터 의심하면 됩니다.

npm 12 대비 4단계 마이그레이션 절차

토큰(GAT) 정책도 바뀐다 — 8월과 내년 1월

이번 발표에는 시한이 박힌 변경이 두 개 더 있습니다. 자동화에 npm 토큰을 쓰는 팀이라면 이쪽이 더 급할 수 있습니다.

  1. 2026년 8월 초부터: 2FA 우회(bypass 2FA)로 설정된 GAT(세분화 액세스 토큰)는 토큰 생성·삭제, 계정·패키지·조직 관리 같은 민감한 작업을 더 이상 수행할 수 없습니다. 해당 작업은 2FA를 거쳐 직접 수행해야 합니다.
  2. 2027년 1월부터: GAT의 직접 게시(publish) 권한이 사라집니다. 토큰으로는 비공개 패키지 읽기와 ‘게시 준비(staging)’까지만 가능하고, 실제 공개는 사람이 2FA로 승인해야 완료됩니다.

GitHub은 장수 게시 토큰 대신 신뢰 게시(trusted publishing, OIDC) 또는 사람 승인 단계를 둔 스테이징 게시로 옮겨갈 것을 권고했습니다. 자동 배포 파이프라인에서 npm publish를 토큰으로 돌리고 있다면, 내년 1월 전에 손봐야 한다는 얘기입니다.

자주 묻는 질문 (FAQ)

Q. npm 12에서 npm install 하면 뭐가 달라지나요? A. 의존성 패키지의 preinstall·install·postinstall 스크립트가 기본적으로 실행되지 않습니다. Git 의존성과 원격 URL 의존성 해석도 기본 차단됩니다. 신뢰하는 패키지는 npm approve-scripts로 허용 목록에 넣어야 합니다.

Q. 왜 설치 스크립트를 차단하나요? A. npm install만으로 의존성 트리의 모든 패키지가 내 컴퓨터에서 임의 명령을 실행할 수 있었고, 이것이 공급망 공격의 주요 통로로 악용돼왔기 때문입니다. 탈취된 패키지의 설치 스크립트에 악성코드를 심는 사건이 반복되자 GitHub이 기본값 자체를 뒤집었습니다.

Q. 네이티브 모듈(node-gyp) 쓰는 패키지는 어떻게 되나요? A. binding.gyp만 있고 명시적 install 스크립트가 없는 패키지도 암묵적 node-gyp rebuild가 차단됩니다. 해당 패키지를 허용 목록에 추가해야 빌드가 정상 동작합니다.

Q. 기존 CI 파이프라인이 깨질까요? A. postinstall에 의존하는 패키지가 있다면 깨질 수 있습니다. npm 11.16.0 이상에서 미리 경고를 확인하고, npm approve-scripts --allow-scripts-pending으로 대상을 파악해 허용 목록을 package.json에 커밋해두면 v12 전환 후에도 승인된 스크립트는 계속 동작합니다.

Q. yarn이나 pnpm 사용자도 영향이 있나요? A. 이번 변경은 npm CLI v12에 적용됩니다. 참고로 pnpm은 이전부터 의존성 설치 스크립트를 기본 차단하는 정책을 취해왔고, 최근 11.10에서는 레지스트리 인증 방식도 강화했습니다. 어떤 매니저를 쓰든 “설치 = 코드 실행”이라는 가정은 버리는 방향이 업계 표준이 되고 있습니다.

마치며

정리하면 — npm 12는 npm install의 암묵적 신뢰를 걷어내고, 스크립트 실행·Git·원격 의존성을 전부 허용제로 바꿨습니다. 토큰 정책도 8월과 내년 1월 두 단계로 조여옵니다. 오늘 npm -v 한 번 확인하고, 11.16 이상에서 경고부터 점검해보세요. 여러분 프로젝트에서는 몇 개 패키지가 스크립트 허용을 요구하던가요? 댓글로 공유해주시면 다른 분들에게도 참고가 됩니다. 다음 글에서는 버전 관리의 역사를 바꾼 한 남자의 ‘홧김 프로젝트’ 이야기를 들려드립니다.

참고자료


태그: #npm #npm12 #GitHub #공급망보안 #자바스크립트 #NodeJS #postinstall #CICD #보안

이 게시판의 글

개발 뉴스