npm, 스테이지드 퍼블리싱으로 안전한 패키지 배포 시작!
npm, 공급망 보안 강화를 위해 스테이지드 퍼블리싱(Staged Publishing) 기능을 정식 출시
스테이지드 퍼블리싱은 패키지 배포 전 유지보수자(Maintainer)의 승인을 거치도록 하여 보안을 강화
**--allow-* 플래그(Flags)를 통해 설치 시 소스 제어 기능 추가, --allow-file, --allow-remote, --allow-directory** 지원
npm CLI 11.15.0 이상 버전에서 해당 기능 사용 가능하며, CI/CD 워크플로우(CI/CD Workflows) 업데이트 권장
스테이지드 퍼블리싱(Staged Publishing)의 작동 원리
스테이지드 퍼블리싱은 패키지 배포 과정을 두 단계로 분리하여 공급망 공격(Supply Chain Attack) 위험을 줄인다.
1단계: 개발자가 `npm stage publish` 명령어를 실행하면, 패키지는 즉시 공개되지 않고 스테이지 큐(Stage Queue)에 업로드
2단계: 유지보수자는 npmjs.com 웹사이트 또는 npm CLI를 통해 패키지 검토 후 승인(Approval)
장점: CI/CD 환경에서도 2FA(2-Factor Authentication) 기반 승인 가능하며, 신뢰할 수 있는 배포(Trusted Publishing)와 연동하여 보안 강화
결과적으로, 스테이지드 퍼블리싱은 무단 배포(Unauthorized Publishing)를 방지하고, 패키지 무결성(Package Integrity)을 보장한다.
새로운 --allow-* 플래그(Flags)의 역할
npm 11.15.0부터 도입된 `--allow-*` 플래그는 패키지 설치 시 소스(Source)를 명시적으로 제어하여 잠재적 위험을 차단한다.
`--allow-file`: 로컬 파일 경로 및 로컬 tarball로부터의 설치 제어
`--allow-remote`: 원격 URL(HTTPS tarball 포함)로부터의 설치 제어
`--allow-directory`: 로컬 디렉토리로부터의 설치 제어
`--allow-git`: Git 소스(github:, gitlab:, git+ URL)로부터의 설치 제어
각 플래그는 `all` 또는 `none` 값을 가지며, `.npmrc` 또는 `package.json` 설정 파일에서 설정 가능하며, 의존성 관리(Dependency Management)의 유연성을 제공한다.
신뢰할 수 있는 배포(Trusted Publishing)와의 연동
스테이지드 퍼블리싱은 신뢰할 수 있는 배포(Trusted Publishing)와 함께 사용 시 보안 효과를 극대화할 수 있다.
신뢰할 수 있는 배포 설정(Trusted Publishing Configuration)을 스테이지 전용으로 제한하면, CI 워크플로우에서 `npm publish` 명령어가 거부되고 `npm stage publish`만 허용
CI/CD 환경에서 자동화된 패키지 빌드(Automated Package Build)를 수행하고, 유지보수자가 승인하는 방식으로 운영
2026년 2월에 출시된 신뢰할 수 있는 배포 기능을 활용하여 스테이지드 퍼블리싱으로의 마이그레이션(Migration) 가능
결과적으로, CI/CD 파이프라인의 보안을 강화하고, 무결성(Integrity)을 보장하는 데 기여한다.
npm 공급망 보안의 중요성
최근 공급망 공격(Supply Chain Attack)이 증가함에 따라, npm과 같은 패키지 매니저의 보안은 더욱 중요해지고 있다.
악성 코드 삽입(Malicious Code Injection): 패키지 종속성(Package Dependency)을 통해 악성 코드가 삽입되어 시스템을 공격
타이포스쿼팅(Typosquatting): 오타를 이용한 악성 패키지 배포
취약한 의존성(Vulnerable Dependency): 알려진 취약점을 가진 패키지 사용
스테이지드 퍼블리싱과 `--allow-*` 플래그는 이러한 공격을 방어하기 위한 핵심 기능이며, 개발자(Developer)와 유지보수자(Maintainer)의 책임을 강조한다.