Node.js 프로젝트에서 종속성 업데이트 관리

완료됨

Tailwind Traders의 개발자로서 패키지를 최신 상태로 유지해야 합니다. 이는 최신 기능과 수정 사항을 사용하는 데 도움이 됩니다. 또한 보안 취약성을 방지하는 데에도 도움이 됩니다. 이 단원에서는 Node.js 프로젝트에서 종속성을 관리하는 방법을 알아봅니다. 패키지 업데이트, 유의적 버전 사용, 보안 문제 관리 방법을 배우게 됩니다.

패키지 업데이트 전 고려 사항

패키지를 업데이트하기 전에 다음을 고려합니다.

  • 업데이트 유형: 사소한 수정인지, 새로운 기능인지, 코드를 손상시킬 수 있는 주요 변경인지 파악합니다. 유의적 버전은 이를 식별하는 데 도움이 될 수 있습니다.
  • 프로젝트 구성: 예기치 못한 변경을 방지하려면 프로젝트가 원하는 업데이트만 수신하도록 설정되어 있는지 확인합니다.
  • 보안: 잠재적인 취약성을 파악합니다. npm의 감사 기능을 사용하여 문제가 있는 패키지를 식별하고 업데이트합니다.
  • 테스트: 업데이트 후 테스트가 통과되었는지 확인합니다. 테스트가 없으면 추가하는 것을 고려해 보세요. 업데이트 후 애플리케이션이 다르게 동작할 수 있으며 테스트를 통해 올바른 동작의 유효성을 검사합니다.

업데이트 동작을 정의하기 위한 유의적 버전

유의적 버전은 소프트웨어 개발의 핵심 표준입니다. npm 패키지를 게시하고 사용하는 데 필수적입니다. 새 버전의 변경 형식을 표시하여 업데이트 위험을 관리하는 데 도움이 됩니다. 버전 번호에는 이러한 변경 내용을 반영하는 특정 섹션이 있습니다.

버전 형식: Position 구문 발생하는 작업 업데이트 접근 방식
Major 1st x.0.0 또는 * 1.0.0에서 2.0.0으로의 변경은 호환성이 손상되는 변경을 나타냅니다. 코드 조정이 필요할 수 있습니다. 잠재적인 코드 변경을 인식하고 최신 주 버전으로 즉시 업데이트하는 것이 편합니다.
Minor 2차 1.x.1 또는 ^ 1.2.9에서 1.3.0으로 변경되면 새로운 기능이 도입됩니다. 기존 코드는 계속 작동해야 합니다. 업데이트는 일반적으로 안전합니다. 새로운 기능은 적용할 수 있지만 호환성이 손상되는 변경은 그렇지 않습니다.
Patch 타사 1.1.x 또는 ~ 1.0.7에서 1.0으로 변경되었습니다.8은 버그 수정을 의미합니다. 업데이트는 안전해야 합니다. 버그 수정을 수락합니다.

소규모 Node.js 프로젝트의 경우 최신 버전으로 자유롭게 업데이트할 수 있습니다. 그러나 대규모 프로젝트의 경우 업데이트를 신중하게 고려해야 하며 항상 자동으로 수행되는 것은 아닙니다. 일반적으로 자체 종속성이 적은 작은 종속성을 업데이트하면 프로세스가 더 쉬워집니다.

하나 이상의 종속성을 업데이트하기 전에 npm update <name of dependency> 명령 실행 시 예측 가능한 동작을 가져오도록 package.json 파일을 구성해야 합니다. Node.js는 패키지 업데이트 방법을 정의할 수 있는 기호 집합을 사용합니다.

npm CLI를 사용하여 패키지 업데이트

npm에서 install 또는 update 명령을 사용하여 패키지를 설치할 수 있습니다. 이제 이러한 명령은 대부분 서로 바꿔서 사용할 수 있습니다. 패키지를 업데이트하려면 일반적으로 다음을 사용합니다.

  • 최신 버전: npm update <package name>@latest.
  • 특정 버전: npm update <package name>@<optional version number>.

업데이트 프로세스는 다음 두 가지 요소에 따라 달라집니다.

  • 버전 인수: npm update 명령에 버전 번호가 지정되면 npm은 해당 특정 버전을 가져와 설치합니다.
  • 매니페스트 파일 항목: package.json 파일에는 종속성을 업데이트하기 위한 규칙이 포함되어 있습니다. 예를 들어, "dependencyName": "1.1.x"는 npm이 이 패턴과 일치하는 버전을 가져오는 것을 의미합니다.

버전 관리 이해

세 개의 파일은 종속성의 버전 관리를 제어합니다.

  • package.json: 이 파일은 사용하려는 패키지의 버전을 정의합니다. 프로젝트의 매니페스트 파일입니다. 종속성을 포함하여 프로젝트에 대한 메타데이터를 포함합니다.
  • package-lock.json: 이 파일은 중간 종속성 업데이트에 관계없이 후속 설치에서 동일한 트리를 생성할 수 있도록 생성된 정확한 트리를 설명합니다. 이 파일은 원본 리포지토리에 커밋됩니다.
  • shrinkwrap.json: 이 파일은 CLI 명령에 의해 npm shrinkwrap 생성되며 .package-lock.json 명령의 주요 차이점은 지정된 npm-shrinkwrap.json 패키지 버전을 사용자가 재정의할 수 없다는 것입니다. 또한 npm-shrinkwrap.json 파일은 이전 버전의 npm(버전 2-4)과 호환되는 반면 package-lock.json npm 버전 5 이상과 호환됩니다. 따라서 레거시 코드베이스를 기본 때 찾을 npm-shrinkwrap.json 수 있습니다. 대부분의 개발자는 package-lock.jsonnpm-shrinkwrap.json. 디먼의 전역 설치 및 개발자가 지정된 패키지의 정확한 버전이 설치되도록 하려는 명령줄 도구가 기본 설정되는 한 가지 예외 npm-shrinkwrap.json 입니다.

