오픈소스 의존성은 이미 대부분의 제품 경로에 들어가 있고, 이제 질문도 “SBOM을 만들 수 있나요?”에서 “이 릴리스에 무엇이 들어갔고, 새 취약점이 나오면 누가 얼마나 빨리 어떤 근거로 판단하나요?”로 이동하고 있습니다. 규제 준비, 조달 보안 심사, 대형 고객의 vendor review는 표현은 달라도 같은 운영 능력을 요구합니다. 목록 파일을 한 번 내보내는 일보다, 시간이 지난 뒤에도 당시의 배포·판단·완화 조치를 설명할 수 있는지가 중요해졌습니다.

이 글은 법률 해석이나 특정 관할의 준수 선언이 아닙니다. 적용 법령과 계약 의무는 법무·보안 담당자와 확인해야 합니다. 다만 오픈소스 지속 가능성과 공급망 SLO, 런타임 도달 가능성 기반 취약점 우선순위, OCI Referrers와 artifact lifecycle, npm trusted publishing의 릴리스 경로을 연결해, 제출용 문서가 아니라 지속적으로 갱신되는 대응 증거를 만드는 실무 기준을 다룹니다.

이 글에서 얻는 것

  • SBOM, provenance, 취약점 scanner 결과를 각각의 산출물이 아니라 하나의 release evidence chain으로 묶는 방법을 배웁니다.
  • CVE 점수만으로 우선순위를 정할 때 생기는 과잉 패치와 실제 노출 누락을 줄이는 기준을 얻습니다.
  • owner, triage SLA, 예외 만료, 고객 통지를 운영 데이터로 관리하는 방법을 정리합니다.
  • 규제·감사 요구가 늘어도 개발팀의 release 속도를 멈추지 않게 하는 최소 자동화 순서를 확인합니다.

핵심 개념/이슈

1) SBOM은 답안지가 아니라 특정 시점의 inventory다

SBOM은 패키지 이름·버전·라이선스·관계를 정리하는 데 유용합니다. 하지만 그것만으로 다음 질문에는 답하기 어렵습니다. 그 component가 어느 image digest나 binary에 들어갔는가? 그 artifact가 어느 환경에 배포됐는가? production에서 실제로 로드됐는가? 새 CVE가 발표된 뒤, 팀은 언제 인지하고 어떤 근거로 patch·완화·영향 없음으로 결론 냈는가?

그래서 inventory를 아래 네 연결로 확장해야 합니다.

source commit / dependency lock
  -> immutable build artifact + SBOM + provenance
  -> deployment receipt (environment, digest, time)
  -> vulnerability case (exposure, decision, mitigation, expiry)

중요한 점은 모든 정보를 하나의 거대한 GRC 시스템에 먼저 넣는 것이 아닙니다. release마다 바뀌지 않는 artifact digest를 기준점으로 삼고, SBOM과 provenance가 그 digest를 가리키게 하며, 배포 시스템이 실제 환경·시각을 기록하도록 만들면 최소 연결이 생깁니다. OCI referrer처럼 증명 metadata를 subject digest와 분리해 관리할수록, 태그가 이동하거나 registry를 복제해도 “무엇에 대한 증명인가”를 잃지 않습니다.

2) 취약점 우선순위는 점수표가 아니라 노출·완화·시간의 조합이다

CVSS가 높다는 사실은 무시하면 안 되지만, 모든 high/critical 항목이 같은 운영 위험은 아닙니다. 인터넷에 노출된 인증 경계에서 실제 취약 함수가 호출되는 경우와, 개발 전용 도구의 optional dependency에 들어 있지만 production artifact에는 없는 경우는 조치 속도가 달라야 합니다. “영향 없음”도 scanner를 끄는 일이 아니라 현재 release와 runtime 정보를 기준으로 재검증 가능한 주장이어야 합니다.

초기 분류는 다음 네 축이면 충분히 시작할 수 있습니다.

축확인할 질문위험을 올리는 예시
실행취약 component가 production artifact·runtime에 있는가loaded module, reachable code path
노출공격 입력이 신뢰 경계 밖에서 들어오는가public endpoint, untrusted file, plugin
권한성공 시 어떤 권한·데이터에 닿는가privileged worker, tenant data, CI secret
완화현재 control이 exploit 조건을 실제로 막는가egress deny, feature off, strict auth

