npm audit fix

etc

취약한 의존성을 찾아보자

한 줄 요약

취약점 DB를 조회해서, 취약한 의존성을 semver 호환되는 최신 패치 버전으로 올리고 package-lock.json을 갱신한다. 기본값은 비파괴적(non-breaking) 인 변경만 적용하며, major 버전을 강제로 올리려면 별도로 --force 옵션이 필요하다 (권장하지 않음).


취약점 DB란?

GitHub Advisory Database (GHSA) 를 말한다. npm 레지스트리에 등록된 패키지들 중 알려진 보안 취약점을 모아둔 데이터베이스다.

동작 방식은 다음과 같다.

  • npm audit를 실행하면, 내 프로젝트의 의존성 목록(package-lock.json 기반)을 npm 레지스트리로 전송해서 알려진 취약점을 확인해달라고 요청한다.
  • 설치된 패키지 버전들을 npm이 관리하는 취약점 DB와 대조하고, 취약한 패키지를 찾아내서 의존성 트리에서 어떻게 포함됐는지 추적한다.

취약점이 발견되면 심각도(critical/high/moderate/low), 설명, 어느 패키지 경로로 들어왔는지, 패치된 버전 정보 등이 리포트로 표시된다.

공개적으로 직접 찾아보고 싶다면 → github.com/advisories

semver란?

패키지 버전을 1.2.3 형태로 표기하는 규칙(Semantic Versioning)이다. 각 자리는 서로 다른 의미를 가진다.

1  .  2  .  3
▲     ▲     ▲
major minor patch
  • patch (마지막 자리): 버그 수정. 기존 동작을 바꾸지 않음. 예: 1.2.31.2.4
  • minor (가운데 자리): 기능 추가. 기존 코드는 여전히 정상 작동해야 함. 예: 1.2.31.3.0
  • major (첫 자리): 기존 동작을 깨뜨릴 수 있는 변경(breaking change). 예: 1.2.32.0.0

이는 패키지 작성자가 "major를 올리지 않았다면 기존 코드는 망가지지 않는다"고 보증하는 일종의 약속이다. package.json에서 "^1.2.3"처럼 캐럿(^)을 붙이면, "major는 고정하고 minor·patch는 자동으로 올려도 된다"는 의미가 된다. 이 범위 안에서의 업데이트를 semver 호환이라고 부른다.

비파괴적(non-breaking)이란?

npm audit fix가 기본적으로 하는 일은 다음과 같다.

  • 취약한 패키지를 같은 major 버전 범위 안에서 최신 patch/minor로만 업데이트
  • ^1.2.3 범위라면 1.2.31.5.0까지는 올리지만, 2.0.0으로는 올리지 않음

major 버전업은 API 변경, 함수 시그니처 변경 등으로 기존 코드가 갑자기 동작하지 않을 위험이 있다. 그래서 npm은 기본적으로 안전한 범위만 자동으로 수정하고, 그 이상의 변경은 사용자가 직접 확인 후 판단하도록 --force 옵션을 별도로 요구한다.

정리

npm audit fix는 "코드가 깨질 위험이 없는 선"에서 취약점이 있는 패키지를 최신 안전 버전으로 올려주는 명령어다.

만약 취약점 해결에 major 버전업이 필요하다면 자동으로 처리되지 않고, npm audit 실행 시 "--force 없이는 해결되지 않는다"는 안내가 표시된다. 이 경우에는 해당 패키지의 체인지로그(major 변경 사항)를 직접 확인한 뒤 수동으로 업그레이드하는 것이 안전하다.