패키지 버전 결정 예제

코드에서 버전 1.2를 사용하고 있는데 버전 1.4가 릴리스되어 코드가 손상되는 시나리오를 생각해 보세요. 이 시점에서 누군가가 사용자의 앱을 설치하면 작동하지 않는 앱을 가져오게 됩니다. 그러나 버전 1.2를 지정하는 package-lock.json 파일이 있으면 해당 버전이 설치됩니다.

다음은 설치된 패키지 버전을 확인하는 예입니다.

  • package.jsonpackage-lock.json 파일이 버전 규칙에 동의하면 충돌이 없습니다. 예를 들어, package.json1.x를 지정하고 package-lock.json이 버전 1.4를 지정하면 버전 1.4가 설치됩니다.
  • package.json1.8.x와 같이 보다 구체적인 버전을 지정하는 경우 1.4의 이전 버전을 나타내는 package-lock.json 파일을 재정의합니다. 이 경우, 가능한 경우 버전 1.8.0 이상의 패치 버전이 설치됩니다.

npm outdated를 사용하여 오래된 패키지 찾기 및 업데이트

npm outdated 명령은 사용 가능한 최신 버전이 있는 패키지를 식별하는 데 사용됩니다. 실행하면 다음과 같은 오래된 패키지 목록이 제공됩니다.

Package       Current    Wanted   Latest     Location     Depended by
lodash        1.0.0      1.0.0    4.17.19    lock-test    main-code-file
node-fetch    1.2.0      1.2.0    2.6.0      lock-test    function-code-file

출력의 열에는 다음이 포함됩니다.

설명
Package(패키지) 오래된 패키지.
현재 현재 설치된 패키지 버전.
필요 항목 package.json 파일에 지정한 의미 체계 패턴과 일치하는 최신 버전.
가장 늦은 날짜 최신 버전의 패키지입니다.
위치 패키지 종속성의 위치. outdated 명령은 다양한 node_modules 폴더에 설치된 모든 패키지를 크롤링합니다.
종속 대상 종속성이 있는 패키지.

npm 감사로 보안 문제 관리

패키지를 설치하거나 업데이트할 때마다 설치된 버전과 취약성이 있는지 여부를 알려 주는 로그 응답을 가져오게 됩니다. 로그에는 취약성이 나열되어 있습니다. 심각하거나 높은 취약성이 있는 경우 패키지를 업데이트해야 합니다.

로그 응답의 예는 다음과 같습니다.

+ lodash@1.3.1
added 1 package from 4 contributors and audited 1 package in 0.949s
found 3 vulnerabilities (1 low, 2 high)
  run `npm audit fix` to fix them, or `npm audit` for details

문제를 해결하고 업데이트를 적용하려면 npm audit 명령을 실행하면 됩니다. 이 명령은 각 취약성을 나열합니다.

npm audit fix 명령은 문제가 존재하지 않는 부 버전으로 업그레이드하여 취약성을 해결하려고 시도합니다. 그러나 수정 사항이 실제로 다음 주 버전에 있는 경우에는 이 기능을 사용하지 못할 수도 있습니다.

이러한 경우 주 버전으로 업데이트하여 호환성이 손상되는 변경을 도입할 수 있는 npm audit fix --force를 사용해야 할 수도 있습니다. 이 명령을 실행하는 것은 신중하게 결정해야 합니다. 호환성이 손상되는 변경을 인지하고 npm update를 사용하여 취약성을 포함한 코드를 업데이트해야 합니다.

취약성은 공격자가 악용하여 악의적인 작업을 수행하여 잠재적으로 데이터와 시스템을 손상시킬 수 있는 코드 결함입니다. 이러한 취약성을 즉시 해결해야 합니다.

취약성이 자주 발견되는 경우 GitHub에는 리포지토리를 검사하고 더 안전한 버전으로 업그레이드를 제안하는 PR을 자동으로 만드는 기능이 있습니다. 정기적으로 npm audit를 실행하는 것은 취약성을 식별하고 수정하여 프로젝트의 전반적인 보안에 기여하는 좋은 방법입니다.

권장 업데이트 워크플로는 다음과 같습니다.

  1. npm run test: 이 업데이트 프로세스를 시작하기 전에 기존 테스트를 통과했는지 확인합니다.
  2. npm audit: 사용 중인 현재 버전의 취약성을 확인합니다. npm audit의 정보는 주 버전으로 업데이트하는 것을 권장할 수 있습니다. 호환성이 손상되는 변경이 나열되어 있으면 주의 깊게 검토해야 합니다.
  3. npm outdated: 오래된 패키지를 모두 나열합니다. 이 명령은 Wanted, LatestLocation 열의 정보를 제공합니다.
  4. npm update로 업데이트합니다.
    • 소규모 프로젝트(package.json에 몇 가지 종속성이 있는 경우: npm update를 시도하여 모든 종속성을 업데이트한 다음 테스트를 실행할 수 있습니다.
    • package.json에 종속성이 많은 대규모 프로젝트의 경우: 단일 패키지 또는 패키지 제품군(예: Next.js 및 React)을 업데이트한 후 테스트를 실행합니다.
  5. npm audit: 심각하거나 높은 취약성이 없는지 확인합니다. 취약성이 여전히 존재하는 경우 npm audit에서 권장되는 패키지 이름 및 주 버전과 함께 npm update를 사용합니다.
  6. npm run test를 다시 사용합니다.
  7. package.jsonpackage-lock.json을 체크 인합니다.