예를 들어 critical 항목이라도 feature가 compile-time으로 빠졌고 해당 artifact가 production에 배포되지 않았다면, “영향 없음”의 근거는 source graph·build flag·deployment receipt여야 합니다. 반대로 CVSS가 중간이더라도 public parser에 도달하고 sandbox escape 가능성이 있다면 즉시 차단·격리·패치가 필요할 수 있습니다. 도달 가능성 기반 우선순위는 이 판단을 더 좁히는 데 도움이 되지만, 자동 분석 결과만으로 근거를 닫아서는 안 됩니다.

3) 대응 속도는 SLA 문구가 아니라 case lifecycle에서 증명된다

문서에 “critical은 신속히 처리한다”고 적는 것과 실제로 처리하는 것은 다릅니다. 운영 가능한 정책은 수신 시각, 영향 판정 시각, 임시 완화 시각, patch 배포 시각, 고객 통지 여부, 예외 만료 시각을 같은 case ID로 남깁니다. 담당자가 휴가 중이거나 dependency owner가 바뀌어도 case가 멈추지 않으려면 product owner와 platform/security owner를 분리해 두는 편이 낫습니다.

아래 시간은 법적 기준이 아니라 팀이 먼저 계측할 수 있는 출발점입니다. 고객 계약·서비스 등급·악용 징후가 있으면 더 짧게 잡아야 합니다.

등급예시 조건최초 triage 목표기본 다음 행동
긴급active exploitation, public RCE, secret exposure4시간사용 중지·egress 차단·incident owner 지정
높음production reachable + 신뢰 경계 침범1영업일patch 또는 검증된 임시 완화·배포 계획
보통reachability 미확정 또는 제한된 내부 노출3영업일artifact·runtime evidence 수집 후 우선순위 확정
낮음dev-only 또는 production artifact 부재10영업일근거 보관·다음 정기 검토에 편입

이 표의 핵심은 “10일 안에 무조건 patch”가 아닙니다. 상태가 new → triaged → mitigated → fixed → verified → closed로 움직이는지, accepted_risk에 들어간 항목이 만료일에 다시 열리는지를 측정하는 것입니다. 해결은 merge된 PR이 아니라, 영향을 받는 release가 교체됐거나 독립적인 control이 작동한다는 verification receipt까지 있어야 합니다.

실무 적용

1) release evidence card를 작게 자동 생성한다

처음부터 모든 패키지와 모든 서버를 완벽히 매핑하려 하면 도입이 멈춥니다. production 배포가 잦거나 고객 데이터에 닿는 상위 서비스 3개부터 release evidence card를 만들면 됩니다. 카드에는 사람이 긴 설명을 쓰기보다 CI·registry·배포 도구가 채울 수 있는 필드를 둡니다.

release: payments-api@2026.10.22.3
artifact_digest: sha256:...
sbom_ref: oci://registry/...@sha256:...
provenance_ref: oci://registry/...@sha256:...
source_commit: 1a2b3c4
environments: [prod-kr, prod-us]
component_owner: payments-platform
security_contact: security-oncall
policy_version: vuln-response-2026-10

이 카드는 검색성과 연결성이 목적입니다. 취약점 알림이 왔을 때 패키지 이름만 검색하는 대신, 해당 component가 있는 artifact digest와 그 digest가 있는 환경을 바로 찾을 수 있어야 합니다. 생성이 실패했다고 배포를 무조건 막을지 여부는 위험도에 따라 다릅니다. payment·identity처럼 고위험 서비스는 fail-closed가 맞을 수 있지만, 내부 실험 서비스는 receipt 누락을 경고·추적 후 제한적으로 허용할 수 있습니다. 단, 예외 역시 case로 남기고 만료돼야 합니다.

2) scanner 결과를 자동 closure가 아닌 조사 queue의 입력으로 둔다

scanner는 속도를 주지만 의미를 완성하지는 못합니다. 이름 기반 매칭은 false positive를 만들고, transitive dependency·vendored code·runtime loading은 놓칠 수 있습니다. 따라서 scanner event를 case 생성과 owner routing에는 사용하되, not_affected나 fixed 상태는 evidence field가 채워져야만 닫히게 만드세요.

최소 evidence field는 다음이면 충분합니다.

  • 영향을 받는 component와 artifact digest, production 배포 환경
  • exploit precondition과 reachable 여부의 판단 근거
  • 선택한 조치: patch, disable, network/auth control, accepted risk
  • 조치 검증 결과와 재검토·예외 만료 시각
  • 고객 또는 내부 이해관계자 통지가 필요한지와 실제 발송 receipt

