데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약
Zed Attack Proxy (ZAP)는 OWASP가 주관하는 오픈소스 웹 애플리케이션 보안 스캐너입니다. 능동/수동 스캔, 퍼징, API 테스트 등 DAST(동적 분석) 기능을 제공하며, DevOps 파이프라인에 통합하기 쉬워 AI 정보보안 엔지니어와 데이터 엔지니어에게 필수 도구입니다.
스파이더(Spider) + AJAX Spider로 웹 애플리케이션을 크롤링하고, 능동/수동 스캐너로 취약점을 자동 탐지합니다.
로컬 프록시로 트래픽을 가로채어 요청/응답을 분석·변조하며, AI 기반 페이로드 삽입도 가능합니다.
REST API, Java/Groovy 스크립팅, Docker 이미지를 제공하여 지속적 보안 테스트 파이프라인에 통합됩니다.
상용 스캐너(Burp Suite Pro, Acunetix)와 비교했을 때 ZAP은 무료이면서도 높은 확장성을 제공합니다. 특히 AI/데이터 환경에서는 커스텀 스크립트와 API 연계가 중요하므로 ZAP의 오픈소스 생태계가 강점입니다.
| 기능 | ZAP (오픈소스) | Burp Suite Pro | Acunetix |
|---|---|---|---|
| 라이선스 비용 | 무료 | 연 $399+ | 연 $4,500+ |
| 능동 스캔 | ✔️ 기본 제공 | ✔️ 고급 | ✔️ 고급 |
| API 자동화 | ✔️ REST + Python/CLI | ✔️ 제한적 | ✔️ 유료 API |
| AI 페이로드 커스터마이징 | ✔️ Python 스크립팅 | ❌ 번거로움 | ❌ 제한적 |
| CI/CD 연동 | ✔️ Docker, CLI, 플러그인 | ✔️ CLI (Pro) | ✔️ 플러그인 |
ZAP은 크게 프록시 → 스파이더 → 스캐너 → 리포트 흐름으로 동작합니다. 아래 다이어그램은 기본 아키텍처를 보여줍니다.
핵심 용어:
# macOS (Homebrew)
brew install owasp-zap
# Linux (Docker 권장)
docker pull ghcr.io/zaproxy/zaproxy:stable
ZAP을 헤드리스 모드로 실행하고 API 키를 발급받습니다.
# 헤드리스 실행 (포트 8080, API 키 "changeme")
zap.sh -daemon -port 8080 -api -config api.key=changeme
# 또는 Docker
docker run -u zap -p 8080:8080 -p 8090:8090 -i ghcr.io/zaproxy/zaproxy:stable \
zap.sh -daemon -port 8080 -api -config api.key=changeme
Python zapv2 라이브러리를 사용해 대상 사이트를 자동 스캔합니다.
# 설치: pip install python-owasp-zap-v2.4
from zapv2 import ZAPv2
import time
target = "https://example.com" # ⚠️ 실제 사이트는 허가 필요
api_key = "changeme"
# ZAP 클라이언트 생성
zap = ZAPv2(apikey=api_key, proxies={'http':'http://127.0.0.1:8080',
'https':'http://127.0.0.1:8080'})
# 스파이더 시작
print(f"[*] Spidering {target} ...")
scan_id = zap.spider.scan(target)
while int(zap.spider.status(scan_id)) < 100:
time.sleep(2)
print("[+] Spider 완료")
# 능동 스캔 실행
print(f"[*] Active scanning {target} ...")
scan_id = zap.ascan.scan(target)
while int(zap.ascan.status(scan_id)) < 100:
time.sleep(5)
print("[+] Active scan 완료")
# 결과 출력
alerts = zap.core.alerts()
print(f"\n⚠️ 발견된 취약점: {len(alerts)}개")
for alert in alerts[:5]:
print(f" - {alert['alert']} (Risk: {alert['risk']})")
| 설정 항목 | 설명 | 예시 값 |
|---|---|---|
api.key |
REST API 인증 키 | changeme |
proxy.ip |
바인딩 IP (기본 127.0.0.1) | 0.0.0.0 |
spider.maxDepth |
스파이더 탐색 최대 깊이 | 5 |
ascan.maxRuleDurationInMins |
능동 스캔 룰당 최대 시간(분) | 30 |
connection.timeoutInSecs |
HTTP 타임아웃 | 120 |
globalExcludeUrl.regex |
전역 제외 URL 패턴 | .*\\.(gif|png|jpg) |
설정은 ~/.ZAP/config.xml 또는 명령행 -config 옵션으로 적용합니다.
| 문제 | 원인 | 해결책 |
|---|---|---|
| 스파이더가 페이지를 못 찾음 | AJAX 기반 SPA | AJAX Spider 사용 (Selenium/Chrome 필요) |
| 능동 스캔이 너무 느림 | 기본 스레드 수 (5) | ascan.threadPerHost=10 증가 |
| 인증된 세션 미적용 | Context에 인증 정보 미설정 | 녹음(Record) → 세션 식별자 설정 → Context 저장 |
| Docker에서 API 연결 안 됨 | 포트 매핑 또는 ZAP non-daemon | -p 8080:8080 확인, -daemon 플래그 필수 |
Python API timed out |
ZAP이 아직 준비되지 않음 | time.sleep(3) 후 retry, 또는 zap.core.alerts() 폴링 |
zap-cli (Python 래퍼)를 사용하면 CI/CD에서 명령줄 인터페이스로 더 쉽게 자동화할 수 있습니다.