npm 설치 스크립트는 패키지를 가져오기 전 개발자 컴퓨터나 CI 실행기에서 코드를 실행할 수 있다. npm 최다 다운로드 패키지 5,000개를 조사한 결과, 설치 단계에서 자체 코드를 실행한 패키지는 31개(0.6%)였으며 조사 환경에서는 네트워크에 접속을 시도한 패키지가 없었다.

조사 방법과 범위

조사 대상은 npm-high-impact 1.13.0이 선정한 다운로드 상위 5,000개 패키지다. 2026년 10월 8일 npm 레지스트리에서 각 패키지의 최신 버전을 확인했고, 매니페스트 4,995개를 읽었다. 나머지 5개는 확인에 실패했다.

preinstall, install, postinstall 스크립트를 선언했거나 binding.gyp 파일을 포함한 패키지는 Kenwea 공증 서비스의 프로덕션 샌드박스에서 실행했다. 샌드박스는 네트워크를 차단하고 Linux 권한을 제거했으며, 읽기 전용 파일시스템과 비루트 계정을 사용했다. 패키지는 의존하는 프로젝트의 node_modules에 설치했고, 설치 스크립트에 npm이 제공하는 환경 변수를 전달했다. 각 단계에는 15초 제한을 적용하고 strace로 네트워크 연결, DNS 조회, 실행을 시도한 프로그램을 관찰했다. 의존성은 설치하지 않았다.

31개 패키지의 결과

  • 13개는 실행을 마쳤고 네트워크 접속을 시도하지 않았다. core-js, core-js-pure, es5-ext, vue-demi, nx, puppeteer, yarn, @google/genai, @firebase/util, @parcel/watcher, ssh2, @scarf/scarf, @anthropic-ai/claude-code가 여기에 포함됐다. @google/genai의 preinstall은 한 줄을 출력하는 데 그쳤다.
  • 13개는 실패했다. 대부분 네이티브 빌드에 컴파일러나 Python이 필요하거나, 설치하지 않은 의존성에 포함된 사전 빌드 바이너리를 요구했다. 해당 패키지는 pnpm, @pnpm/exe, unrs-resolver, @sentry/cli, msgpackr-extract, node-pty, cypress, cpu-features, canvas, bufferutil, utf-8-validate, lmdb, bcrypt다.
  • esbuild와 @swc/core는 플랫폼 바이너리를 받기 위해 npm install을 실행하려 했고, union의 preinstall은 npx npm-force-resolutions를 실행했다. 이 세 패키지는 15초 제한으로 중단됐으며, 중단 시점까지 DNS 조회는 없었다.
  • 레지스트리에는 fsevents가 node-gyp rebuild를 실행한다고 표시돼 있지만, 배포 파일에는 사전 빌드 바이너리가 들어 있고 binding.gyp는 없어 실행 단계가 없었다. fsevents는 macOS 전용이기도 하다.
  • aws-sdk는 샌드박스의 작업 공간 한도인 96MiB를 넘게 압축이 풀려 실행하지 못했다. 공개 공증 서비스는 10MiB가 넘는 패키지를 가져오지 않으므로 aws-sdk와 node-pty는 해당 서비스에서 검사할 수 없다.

결과를 해석할 때의 한계

이번 조사에서 어떤 패키지도 자체 설치 단계 중 네트워크 접속을 시도하지 않았다. 하지만 이는 안전하다는 뜻이 아니다. 의존성을 설치하지 않았기 때문에 대체 경로에서 내려받기를 시도하는 스크립트는 끝까지 확인하지 못했다. 스크립트가 샌드박스임을 알아채고 동작을 멈출 수도 있다. 원문은 텔레메트리를 보내는 역할의 @scarf/scarf가 다른 패키지의 의존성으로 설치될 때 보고하지만, 패키지 자체만 검사한 이번 방식에서는 그 상황을 재현하지 못했다고 설명한다.

조사 결과가 보여주는 실용적인 지점은 설치 스크립트가 실행되는 패키지가 31개로 집중돼 있다는 것이다. 글은 프로젝트에 설치 스크립트가 필요하지 않다면 npm install --ignore-scripts로 비활성화할 수 있다고 안내한다. pnpm 10은 의존성의 라이프사이클 스크립트를 기본 차단하며, 이름별로 허용할 수 있다.

직접 확인하기

조사 결과는 재현할 수 있으며, 각 결과는 Kenwea의 공개 키로 서명된 기록으로 제공되고 표시 전에 사용자 컴퓨터에서 검증된다고 설명한다. CI에서는 의존성이 설치 단계에서 무엇이든 실행하거나 네트워크에 접속하려 하면 빌드를 실패시키는 게이트를 설정할 수 있다.

```

npx -y @kenwea/mcp check esbuild

npx -y @kenwea/mcp check esbuild --fail-on install-scripts,network

```

31개 패키지의 선언된 스크립트와 실행 결과, 각 단계에서 시도한 동작을 담은 원시 자료는 JSON 파일에서 확인할 수 있다. 조사에는 2026년 10월 8일 기준 171초가 걸렸다. 패키지 버전은 매일 바뀌므로 다시 실행하면 결과가 달라질 수 있다.

공증 서비스를 체험할 때 계정이나 키는 필요하지 않다. 에이전트에 MCP 서버로 추가하는 방법도 제공한다.