AI나 자동 분류기가 초안을 만들더라도 최종 책임을 대체하면 안 됩니다. 특히 “코드 경로가 없다”는 결론은 build flag·runtime config·동적 plugin·admin-only endpoint를 함께 봐야 합니다. 자동화의 좋은 역할은 누락을 찾고 증거를 모으는 것이지, 노출 판단의 책임자를 지우는 것이 아닙니다.

3) 예외를 숨기지 말고 만료되는 운영 부채로 취급한다

patch가 즉시 불가능한 경우는 있습니다. 호환성이 깨지거나, vendor fix가 없거나, 긴급 배포가 더 큰 장애를 만들 수 있습니다. 이때 “나중에 업데이트”라는 comment는 대응이 아닙니다. 예외에는 최소한 다음 네 가지가 필요합니다: 왜 지금 patch할 수 없는지, 어떤 compensating control이 있는지, 누가 승인했는지, 언제 다시 평가할지.

예외가 30일을 넘으면 플랫폼·보안·서비스 owner가 함께 재검토하도록 자동 ticket을 만들고, 만료 7일 전에는 담당 채널에 알립니다. 중요한 것은 예외 숫자를 0으로 꾸미는 것이 아니라, 오래된 예외와 근거 없는 not_affected가 빠르게 드러나는 상태입니다. 이 운영은 오픈소스 지속 가능성 SLO에서 말한 maintainer·dependency health의 문제와도 연결됩니다. 대응 능력은 취약점 관리 도구 하나가 아니라, 소유권과 유지보수 시간을 포함한 공급망의 성질입니다.

트레이드오프/주의점

증거를 많이 남길수록 감사 대응은 쉬워지지만, release pipeline에 수동 입력이 쌓이면 개발자는 우회 경로를 찾습니다. 그래서 release를 막는 필드와 나중에 보완 가능한 필드를 구분해야 합니다. artifact digest와 component owner처럼 추적의 시작점이 되는 값은 자동 생성·강제하고, 장문의 영향 분석은 alert가 생겼을 때 case에 붙이는 방식이 효율적입니다.

또한 SBOM은 민감할 수 있습니다. 공개 endpoint, 내부 package 이름, build path, third-party 계약 정보가 포함될 수 있으므로 외부 제출본과 내부 원본의 접근 범위·보존 기간을 분리하세요. SBOM을 고객에게 제공하는 일과 production registry에서 누구나 모든 증명 metadata를 읽게 하는 일은 다릅니다.

마지막으로 법률·계약 요구를 기술팀 혼자 해석하지 마세요. 적용 대상, 보고 기한, 고객 통지 문구, 개인정보·수출 통제와의 관계는 관할과 계약에 따라 달라집니다. 이 글의 운영 지표는 법적 준수의 보증이 아니라, 보안·법무·제품이 같은 사실을 가지고 판단하기 위한 공통 재료입니다.

체크리스트 또는 연습

  • production release마다 artifact digest, SBOM/provenance reference, source commit, 배포 환경, owner가 연결돼 있다.
  • 취약점 case에 CVSS 외에 runtime 존재·도달 가능성·노출·권한·완화 근거가 기록된다.
  • 긴급·높음·보통 등급의 수신부터 triage까지 시간을 측정하며, on-call owner가 비어 있지 않다.
  • not_affected, accepted_risk, fixed는 scanner 결과가 아니라 evidence와 verifier가 있어야 종료된다.
  • 예외에는 compensating control, 승인자, 만료일, 재검토 ticket이 있다.
  • 외부용 SBOM과 내부 release evidence의 접근권한·보존 기간을 구분했다.
  • 적용 법령·계약 의무의 최종 해석과 고객 통지 기준은 법무·보안 담당자와 합의했다.

연습으로 최근 production release 하나를 고르고 “이 image digest의 SBOM은 어디에 있고, 현재 어느 환경에 있으며, 새 critical CVE가 오면 누가 첫 4시간을 맡는가”를 10분 안에 답해 보세요. 세 질문 중 하나라도 여러 시스템을 수동으로 뒤져야 한다면, 다음 sprint의 목표는 새 scanner를 사는 일이 아니라 release evidence card와 owner routing을 자동으로 잇는 일일 가능성이 큽니다.

관련 글