Trivy vs Grype 비교: 컨테이너 취약점 스캐너 선택 가이드
결론부터 말하면 이렇습니다. IaC·시크릿·k8s까지 한 도구로 다 보고 싶으면 Trivy, SBOM 중심 파이프라인이고 syft를 이미 쓰거나 세밀한 ignore 규칙이 필요하면 Grype. 둘 다 무료 오픈소스고 별점도 비슷해서 더 못 고르는 게 함정인데, 선택을 가르는 진짜 변수는 별점이 아니라 DB 출처·오탐 처리·CI 실패 정책 세 가지입니다. 이 글 하나로 5분 안에 결정하고, 복붙 가능한 CI 코드로 당일 적용까지 끝내봅시다.
왜 지금 CI에 취약점 스캐너를 박아야 하나
미국 행정명령(EO 14028)과 EU CRA(Cyber Resilience Act)로 SBOM 제출이 사실상 의무화되는 흐름이고, DevSecOps의 핵심은 보안 검사를 런타임이 아니라 빌드 단계로 당기는 "shift-left"입니다. 즉 이미지가 레지스트리에 올라가기 전, PR이 머지되기 전에 CRITICAL 취약점을 막는 게 표준이 됐습니다. Trivy와 Grype는 이 자리를 노리는 양대 오픈소스 스캐너입니다.
5분 핸즈온: 설치와 첫 스캔
같은 이미지(python:3.12-slim)에 둘 다 돌려보면 차이가 바로 체감됩니다.
# Trivy (Aqua Security)
brew install trivy
trivy image python:3.12-slim
# Grype (Anchore)
brew install grype
# 또는: curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
grype python:3.12-slim첫 실행은 둘 다 취약점 DB를 다운로드하느라 수십 초 걸리고, 이후엔 캐시를 써서 몇 초 내로 끝납니다. 출력 컬럼도 비슷합니다.
- Trivy:
Library(패키지) /Vulnerability(CVE-ID) /Severity/Installed Version/Fixed Version/Title - Grype:
NAME(패키지) /INSTALLED(설치 버전) /FIXED-IN(수정 버전) /TYPE/VULNERABILITY(CVE-ID) /SEVERITY
핵심은 둘 다 "어떤 패키지의, 어떤 버전이, 어느 CVE에 걸렸고, 어떤 버전으로 올리면 해결되는가"를 보여준다는 점입니다. 같은 이미지인데 결과 개수가 다르게 나오는 게 정상인데, 이유는 다음 표의 DB 출처 차이 때문입니다.
정면 비교표
| 항목 | Trivy | Grype |
|---|---|---|
| 개발/소속 | Aqua Security | Anchore |
| 취약점 DB | Trivy DB(Aqua 자체 집계, GitHub에 OCI 아티팩트로 배포) | grype-db(NVD·GitHub Security Advisory·배포판 보안 피드 통합) |
| 첫 실행 속도 | DB 다운로드 후 수초 | DB 다운로드 후 수초 (비슷) |
| 캐시 이후 속도 | 빠름 | 빠름 (대체로 Grype가 약간 더 빠른 편) |
| 지원 타깃 | 이미지·파일시스템·Git 리포·IaC(Terraform 등)·시크릿·k8s | 이미지·파일시스템·SBOM 중심 |
| SBOM 생성 | 자체 생성(--format cyclonedx/spdx) | 별도 도구 syft 연계 |
| 오탐 무시 | .trivyignore | .grype.yaml의 ignore: 블록 |
| 라이선스 | Apache 2.0 / 무료 | Apache 2.0 / 무료 |
결과 개수가 다른 이유: Trivy는 Aqua가 가공·집계한 DB를, Grype는 Anchore가 NVD와 각 배포판 피드를 통합한 DB를 씁니다. 같은 CVE도 적용 패키지 매칭 규칙이나 심각도 분류가 달라 개수에 차이가 납니다. 둘 중 하나가 "틀린" 게 아니라 데이터 소스 정책이 다를 뿐입니다.
CI에 박아넣기: 빌드 실패 + 오탐 무시
GitHub Actions (Trivy)
- name: Trivy scan
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myorg/myapp:${{ github.sha }}'
severity: 'CRITICAL,HIGH'
exit-code: '1' # CRITICAL/HIGH 발견 시 1 → 잡 실패 → PR 머지 차단GitLab CI (Trivy)
scan:
script:
- trivy image --exit-code 1 --severity CRITICAL,HIGH $IMAGEGrype
grype myorg/myapp:latest --fail-on high
# high 이상(= high, critical) 발견 시 exit-code 1exit-code 1이 핵심입니다. CI 잡이 실패로 끝나면 브랜치 보호 규칙에 따라 PR 머지가 막히고, 개발자는 머지 전에 취약 패키지를 업그레이드하게 됩니다. 이게 shift-left의 실체입니다.
오탐 조건부 억제
전체 억제 대신 조건부 억제 + 만료일을 거는 게 운영 정석입니다. 끄고 나서 잊어버리는 게 가장 위험하거든요.
# .trivyignore — CVE 한 줄씩, 만료일 지정 가능
CVE-2023-12345 exp:2026-12-31# .grype.yaml — vulnerability/package/fix-state 조건으로 정밀 무시
ignore:
- vulnerability: CVE-2023-12345
- package:
name: openssl
fix-state: not-fixed # 아직 패치 안 나온 건 한시적으로 무시실무 팁: 저는 "수정 버전이 아직 없는(not-fixed) CVE"는 빌드 차단에서 제외하고, 별도 백로그로 추적합니다. 고칠 수 없는 걸로 매번 빌드를 깨면 팀이 스캐너를 통째로 꺼버리는 사고가 납니다. Grype의
fix-state조건이 이때 빛을 발합니다.
SBOM 워크플로 차이
Grype는 같은 Anchore 식구인 syft와 자연스럽게 물립니다.
syft myorg/myapp:latest -o syft-json | grype
# 또는 미리 만들어둔 SBOM 재스캔
grype sbom:./sbom.jsonTrivy는 외부 도구 없이 자체적으로 SBOM을 생성하고, 그 SBOM을 다시 스캔할 수도 있습니다.
trivy image --format cyclonedx -o sbom.json python:3.12-slim
trivy sbom sbom.json표준 지원은 둘 다 SPDX와 CycloneDX를 커버합니다. 차이는 "SBOM 생성을 한 도구로 끝내느냐(Trivy)"와 "syft로 만든 SBOM을 그대로 흘려보내느냐(Grype+syft)"입니다. 이미 syft 파이프라인이 있다면 Grype가 손에 붙고, SBOM 도구를 새로 늘리기 싫으면 Trivy 하나로 끝납니다.
상황별 선택표
| 당신의 상황 | 추천 |
|---|---|
| 이미지뿐 아니라 IaC·시크릿·k8s 매니페스트까지 올인원 | Trivy |
| 학습비용 최소화, 빠른 첫 도입 | Trivy (기본값이 친절) |
| SBOM 중심 파이프라인, syft 이미 사용 중 | Grype |
| 세밀한 조건부 ignore(fix-state 등) 필요 | Grype |
| 단일 바이너리로 가볍게 시작 | 둘 다 가능 |
자주 묻는 질문 (FAQ)
Q. Trivy와 Grype 결과 개수가 왜 다른가요? A. 취약점 DB 출처가 다르기 때문입니다. Trivy는 Aqua 자체 집계 DB, Grype는 NVD·GitHub Advisory·배포판 피드를 통합한 grype-db를 씁니다. 패키지 매칭 규칙과 심각도 분류 차이로 개수가 달라지며, 한쪽이 틀린 게 아닙니다.
Q. 둘 다 무료인가요? 상용 버전이 있나요? A. 둘 다 Apache 2.0 오픈소스로 무료입니다. 다만 Aqua와 Anchore 모두 정책 관리·리포팅·SLA가 포함된 상용 플랫폼을 별도로 제공합니다. CI 스캔 용도라면 무료 버전으로 충분합니다.
Q. CI에서 어떤 심각도부터 막아야 하나요?
A. 처음엔 CRITICAL만 빌드 실패로 잡고, 안정화되면 HIGH까지 확장하는 걸 권장합니다. 처음부터 MEDIUM 이하까지 막으면 오탐·미수정 CVE에 빌드가 자주 깨져 팀이 스캐너를 무력화하기 쉽습니다.
Q. SBOM 없이 이미지만 스캔해도 되나요?
A. 네, trivy image나 grype <image>만으로 충분히 취약점을 잡습니다. SBOM은 공급망 추적·규제 대응·재스캔 자동화가 필요할 때 추가하면 됩니다.
Q. 오탐이 너무 많은데 줄이는 방법은?
A. 전체 억제 대신 조건부 억제를 쓰세요. Trivy는 .trivyignore에 만료일(exp:)을 붙이고, Grype는 .grype.yaml에서 fix-state: not-fixed처럼 수정 버전 없는 건만 한시적으로 제외하세요. 무시 항목은 반드시 백로그로 추적합니다.
이 글은 AI 에이전트가 1차 초안을 작성한 뒤, 사람 편집자가 사실관계·출처·톤과 맥락을 검토하여 발행했습니다. 오류나 부정확한 내용이 확인되면 24시간 이내에 정정합니다.
댓글
불러오는 중...