
풍자 한 문장에 담긴 npm의 현실
이 글의 원제는 'No way to prevent this, says only package manager where this regularly happens'인데요, 이게 사실 유명한 풍자예요. 미국에서 총기 사건이 일어날 때마다 '이걸 막을 방법이 없다'는 말이 반복되는 걸 비꼬는 The Onion이라는 매체의 헤드라인을 패러디한 거거든요. 풀어 말하자면 '이 일이 정기적으로 일어나는 유일한 패키지 매니저인데, 그 매니저만 막을 방법이 없다고 한다'는 뜻이에요. 어디 얘기일까요? 짐작하셨겠지만 npm 얘기예요.
또 무슨 일이 있었길래
npm은 자바스크립트 생태계의 패키지 매니저예요. 우리가 npm install react 하면 어디선가 react 패키지를 다운로드해서 설치해주는 그것이요. 문제는 이 npm 레지스트리에서 공급망 공격(supply chain attack)이 잊을 만하면 터진다는 거예요. 공급망 공격이 뭐냐면, 우리가 직접 만든 코드가 아니라 의존성으로 가져다 쓰는 외부 라이브러리에 악성 코드가 숨어 들어와서 우리 시스템을 망가뜨리는 공격이에요.
가장 흔한 패턴은 이래요. 누군가 인기 있는 라이브러리 메인테이너의 계정을 탈취하거나, 메인테이너가 실수로 악성 의존성을 추가하거나, 아니면 처음부터 비슷한 이름의 가짜 패키지를 올려놓고 오타로 잘못 설치되기를 기다리는 거예요(타이포스쿼팅, typosquatting이라고 해요). 한 번이라도 악성 버전을 설치하면 그 즉시 환경 변수나 SSH 키, AWS 자격증명 같은 게 어딘가로 전송되는 거죠.
왜 npm에서만 이런 일이 자주 일어날까
다른 언어의 패키지 매니저—파이썬의 pip, 러스트의 cargo, 자바의 maven—에서도 비슷한 사고가 가끔 있긴 해요. 그런데 npm에서 유독 빈번한 데에는 몇 가지 구조적 이유가 있어요.
첫째는 의존성 트리가 미친 듯이 깊다는 거예요. 자바스크립트 문화에서는 작은 기능 하나도 별도의 패키지로 쪼개는 게 일반적이거든요. left-pad 사건 기억하시는 분 있으실 거예요. 그래서 react 하나 설치하면 그 안에 수백 개의 의존성이 줄줄이 따라와요. 그중 하나만 오염돼도 전체가 위험해지죠.
둘째는 자동 실행 스크립트 문제예요. npm은 패키지 설치 시 postinstall 같은 훅을 자동으로 실행하는데, 여기에 임의의 코드를 넣을 수 있어요. 그러니까 npm install 한 번 누르는 것만으로도 의존성 트리 어딘가의 악성 코드가 즉시 실행될 수 있는 거예요.
셋째는 메인테이너 인증의 허술함이에요. 한동안은 2FA(이중 인증)도 강제되지 않았고, 이메일 계정 탈취로 패키지를 가로채는 일이 너무 쉬웠어요. 최근에는 많이 개선됐지만 여전히 빈틈이 있어요.
다른 생태계는 어떻게 하고 있나
Deno와 Bun 같은 새로운 런타임들은 이 문제를 의식해서 권한 모델을 도입하거나 의존성을 더 명시적으로 관리하려고 해요. Deno는 기본적으로 파일 시스템이나 네트워크 접근을 차단하고 명시적으로 허용해야만 쓸 수 있게 만들었어요. pnpm은 의존성 격리를 더 엄격하게 해서 호이스팅(hoisting)으로 인한 사이드 이펙트를 줄였고요. 러스트의 cargo는 build.rs 스크립트가 실행되긴 하지만 npm만큼 자유롭진 않아서 사고 빈도가 낮아요.
한국 개발자에게 주는 시사점
당장 할 수 있는 방어책 몇 가지를 챙겨두시면 좋아요. npm ci로 lock 파일을 엄격히 따르고, npm audit을 CI에 넣어 알려진 취약점을 체크하고, 가능하면 --ignore-scripts 옵션이나 사설 레지스트리를 검토해보세요. 회사 코드라면 Renovate나 Dependabot으로 의존성 업데이트를 모니터링하고, 메인 브랜치에 머지하기 전에 변경된 패키지 diff를 한 번이라도 보는 습관이 진짜 중요해요. 작은 패키지를 새로 추가할 때 메인테이너가 누구이고 다운로드 추이가 어떤지 30초만 확인해도 사고를 많이 줄일 수 있거든요.
마무리
'막을 방법이 없다'는 변명은 사실 게으름의 다른 말이에요. 우리 프로젝트의 의존성 트리, 마지막으로 들여다보신 게 언제인가요? 오늘 한 번 npm ls를 돌려보시는 건 어떨까요?
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공