-
Axios 사태로 다시 생각해보는 “안전하게 npm 패키지 사용하는 방법”JavaScript 2026. 6. 1. 00:23
올해에 4월초에 꽤 큰 사건이 하나 있었다.
👉 axios npm 패키지가 해킹된 사건
단순 취약점이 아니라,
“정상 패키지에 악성 코드가 포함된 상태로 배포”된 케이스다.사건 요약
- axios maintainer 계정 탈취
- 정상 버전처럼 보이는 패키지 배포
- 내부에 악성 dependency 삽입
- npm install 하는 순간 RAT(원격 제어 악성코드) 실행
👉 더 무서운 포인트는 이거다:
“코드를 실행한 게 아니라, 설치만 했는데 감염됨”
실제로 이 공격은 약 2~3시간 동안만 살아있었고
그 사이 설치한 환경은 그대로 위험에 노출됐다 (Snyk)
여기서 깨달아야 하는 포인트
이건 axios 문제가 아니다.
👉 npm 생태계 자체의 구조적인 문제
- 우리는 수백 개의 dependency를 신뢰한다
- 그 중 하나만 뚫려도 끝이다
- 심지어 “transitive dependency”면 눈에도 안 보임
그래서 필요한 관점
이제는 이렇게 생각해야 한다.
❌ “유명한 라이브러리니까 안전하겠지”
✅ “언제든 뚫릴 수 있다”
1. 가장 강력한 방법: “시간 지연 (cooldown)”
이거 진짜 핵심이다.
왜 효과가 있냐
대부분 공급망 공격 패턴은 이렇다
악성 버전 배포 → 몇 시간 ~ 며칠 내 발견 → 삭제실제 axios도
👉 약 2~3시간만 살아있다가 삭제됨 (Snyk)
해결 방법 -> 일정 기간 지난 버전만 설치
npm에서 이런 설정이 있다
# .npmrc min-release-age=7d👉 의미
“배포된 지 7일 안 된 패키지는 설치하지 않겠다”
왜 이게 엄청 강력하냐
- 공격은 대부분 “짧게 치고 빠짐”
- 커뮤니티가 빠르게 탐지
- npm에서 제거됨
즉,
👉 시간만 지나면 자연스럽게 필터링됨
실제로 이런 정책 하나로
많은 공격을 차단할 수 있다 (daniakash.com)
pnpm / bun도 가능
# pnpm-workspace.yaml minimumReleaseAge: 10080 # (분 단위 = 7일)
한 줄 정리
(쉽게 말하면, “갓 나온 버전은 위험하니까 당분간 안 쓴다” 전략이다)
2. lockfile을 “신뢰”하지 말 것
많이 착각하는 부분이다.
“package-lock.json 있으니까 안전한 거 아닌가?”
❌ 아니다.
왜냐면
npm install 실행 → lockfile 갱신 → 악성 버전 기록됨그 이후
npm ci👉 오히려 악성 버전을 “고정”해서 계속 설치함
그래서 필요한 것
- lockfile commit 필수
- lockfile 변경 PR 리뷰
- CI에서는 npm ci만 사용
👉 lockfile은 “방어 수단”이 아니라
“결과물”이다
3. install script (postinstall) 경계하기
axios 사건의 핵심도 이거였다.
"scripts": { "postinstall": "악성 코드 실행" }👉 npm install 하는 순간 자동 실행됨
대응 방법
- 새 dependency 추가 시 확인
- lockfile에서 hasInstallScript 체크
- 필요 없으면 scripts disable
현실적인 기준
“왜 이 패키지가 설치 시 스크립트를 실행하지?”
이 질문 한 번만 해도 많이 걸러진다.
4. 자동 업데이트를 무조건 믿지 않기
Dependabot, Renovate 좋다.
근데 문제는:
👉 “가장 최신 버전을 바로 올려준다”
해결 방법
Dependabot에도 cooldown 설정 가능
updates: - package-ecosystem: "npm" cooldown: default-days: 7👉 최신이 아니라
“검증된 최신”만 받는다
5. CI/CD에서 install 전략 바꾸기
많이 놓치는 부분
❌ 위험한 방식
npm install- 매번 최신 버전 가져옴
- 공격 타이밍에 그대로 당함
✅ 안전한 방식
npm ci- lockfile 기반
- 예측 가능
근데 이것만으로 부족함
👉 앞에서 말한 cooldown이랑 같이 써야 함
정리
이번 axios 사건이 말해주는 건 단순하다.
👉 “npm install은 안전하지 않다”
핵심 4가지
- min-release-age 설정 (가장 중요)
- lockfile 관리 (맹신 X)
- install script 경계
- 자동 업데이트도 cooldown 적용
덧붙임 (개발자 관점)
이거 하나는 확실히 바뀌어야 한다.
예전.
“최신 버전 쓰는 게 좋은 거 아닌가?”
지금,
👉 “조금 늦더라도 안전한 버전이 더 중요하다”
한 줄 결론
npm 생태계에서 가장 쉬운 보안은
“조금 늦게 설치하는 것”이다
참고자료
- https://snyk.io/blog/axios-npm-package-compromised-supply-chain-attack-delivers-cross-platform/ (Snyk)
- https://www.huntress.com/blog/supply-chain-compromise-axios-npm-package (Huntress)
- https://www.armorcode.com/blog/defending-against-npm-supply-chain-attacks-a-practical-guide (ArmorCode)
- https://daniakash.com/posts/simplest-supply-chain-defense (daniakash.com)
'JavaScript' 카테고리의 다른 글
Notes from reading 🔖 You Don't Know JS Yet - 13 (0) 2026.05.25 Notes from reading 🔖 You Don't Know JS Yet - 12 (0) 2026.05.17 Notes from reading 🔖 You Don't Know JS Yet - 11 (0) 2026.05.09 함수 파라미터 기본값, 왜 undefined는 되고 null은 안 될까? (0) 2026.03.14 Notes from reading 🔖 You Don't Know JS Yet - 10 (1) 2026.01.17