의존성 보안
규칙
- CI에서
npm audit 실행 — 높음/치명적 취약점 발생 시 빌드 실패 처리
lockfile-lint를 사용하여 모든 패키지가 공식 npm 레지스트리로 확인되도록 검증
package.json에서 메이저 버전 고정: 마이너 업데이트에는 ^ 사용, * 또는 latest 사용하지 않음
- 새 의존성을 설치하기 전에 검토: npm 다운로드 수, 최종 게시일, 유지관리자 수 확인
npm ls --all을 사용하여 전이 의존성 감사 — 직접 의존성이 수백 개의 추가 패키지를 끌어옴
- Snyk, Socket.dev 또는 GitHub Dependabot 설정하여 실시간 취약점 알림 받기
- 의존성을 주 단위로 업데이트 — 오래된 의존성은 알려진 취약점이 쌓임
- name: 의존성 감사
run: npm audit --audit-level=high
- name: 잠금 파일 무결성 검증
run: npx lockfile-lint --path package-lock.json --type npm --allowed-hosts npm --validate-https
{
"dependencies": {
"next": "^14.0.0",
"react": "^18.0.0",
"zod": "^3.0.0"
}
}
피해야 할 사항
- 패키지를 먼저 확인하지 않고
npm install random-package 실행 — 타입스쿼팅(Typosquatting)은 실제 위협
npm audit 경고 무시 — 알려진 취약점은 가장 쉬운 공격 벡터
* 또는 latest를 버전 범위로 사용 — 손상된 게시물이 즉시 빌드에 영향을 줌
- 신뢰할 수 없는 패키지의
postinstall 스크립트를 검토 없이 실행
- 인기 있는 패키지는 안전하다고 가정 —
event-stream(수백만 다운로드)조차 손상된 사례가 있음