Logo냥냠감자기술 블로그
Skip to Content
Dev Log삼냥이즈axios에서 시작해 pnpm으로 끝난 보안 대응기
작성일: 2026-04-02

axios에서 시작해 pnpm으로 끝난 보안 대응기

최근 axios 패키지에서 발생한 supply chain attack 이슈가 크게 주목받고 있다.

3월 30일부터 31일 사이 배포된 일부 버전의 axios 패키지에 악성 코드가 포함된 채 배포되었으며,

해당 버전을 설치한 경우 서버 환경 정보나 API Key 등 민감 정보가 유출될 가능성이 있는 것으로 보고되었다.

이에 따라 개발중인 서버가 해당 부분에 보안 이슈가 있는지 검토하고, 패키지 매니저를 옮긴 과정까지 정리해두려 한다.

공격 방식

이번 공격은 Supply Chain Attack이다.

Supply Chain Attack은 서버의 취약점을 직접 공격하는 방식이 아니라,

개발자가 신뢰하고 사용하는 패키지를 통해 간접적으로 침투하는 공격 방식이다.

이번 사례에서는 axios 패키지 내부에 악성 코드가 삽입되었고,

설치 과정(postinstall)에서 외부 C2(Command & Control) 서버와 통신이 이루어진다.

이 과정에서:

  • 추가 payload 다운로드

  • RAT(Remote Access Trojan) 실행

  • 시스템 정보 수집 및 외부 전송

등의 행위가 수행되는 구조로 분석되었다.

이러한 공격이 성공할 경우:

  • API Key / Secret 탈취

  • 서버 환경 정보 유출

  • 원격 명령 실행

등의 심각한 보안 문제가 발생할 수 있다.

[영향받은 버전]

문제가 보고된 axios 버전은 다음과 같다:

  • axios 1.14.1 버전

  • axios 0.30.4 버전

해당 버전은 3월 31일에 배포되었으며,

현재는 사용을 피하고 안전한 버전으로의 전환이 권장된다.

대응과정

다행히 개발중인 서버가 의존하고 있는 axios 패키지는 안전한 버전이었다.

그럼에도 이번 사건으로부터 다음과 같은 필요성을 느꼈다:

[1. 패키지 매니저 통일]

과거 npm에서 pnpm으로 패키지 매니저를 옮기려 하던 중 파일이 꼬여 그냥 npm을 한동안 더 사용하고 있었다.

npm과 pnpm 파일이 모두 서버 디렉토리에 남아있는 상황이었고,

pnpm의 일부 설정 파일이 남아 있어 실제 의존성 구조를 파악하기 어려운 상황이었다.

이로 인해 어떤 버전의 패키지가 실제로 설치되는지 명확하지 않았다.

이를 계기로 더 진보된 방식인 pnpm으로 패키지 매니저를 통일하기로 했다.

[2. Lock 파일 기반 설치]

package.json은 설치 가능한 버전 범위를 정의하기 때문에

환경에 따라 서로 다른 버전이 설치될 수 있다.

이번 사례에서 서버가 안전한지 확인하기 위해 로컬, 테스트 서버, 배포 서버에 설치된

axios의 버전을 모두 점검해야 했다.

따라서 정확한 버전을 고정하는 것이 중요하다고 생각했다.

이에 따라 pnpm-lock.yaml을 기준으로 항상 동일한 버전이 설치되도록 하였다.

pnpm으로 패키지 매니저 이전

기존 package-lock.json을 제거하고

pnpm-lock.yaml 기반으로 의존성 관리를 전환했다.

공식 가이드에서는 1.14.0으로의 다운그레이드를 권장하고 있지만,

추가적인 안정성을 고려해 기존 사용하면서 검증된 더 낮은 버전을 그대로 사용하였다.

서버는 nestjs이기 때문에 Fetch 등은 nestjs/axios라는 패키지를 이용해 수행한다.

nestjs/axios가 axios를 의존하기 때문에 nestjs/axios가 의존하는 버전이 중요했다.

이 문제를 해결하면서 알게 되었는데 nestjs/axios는 axios를 peer dependency로 가진다.

즉 의존할 axios를 직접 설치해야 한다.

기존 npm 환경에서는 큰 문제가 드러나지 않았는데 아무래도 npm이 pnpm에 비해 규제가 약하다보니

peer dependency가 명시되지 않아도 문제가 드러나지 않았던 것으로 보인다.

npm과 pnpm 명령어 비교

작업npmpnpm
의존성 설치npm installpnpm install
패키지 추가npm install 패키지명pnpm add 패키지명
패키지 삭제npm uninstall 패키지명pnpm remove 패키지명
빌드npm run buildpnpm build
테스트npm testpnpm test
스크립트 실행npm run 스크립트pnpm 스크립트

마무리

아직 모든 보안 위협을 고려하며 개발하는 것은 쉽지 않다.

그럼에도 내가 직접 설치하는 패키지 뿐만 아니라 그 패키지가 의존하는 패키지까지

내가 만드는 소프트웨어의 안정성에 직접적인 영향을 줄 수 있다는 점을 인지하게 되었다.

특히 npm을 쓴다면 패키지가 호이스팅되니 더더욱 그렇다는 것을 배웠다.