GitHub, NPM용 단계별 배포와 설치 시 제어 기능 도입
Source: Hacker News
오늘 우리는 npm의 공급망 보안에 초점을 맞춘 두 가지 업데이트를 배포합니다:
- Staged publishing이 정식으로 제공됩니다.
- 기존
--allow-git플래그를 보완하는 새로운--allow-*설치 소스 플래그(--allow-file,--allow-remote,--allow-directory)가 추가되었습니다.
두 기능 모두 npm CLI 11.15.0 이상에서 사용할 수 있습니다.
Staged publishing이 정식으로 제공됩니다
Staged publishing이 이제 npm에서 정식으로 제공됩니다. 즉시 패키지 버전을 소비자에게 공개하는 직접 퍼블리시 대신, 사전 빌드된 tarball이 스테이지 큐에 업로드되고, 유지 관리자가 명시적으로 승인해야만 설치 가능해집니다. 이 큐는 npmjs.com과 npm CLI 모두에서 확인할 수 있습니다.
Staged publishing은 비대화형 CI/CD 워크플로우에서 발생하는 퍼블리시와 OIDC를 이용한 신뢰된 퍼블리시 모두에 대해 존재 증명을 강화합니다. 2FA가 적용된 인간 유지 관리자가 스테이지된 패키지를 레지스트리에 배포하기 전에 승인을 해야 합니다.
Staged publishing은 오늘부터 사용 가능하며, 문서도 함께 공개되었습니다.
요구 사항
npm stage를 사용하려면 npm CLI 11.15.0 이상이 필요합니다.- 스테이지 동작을 원한다면 CI/CD 워크플로우에서
npm publish대신npm stage publish를 사용하도록 업데이트하세요.
권장 설정
우리는 **신뢰된 퍼블리시 (OIDC)**와 스테이지 퍼블리시를 함께 사용할 것을 권장합니다. 신뢰된 퍼블리시 설정을 stage‑only로 제한하면 해당 워크플로우에서 npm publish는 거부되고 npm stage publish만 허용됩니다. CI 워크플로우는 비대화형으로 계속 실행되고, 유지 관리자는 웹사이트나 CLI에서 스테이지된 버전을 승인합니다.
npm stage publish를 로컬에서도 실행할 수 있지만, 가장 가치가 높은 설정은 CI에서 스테이지 큐로 퍼블리시하고 유지 관리자가 신뢰된 디바이스에서 승인하는 방식입니다.
이미 대량 신뢰 퍼블리시 구성을 관리하고 있다면(2022년 2월 발표), 이를 활용해 패키지를 스테이지 퍼블리시로 마이그레이션할 수 있습니다. CI 워크플로우를 새로운 CLI 버전으로 업데이트하고 npm stage publish를 사용하도록 변경하세요.
새로운 설치 소스 플래그
npm 11.10.0에서 --allow-git을 도입해 npm install이 Git 소스에서 의존성을 가져오는 것을 제어할 수 있게 했습니다. npm 11.15.0부터는 다음 세 가지 플래그를 추가해 레지스트리가 아닌 모든 설치 소스에 대해 동일한 명시적 허용 목록 방식을 적용할 수 있습니다:
--allow-file: 로컬 파일 경로나 로컬 tarball 설치를 제어합니다.--allow-remote: 원격 URL(https :// 포함)에서의 설치를 제어합니다.--allow-directory: 로컬 디렉터리에서의 설치를 제어합니다.--allow-git(기존):github:,gitlab:,git+URL 및owner/repo와 같은 짧은 형태를 포함한 모든 Git 소스 설치를 제어합니다.
각 플래그는 all(현재 기본값) 또는 none을 허용하며, .npmrc나 package.json 설정에서도 지정할 수 있습니다.
자세한 내용은 문서를 확인하세요:
npm install레퍼런스 (같은 페이지에--allow-file,--allow-remote,--allow-git변형이 포함되어 있습니다)- 설정 레퍼런스
2022년 2월 발표를 다시 상기하면, --allow-git은 CLI 다음 주요 버전(v12)에서 기본값이 all에서 none으로 바뀔 예정입니다. 새로운 --allow-file, --allow-remote, --allow-directory 플래그는 11.15.0에 추가된 기능이며, 오늘 바로 none으로 설정해 보다 엄격한 동작을 선택할 수 있습니다.
토론에 참여하기
여러분이 어떻게 이 기능을 도입하고 있는지 듣고 싶습니다. 피드백과 질문을 GitHub Community 토론에서 공유해주세요.