동적 분석(Dynamic Analysis)은 프로그램을 실제 실행하면서 동작을 관찰하여 버그, 보안 취약점, 성능 문제를 발견하는 기법이다. DAST(Dynamic Application Security Testing)와 런타임 프로파일링을 포함한다.
정적 vs 동적 분석 비교
| 항목 | 정적 분석 | 동적 분석 |
|---|
| 실행 필요 | X | O |
| 발견 시점 | 개발 중 | 런타임 |
| 오탐(False Positive) | 많음 | 적음 |
| 커버리지 | 전체 코드 | 실행 경로만 |
| 취약점 유형 | 코드 패턴 | 실제 런타임 동작 |
| 도구 | ESLint, SAST | DAST, Profiler |
DAST (동적 보안 테스팅)
OWASP ZAP 스캔 모드:
1. Passive Scan: 트래픽 관찰 (비침투)
2. Active Scan: 취약점 자동 공격 시도
- SQL 인젝션
- XSS (Cross-Site Scripting)
- CSRF
- 인증 우회
- 디렉토리 탐색
ZAP CLI:
docker run -t owasp/zap2docker-stable zap-baseline.py -t https://example.com -r report.html
Node.js 프로파일링
bash
# CPU 프로파일링
node --prof app.js
node --prof-process isolate-*.log > profile.txt
# 메모리 프로파일링
node --inspect app.js
# Chrome DevTools → Memory 탭
# clinic.js (추천)
npm install -g clinic
clinic doctor -- node app.js # 자동 진단
clinic flame -- node app.js # Flame Graph
clinic bubbleprof -- node app.js # async 병목
Flame Graph 해석
세로축: 콜 스택 깊이
가로축: CPU 시간 비율
넓고 평평한 블록 → CPU 병목 (최적화 대상)
좁고 깊은 탑 → 재귀 깊이 문제
샘플링 기반:
V8 → perf → FlameGraph (Brendan Gregg 도구)
async_hooks로 비동기 추적
메모리 누수 탐지
typescript
// Node.js 힙 스냅샷 비교
const v8 = require('v8');
const fs = require('fs');
// 스냅샷 1
const snap1 = v8.writeHeapSnapshot();
// ... 작업 수행 ...
global.gc?.();
// 스냅샷 2
const snap2 = v8.writeHeapSnapshot();
// Chrome DevTools → Memory → Load snapshot → Comparison
// 증가한 객체 유형 확인
관련 문서
- •[static-analysis|[정적 분석]]
- •[[fuzzing|퍼징]]
- •[[symbolic-execution|심볼릭 실행]]