취약점 테스트 자동화 2026, CI 보안 하네스 도입 전 비용·오탐 기준

취약점 테스트 자동화를 검색한 팀은 대개 “어떤 도구가 좋나”보다 더 급한 문제를 안고 있다. 배포는 빨라졌는데 보안 점검은 마지막 수동 승인에 묶여 있고, 정적 분석·의존성 스캔·DAST 결과는 많지만 진짜 막아야 할 항목과 나중에 봐도 되는 항목이 섞여 있다. CI에 스캐너를 하나 더 붙이는 것만으로는 해결되지 않는다. 오히려 pull request마다 수십 개의 경고가 쏟아져 개발자가 보안 알림을 무시하게 되는 역효과가 난다.
Cloudflare의 “Build your own vulnerability harness” 글은 이 문제를 단일 모델이나 단일 스캐너가 아니라 하네스 구조로 본다. 글에서 설명하는 핵심은 모델을 교체 가능한 구성요소로 두고, 상태를 외부화하며, 발견과 검증을 분리하고, 오탐을 줄여 triage 가능한 큐로 만드는 방식이다. 이 관점은 AI 보안 모델을 쓰는 조직에만 해당하지 않는다. CodeQL, ZAP, 의존성 스캐너, 수동 검증을 함께 돌리는 일반 DevSecOps 팀에도 그대로 적용된다.
취약점 테스트 자동화의 목표는 “모든 취약점을 자동으로 찾는다”가 아니다. 더 현실적인 목표는 세 가지다. 첫째, 반복 가능한 테스트를 CI와 staging에 넣어 놓친 회귀를 줄인다. 둘째, 높은 신뢰도의 치명 항목은 배포 전에 멈춘다. 셋째, 낮은 신뢰도의 잡음은 검증 큐로 보내 보안팀 시간을 아낀다. 이 글은 보안 제품 소개가 아니라 기업이 취약점 테스트 자동화를 도입하기 전 비용·오탐·권한·운영 기준을 정하는 실무 가이드다.
- 취약점 테스트 자동화는 스캐너 실행이 아니라 발견, 검증, 중복 제거, release gate, 수정 owner를 묶는 운영 하네스다.
- CI에서 바로 차단할 항목은 “심각도 높음 + 신뢰도 높음 + 재현 가능 + 민감 데이터 영향”처럼 좁게 잡아야 개발 흐름이 망가지지 않는다.
- OWASP WSTG·ASVS, NIST SSDF, GitHub Code scanning, ZAP Automation Framework는 자동화 기준을 문서와 파이프라인으로 연결할 때 쓸 수 있는 공식 근거다.
- 도입 초기는 전체 저장소보다 결제, 인증, 관리자, 파일 업로드, API gateway처럼 실패 비용이 큰 경로부터 작게 시작하는 편이 낫다.
이 글이 필요한 사람
- SAST, DAST, 의존성 스캔을 이미 쓰지만 경고가 많아 release gate로 쓰지 못하는 보안팀
- 취약점 테스트 자동화를 CI에 넣으려는데 빌드 시간과 개발자 반발이 걱정되는 DevOps 리드
- CodeQL, ZAP, 상용 스캐너, AI 보안 분석 결과를 한 큐로 합쳐야 하는 AppSec 담당자
- OWASP WSTG·ASVS 기준을 실제 테스트 케이스와 승인 조건으로 바꾸려는 개발 조직
- 보안 테스트 비용, false positive, 예외 승인, 수정 SLA를 구매·운영 관점에서 보고 싶은 CTO·보안 책임자
도구 목록보다 먼저 정할 것: 하네스의 책임 범위
취약점 테스트 자동화를 실패시키는 흔한 출발점은 “좋은 스캐너 하나 고르기”다. 스캐너는 필요하다. 하지만 스캐너는 finding을 만든다. 기업이 필요한 것은 finding이 아니라 “배포를 막을지, 누가 고칠지, 언제 예외를 줄지, 어떤 증거로 닫을지”에 대한 운영 판단이다. Cloudflare 글에서 말하는 vulnerability harness는 바로 이 틈을 메운다. 여러 분석을 돌리고, 상태를 저장하고, 서로 다른 검증자를 통과시켜, 사람이 처리할 수 있는 큐로 줄이는 구조다.
OWASP Web Security Testing Guide는 웹 애플리케이션과 웹 서비스 보안 테스트를 위한 종합 가이드다. ASVS는 기술 보안 통제를 검증하는 기준이자 개발 요구사항, 구매 조건으로도 쓰이는 표준이다. NIST SSDF는 소프트웨어 취약점을 줄이고 영향을 완화하기 위한 보안 개발 프레임워크를 제시한다. 이 세 가지를 합치면 자동화의 범위가 선명해진다. 자동화는 “툴 돌리기”가 아니라 요구사항, 테스트 케이스, 증거, 수정 흐름을 SDLC에 붙이는 작업이다.
따라서 첫 회의에서 정해야 할 질문은 이렇다. 어떤 저장소를 볼 것인가. 어떤 취약점 유형을 자동으로 판단할 것인가. 어떤 결과가 나오면 CI를 멈출 것인가. 어떤 결과는 보안팀 triage로 보낼 것인가. 스캔 결과와 예외 승인은 어디에 남길 것인가. 이 질문에 답하지 않은 상태에서 유료 도구나 AI 분석을 붙이면 비용만 먼저 늘어난다.
취약점 테스트 자동화 도입 판단표
| 상황 | CI 차단에 적합한 방식 | 보류하거나 별도 큐로 둘 항목 | 운영 지표 |
|---|---|---|---|
| 인증·결제·관리자 기능처럼 실패 비용이 큰 서비스 | CodeQL/SAST high confidence, 의존성 critical, staging DAST 재현 항목은 release blocker로 둔다. | 낮은 신뢰도의 header·best practice 경고는 주간 triage로 보낸다. | blocker 수, 평균 수정일, 재오픈율, 예외 승인 수 |
| 마이크로서비스가 많고 배포가 잦은 조직 | PR 단위 빠른 SAST와 dependency diff를 우선하고, 전체 DAST는 nightly나 release candidate에서 돌린다. | 모든 repo를 매 PR마다 full scan하는 방식은 비용과 대기시간이 커서 피한다. | CI 추가 시간, 스캔 실패율, repo별 위험 밀도 |
| 보안팀 인력이 적은 스타트업 | OWASP ASVS 핵심 요구사항을 체크리스트로 줄이고 결제·로그인·파일 업로드부터 자동화한다. | cross-repo 추적, 전용 dedupe 에이전트, 대형 데이터베이스는 초기에 과하다. | 주간 triage 처리량, 중복 finding 비율, false positive 예산 |
| AI 기반 취약점 분석을 시험하는 팀 | 발견 모델과 검증 모델 또는 사람 검토를 분리하고, 증거 없는 결과는 release blocker로 쓰지 않는다. | 한 모델의 추론만으로 critical 판단을 확정하지 않는다. | 재현 성공률, 검증자 반려율, 모델별 비용 |
| 규제·고객 감사가 있는 B2B SaaS | 테스트 범위, 증거 파일, 예외 승인자, 수정 SLA를 감사 가능한 형태로 남긴다. | 개인 노트나 채팅 승인만으로 예외 처리하지 않는다. | 감사 증적 누락률, SLA 위반 건수, 예외 만료율 |
이 표에서 핵심은 모든 취약점을 같은 방식으로 다루지 않는다는 점이다. 취약점 테스트 자동화는 강한 차단 기준과 느슨한 관찰 기준을 함께 가져야 한다. 보안팀이 모든 medium finding을 막으면 개발팀은 우회로를 찾는다. 반대로 critical도 watch list로 보내면 자동화의 의미가 없다. release gate는 좁고 명확해야 한다.
실전 구조: Recon, Scan, Validate, Triage, Fix
가장 작은 하네스는 다섯 단계면 충분하다. Recon은 애플리케이션 구조, 인증 흐름, 외부 노출, 데이터 흐름을 기록한다. Scan은 CodeQL 같은 정적 분석, 의존성 스캔, ZAP 같은 동적 분석, 필요한 경우 AI 보안 분석을 돌린다. Validate는 finding을 재현하거나 반증한다. Triage는 중복과 예외를 정리하고 release blocker를 고른다. Fix는 owner, SLA, rollback, 재검증을 닫는다.
GitHub code scanning 문서는 코드에서 보안 취약점과 오류를 찾고, 결과를 repository alert로 보여주며, push 같은 이벤트나 일정에 맞춰 실행할 수 있다고 설명한다. CodeQL CLI는 데이터베이스를 만들고 쿼리를 실행해 SARIF 결과를 만들 수 있다. ZAP Automation Framework는 YAML 하나로 환경, 인증, spider, passive scan, active scan, report, exit status 같은 작업을 제어한다. 이 도구들은 서로 경쟁 관계로만 볼 필요가 없다. 하네스 안에서는 각자 다른 증거를 만드는 부품이다.
처음부터 Cloudflare처럼 fleet-wide dependency tracing까지 갈 필요는 없다. Cloudflare 글도 최소 하네스로 Recon, Hunt, Validate를 데이터베이스에 보관하고 별도 Validator를 두는 접근을 말한다. 일반 기업은 이를 더 단순화해도 된다. “PR 빠른 검사 + nightly 깊은 검사 + release candidate DAST + 주간 보안 triage” 정도면 첫 단계로 충분하다. 중요한 것은 결과가 한 번 실행 로그로 사라지지 않고, 누가 왜 닫았는지 남는 구조다.
CI에 넣는 순서: 빠른 검사와 깊은 검사를 분리한다
- 범위를 자른다. 전사 전체가 아니라 결제, 인증, 관리자, 파일 업로드, 공개 API처럼 실패 비용이 큰 경로를 먼저 고른다.
- 요구사항을 매핑한다. OWASP ASVS 요구사항과 WSTG 테스트 시나리오 중 현재 서비스에 맞는 항목만 추린다. 버전 식별자와 내부 테스트 케이스 ID를 함께 둔다.
- PR 빠른 검사를 만든다. CodeQL 또는 기존 SAST, dependency diff, secret scan처럼 짧고 재현성 높은 검사를 PR에 붙인다. 목표는 개발자가 기다릴 수 있는 시간 안에 실패시키는 것이다.
- staging 깊은 검사를 만든다. ZAP Automation Framework나 상용 DAST는 staging에서 인증과 test account를 분리한 뒤 돌린다. production active scan은 기본 금지로 둔다.
- 차단 기준을 좁힌다. critical/high, high confidence, 재현 가능, 민감 데이터 영향이 있는 항목만 release blocker로 둔다. 나머지는 triage queue로 보낸다.
- 예외 승인에 만료일을 둔다. 고객 영향이 낮아 예외를 주더라도 owner, 이유, 만료일, 보완 통제를 남긴다. 만료 없는 예외는 기술부채가 된다.
- 매주 오탐 예산을 본다. false positive가 일정 수를 넘으면 도구를 더 사기보다 rule, scan policy, 인증 설정, 테스트 데이터부터 고친다.
이 순서의 장점은 비용이 통제된다는 점이다. PR마다 모든 동적 테스트를 돌리면 CI minutes와 대기시간이 늘어난다. 반대로 nightly에만 몰아두면 배포 직전 발견이 많아진다. 취약점 테스트 자동화는 빠른 신호와 깊은 신호를 분리하고, 둘을 같은 triage 큐에서 만나는 구조로 설계해야 한다.
시나리오 1: DAST를 CI에 붙였더니 개발자가 끄자고 하는 경우
시나리오 A. B2B SaaS 팀이 ZAP 기반 DAST를 staging 배포 뒤 자동 실행했다. 첫 주에는 결과가 많아 보안팀이 좋아했다. 둘째 주부터 문제가 생겼다. 인증 세션이 자주 끊겨 false positive가 늘었고, active scan이 오래 걸려 release candidate 대기시간이 길어졌다. 개발팀은 “보안 도구 때문에 배포가 밀린다”고 말하기 시작했다.
이 경우 DAST를 버리는 것이 아니라 job을 쪼개야 한다. passive scan과 API spec import는 매 배포 후 빠르게 돌리고, active scan은 승인된 경로만 nightly 또는 주 1회 깊게 돌린다. 인증 실패로 생긴 finding은 취약점이 아니라 테스트 환경 문제로 분류한다. report job은 JSON과 HTML을 모두 남기고, exitStatus는 high 이상만 CI 실패로 둔다. 그러면 개발자는 “모든 경고가 내 배포를 막는다”는 느낌을 덜 받는다.
보안팀은 이때 좋은 지표와 나쁜 지표를 구분해야 한다. finding 수가 많아진 것은 성공이 아닐 수 있다. 재현된 high 이상 finding, 중복 제거 후 남은 항목, 평균 수정일, 예외 만료율이 더 중요하다. 취약점 테스트 자동화가 개발 속도를 계속 갉아먹으면 결국 꺼진다. 그래서 차단 기준은 더 엄격하게, 관찰 큐는 더 넓게 가져가는 편이 낫다.
시나리오 2: AI 보안 분석을 붙이고 싶은데 신뢰가 부족한 경우
시나리오 B. 한 플랫폼 팀이 AI 보안 분석을 기존 SAST 뒤에 붙이고 싶어 한다. AI가 business logic 취약점을 더 잘 찾을 수 있다는 기대가 있지만, 결과가 설명만 그럴듯하고 재현이 안 되면 개발자 신뢰를 잃는다. Cloudflare 글이 강조하는 것처럼 모델 하나가 본 결과를 그대로 믿기보다, 발견과 검증을 분리해야 한다.
운영 기준은 단순하다. AI 분석은 후보를 만들 수 있다. release blocker가 되려면 별도 validator가 코드를 다시 보고, 재현 경로나 테스트 케이스를 남기고, line number와 함수명이 실제 저장소 상태와 맞아야 한다. 모델을 바꿔 교차 검증하거나 사람이 승인하는 절차도 필요하다. 특히 고객 데이터, 인증 우회, 권한 상승처럼 영향이 큰 finding은 “그럴듯함”이 아니라 증거가 있어야 한다.
이 조건이면 AI 분석은 보안팀 생산성을 높일 수 있다. 그러나 모든 결과를 자동 차단으로 연결하면 위험하다. 비용도 봐야 한다. 대형 모델을 모든 PR 전체 diff에 붙이면 토큰 비용과 지연이 커진다. 민감 코드가 외부 모델로 나가는 조건도 계약과 보안 정책으로 확인해야 한다. AI 기반 취약점 테스트 자동화는 탐지 범위를 넓히는 보조 엔진이지, 승인 책임자를 대체하는 장치가 아니다.
비용·보안·운영 리스크를 숫자로 본다
비용 리스크는 라이선스 가격만이 아니다. GitHub code scanning은 GitHub Actions minutes를 쓸 수 있고, private repository나 조직 라이선스 조건도 봐야 한다. 상용 스캐너는 좌석, repository 수, LOC, 스캔 횟수, API 호출, report 보존 비용이 붙을 수 있다. AI 분석은 토큰과 실행 시간이 비용이 된다. 그래서 도입 전 “PR당 추가 시간”, “월간 full scan 횟수”, “triage 인력 시간”, “오탐 처리 비용”을 같이 계산해야 한다.
보안 리스크는 테스트 도구 자체에서 나온다. DAST가 인증 토큰을 다루면 test account와 권한 범위를 제한해야 한다. active scan은 production에 직접 돌리면 장애나 데이터 오염을 만들 수 있다. SAST와 AI 분석은 소스코드와 비밀값 노출 경로를 확인해야 한다. 결과 리포트에는 취약한 endpoint, payload, 내부 경로가 들어갈 수 있으므로 저장소 권한과 보존 기간을 정해야 한다.
운영 리스크는 owner 부재다. finding이 생겼는데 담당 서비스 owner가 없으면 보안팀 backlog에 쌓인다. 예외 승인을 누가 했는지, 언제 만료되는지, 어떤 보완 통제가 있는지 모르면 감사 때 설명할 수 없다. 취약점 테스트 자동화는 취약점을 많이 찾는 프로젝트가 아니라 “찾은 항목을 닫는 프로젝트”로 관리해야 한다. 닫히지 않는 자동화는 알림 소음이다.
정책 스켈레톤: release gate와 예외 기준을 먼저 문서화한다
아래 YAML은 실제 제품 설정이 아니라 정책 스켈레톤이다. 목적은 도구를 사기 전에 조직이 어떤 결과를 차단하고, 어떤 결과를 관찰하고, 어떤 결과를 예외로 둘지 합의하는 것이다. 취약점 테스트 자동화 프로젝트에서 이 문서가 없으면 모든 finding이 회의 안건이 된다.
# vulnerability-harness-policy.yaml
# 목적: 취약점 테스트 자동화를 CI에 넣을 때 차단 기준, 오탐 검증, 책임자를 분리한다.
# 실제 적용 전 조직의 언어, 배포 방식, 보안 승인 절차에 맞춰 조정한다.
version: 1
owner: application-security
review_cycle: monthly
scope:
repositories:
- payment-api
- admin-portal
- customer-web
environments:
ci: allowed
staging: allowed_with_test_accounts
production: passive_only
stages:
recon:
required_artifacts:
- architecture_note
- dependency_map
- exposed_endpoint_inventory
scan:
tools:
- codeql_or_sast
- zap_or_dast
- dependency_scanner
output_format:
- sarif
- json_report
validate:
independent_reviewer: required
duplicate_check: required
exploit_against_production: forbidden
triage:
block_release_when:
- severity: critical
confidence: high
- auth_bypass: suspected_and_reproduced
- data_exposure: customer_or_secret
warn_only_when:
- severity: medium
confidence: low
- missing_security_header_without_sensitive_flow
fix:
owner_team_required: true
rollback_plan_required: true
sla_days:
critical: 2
high: 7
medium: 30
cost_controls:
max_ci_minutes_per_pr: 25
full_scan_schedule: nightly
active_dast_schedule: weekly_or_release_candidate
false_positive_budget_per_week: 10
이 정책은 매달 바꿔도 된다. 처음부터 완벽할 필요는 없다. 중요한 것은 critical/high confidence 항목만 막는다는 원칙, production active scan 금지, 예외 만료일, false positive 예산처럼 개발팀과 보안팀이 같은 기준을 보게 만드는 것이다.
점검 스크립트 예시: 여러 도구 결과를 하나의 판단으로 모은다
다음 Python은 SARIF나 ZAP 결과를 실제로 파싱하는 완성 코드가 아니다. 취약점 테스트 자동화 하네스가 어떤 판단을 해야 하는지 보여주는 예시다. 도구별 결과를 severity, confidence, owner, reproduced로 정규화한 뒤 release blocker와 watch list로 나눈다.
#!/usr/bin/env python3
# security_gate_triage.py
# 목적: 여러 도구의 결과를 하나의 release gate 판단으로 모으는 예시다.
# 실제 운영에서는 SARIF, ZAP JSON, dependency scanner 결과를 파싱하고 예외 승인 DB를 연결한다.
findings = [
{"tool": "codeql", "id": "py/path-injection", "severity": "high", "confidence": "high", "owner": "platform", "reproduced": True},
{"tool": "zap", "id": "missing-header", "severity": "medium", "confidence": "low", "owner": "web", "reproduced": False},
{"tool": "deps", "id": "cve-queue-001", "severity": "critical", "confidence": "high", "owner": "payment", "reproduced": True},
]
approved_exceptions = {"missing-header"}
release_blockers = []
watch_list = []
for item in findings:
if item["id"] in approved_exceptions:
watch_list.append((item["id"], "approved_exception"))
continue
if item["severity"] in {"critical", "high"} and item["confidence"] == "high" and item["reproduced"]:
release_blockers.append(item)
else:
watch_list.append((item["id"], "needs_triage"))
if release_blockers:
print("BLOCK_RELEASE")
for item in release_blockers:
print(item["owner"], item["tool"], item["id"], item["severity"])
else:
print("ALLOW_WITH_WATCH", watch_list)
실제 운영에서는 이 로직 앞단에 SARIF parser, ZAP JSON parser, dependency scanner parser를 붙이고, 뒤쪽에는 Jira, GitHub issue, Slack 알림, 예외 승인 DB를 연결한다. 그래도 핵심 로직은 단순해야 한다. “심각도 높음, 신뢰도 높음, 재현됨, owner 있음”은 차단한다. 나머지는 관찰하되 만료일 없는 예외로 묻어두지 않는다.
ZAP 자동화는 staging 전용으로 시작한다
ZAP Automation Framework는 YAML 하나로 여러 job을 제어할 수 있다. 공식 문서는 environment, authentication, job tests, activeScan, passiveScan, openapi, report, exitStatus 같은 job을 설명한다. 자동화 초기에 이 구조를 쓰면 “누가 로컬에서 한 번 돌렸다”가 아니라 CI에서 같은 plan을 재현할 수 있다.
# zap-automation-plan-example.yaml
# 예시는 구조 설명용이다. 실제 대상 URL, 인증, scan policy는 공식 ZAP 문서와 사내 승인 기준에 맞춘다.
env:
contexts:
- name: staging-app
urls:
- https://staging.example.invalid
authentication:
method: manual
jobs:
- type: openapi
name: import-api-spec
parameters:
apiFile: ./openapi.yaml
- type: passiveScan-config
name: passive-policy
- type: spider
name: crawl-staging
parameters:
context: staging-app
- type: passiveScan-wait
name: wait-passive
- type: activeScan
name: active-check-approved-paths
parameters:
context: staging-app
- type: report
name: export-json
parameters:
template: traditional-json
reportDir: ./security-reports
- type: exitStatus
name: ci-exit
parameters:
errorLevel: High
warnLevel: Medium
다만 active scan은 조심해야 한다. production에서 무심코 돌리면 장애, 데이터 변경, 계정 잠금 같은 문제가 생길 수 있다. 처음에는 staging, test account, 제한된 경로, 낮은 동시성으로 시작한다. 보안팀이 원하는 것은 가장 공격적인 스캔이 아니라 반복 가능한 증거다.
구매 전에 물어볼 체크리스트
| 영역 | 질문 | 좋은 신호 | 나쁜 신호 |
|---|---|---|---|
| 비용 | repository, seat, LOC, scan 횟수, CI minutes, report 보존 비용이 분리되어 보이는가. | 월간 사용량 export와 팀별 owner 비용 추적이 있다. | 견적은 싸지만 full scan 비용과 인력 triage 시간이 빠져 있다. |
| 보안 | 소스코드, 비밀값, 스캔 결과, 인증 토큰이 어디에 저장되는가. | 권한 분리, audit log, retention, test credential 관리가 문서화되어 있다. | admin 권한 하나로 모든 repo와 report를 본다. |
| 운영 | false positive를 줄이는 rule tuning, baseline, 예외 만료가 가능한가. | 예외 승인자와 만료일, dedupe, owner mapping이 있다. | 경고를 닫는 흐름 없이 알림만 보낸다. |
| 통합 | SARIF, API, webhook, GitHub/GitLab/Jira 연동이 가능한가. | 도구 결과를 중앙 큐로 모으고 기존 이슈 관리와 연결한다. | UI에서만 보고서를 볼 수 있어 자동화가 끊긴다. |
| 근거 | OWASP WSTG·ASVS, NIST SSDF 같은 기준과 내부 테스트 케이스를 연결할 수 있는가. | 요구사항 ID, 테스트 증거, 수정 이력을 감사 자료로 남긴다. | 스캐너 점수만 있고 어떤 요구사항을 만족했는지 설명하지 못한다. |
이 체크리스트는 상용 도구를 쓰지 말자는 뜻이 아니다. 좋은 도구는 시간을 줄인다. 다만 구매 전에 하네스의 책임 범위와 release gate 기준이 없으면 어떤 도구를 사도 결과가 흩어진다. 계약 전에 POC를 할 때는 탐지 개수보다 오탐률, triage 시간, CI 추가 시간, 보안 증적 품질을 반드시 재야 한다.
30일 실행 계획
- 1주차: 최근 3개월 배포 장애, 보안 이슈, 고객 감사 질문을 모아 실패 비용이 큰 경로 3개를 고른다. 인증, 결제, 관리자, 공개 API가 보통 우선이다.
- 2주차: 각 경로에 OWASP ASVS 요구사항과 WSTG 테스트 시나리오를 매핑한다. 이미 있는 CodeQL, dependency scanner, secret scan 결과도 같은 표에 붙인다.
- 3주차: PR 빠른 검사와 staging 깊은 검사를 분리한다. release blocker는 critical/high confidence 재현 항목으로 제한하고, 나머지는 triage queue로 보낸다.
- 4주차: false positive 예산, 예외 만료일, owner SLA, 월간 리포트를 만든다. 한 달 동안 차단된 배포 수보다 “정말 막아야 했던 항목이었는지”를 회고한다.
30일 뒤 성공 기준은 스캔 횟수가 아니다. 취약점 테스트 자동화가 성공했다면 보안팀은 “어떤 finding이 왜 막혔는지”를 설명할 수 있고, 개발팀은 “무엇을 고치면 통과하는지”를 알고, 경영진은 “월 비용과 위험 감소가 어느 정도인지”를 볼 수 있어야 한다. 그 상태가 되면 다음 단계로 cross-repo dependency, AI 기반 후보 생성, 전사 dashboard를 붙여도 늦지 않다.
함께 보면 좋은 글
자주 묻는 질문
취약점 테스트 자동화는 SAST만 켜면 충분한가요?
아니다. SAST는 중요한 한 축이지만 의존성, secret, DAST, API 테스트, 수동 검증이 필요한 영역이 따로 있다. 더 중요한 것은 결과를 release blocker, watch list, 예외 승인으로 나누는 하네스다.
CI에서 모든 취약점 경고를 막아도 되나요?
초기에는 피하는 편이 낫다. high confidence, 재현 가능, 민감 데이터나 인증 우회 영향이 있는 항목부터 차단해야 한다. 낮은 신뢰도의 경고를 모두 막으면 개발팀이 자동화를 우회하려 한다.
ZAP 같은 DAST는 production에 돌려도 되나요?
기본값은 staging 전용이다. production active scan은 장애나 데이터 변경 위험이 있으므로 별도 승인, 제한된 범위, passive 중심 정책이 필요하다. test account와 scan policy를 분리해야 한다.
AI 보안 분석 결과를 자동으로 release blocker로 써도 되나요?
단독으로 쓰기는 위험하다. AI 분석은 후보 생성에 좋지만, release blocker가 되려면 독립 검증, 재현 증거, 코드 위치 확인, owner 지정이 필요하다. 모델 추론만으로 치명 취약점 확정을 내리면 신뢰가 깨진다.
취약점 테스트 자동화 도입 비용은 무엇으로 계산해야 하나요?
도구 라이선스, CI minutes, 스캔 서버, report 보존, triage 인력 시간, false positive 처리 비용을 함께 계산해야 한다. 월 견적보다 PR당 추가 시간과 주간 triage 처리량이 실제 운영비를 더 잘 보여준다.
OWASP WSTG와 ASVS는 자동화에 어떻게 연결하나요?
ASVS 요구사항을 내부 보안 요구사항으로 두고, WSTG 시나리오를 테스트 케이스와 증거 링크로 연결하면 된다. 모든 항목을 한 번에 자동화하지 말고 실패 비용이 큰 경로부터 버전과 ID를 남긴다.
출처와 확인일
- Cloudflare Blog — Build your own vulnerability harness (확인일: 2026-06-25)
- OWASP — Web Security Testing Guide (확인일: 2026-06-25)
- OWASP — Application Security Verification Standard (확인일: 2026-06-25)
- NIST — SP 800-218 Secure Software Development Framework (확인일: 2026-06-25)
- GitHub Docs — Code scanning (확인일: 2026-06-25)
- GitHub Docs — CodeQL CLI (확인일: 2026-06-25)
- ZAP — Automation Framework (확인일: 2026-06-25)
이 글은 공개 기술 문서와 공식 가이드를 바탕으로 작성한 일반 정보다. 보안 테스트, 취약점 판단, 계약 조건, 생산 환경 스캔 정책은 조직의 서비스 구조와 법무·보안 검토에 따라 달라질 수 있다. 실제 도입 전에는 각 도구 공식 문서, 내부 보안 정책, 전문가 검토를 기준으로 최종 결정해야 한다.





댓글
댓글 쓰기