WAF에서 오탐 감소: OWASP 규칙과 AI 컨텍스트 결합
Source: Dev.to

문제
모든 API 요청이 동일한 무게를 갖는 것은 아니다.
- 제품 카탈로그 서비스는 초당 수만 건의 요청을 처리하며 100 ms 지연을 허용할 수 없습니다.
- 고감도 관리자 패널은 ≈10 요청 / 초를 처리하며 해당 지연을 허용할 수 있습니다.
대부분의 웹 애플리케이션 방화벽(WAF) – ModSecurity, Cloudflare, Fastly – 은 전체 애플리케이션에 단일 기본 규칙 세트를 적용합니다. 사용자 정의 규칙을 지원하지만, 많은 수동 설정 없이 경로별 보안 프로파일을 제공하지 않습니다.
속도 vs. 정확도
- 규칙 기반 WAF는 마이크로초 단위로 SQL‑i/XSS 공격을 탐지하지만, 컨텍스트가 부족해 많은 오탐을 발생시킵니다.
- LLM 기반 보안은 컨텍스트를 이해하지만 각 요청에 용납할 수 없는 지연을 추가합니다.
솔루션: 결정론적 패턴 매칭과 확률적 AI를 결합한 하이브리드 접근 방식.
Argus – 하이브리드 오픈‑소스 WAF (Go)
Argus는 다음을 결합합니다:
- Coraza (OWASP‑호환 규칙 엔진) – 빠른 패턴 매칭을 제공.
- Gemini LLM – 상황에 맞는 분석을 수행.
세 가지 위험 프로파일을 제공하여 개발자가 라우트별로 지연 시간과 컨텍스트 사이의 적절한 균형을 선택할 수 있습니다.
핵심 과제
- 속도와 컨텍스트 인식을 어떻게 병합하면서 이진 선택을 강요하지 않을까?
- 외부 의존성이 실패할 때 WAF는 어떻게 성능 저하가 발생할까?
- 프로덕션에서 채택을 어떻게 손쉽게 만들 수 있을까?
속도와 컨텍스트 결합
결정론적 정규식 기반 규칙은 대부분의 공격을 포착합니다. AI 컨텍스트를 추가하면 정상적인 요청이 의심스러워 보이는 경우(예: DELETE TABLE을 언급하는 튜토리얼)에도 오탐을 제거할 수 있습니다.
각 엔드포인트마다 지연 시간과 보안 예산이 다르기 때문에 Argus는 전역 설정 대신 개발자가 경로별로 모드를 선택하도록 합니다.
솔루션: 세 가지 모드
| Mode | Behaviour |
|---|---|
| Latency First | Coraza가 allow / block을 결정합니다; AI가 관여하지 않습니다. |
| Paranoid | 모든 요청이 Coraza의 검사 후에 Gemini에 의해 검증됩니다. |
| Smart Shield | Coraza가 요청을 차단할 때만 Gemini가 실행되어 오탐을 제거합니다. |
각 요청에 대한 Gemini 판정은 나중에 관리자가 분석할 수 있도록 데이터베이스에 기록됩니다.

복원력: AI가 실패하면 어떻게 될까?
Argus는 Smart Shield와 Paranoid 모드에 Gemini API를 사용합니다. Google 서비스에 장애가 발생하면:
- OWASP 규칙은 여전히 명백한 위협을 차단합니다 (SQLi, XSS 등).
- AI 레이어는 단순히 사라지지만, 핵심 보호는 유지됩니다.
회로 차단기
3‑상태 회로 차단기는 점진적인 서비스 저하를 보장합니다:
| 상태 | 조건 | 동작 |
|---|---|---|
| Closed (정상) | Gemini 응답 중 | 선택된 모드로 요청이 흐릅니다. |
| Open | 연속 3회 Gemini 실패 | 30 초 동안 열려 있음; 모든 모드가 Coraza만 사용하도록 전환됩니다. |
| Half‑Open | 30 초 타임아웃 후 | Gemini에 단일 테스트 요청을 보냅니다. • 성공 → Closed • 실패 → 또 다른 30 초 동안 Open |

프로덕션에서 바로 적용하기
Argus는 내부 복잡성을 두 가지 간단한 통합 경로 뒤에 숨깁니다.
1. Go SDK
네이티브 Go 애플리케이션의 경우, Argus는 http.Handler를 감싸는 미들웨어입니다.
package main
import (
"net/http"
"time"
"github.com/priyansh-dimri/argus"
)
func main() {
waf, _ := argus.NewWAF()
client := argus.NewClient(
"https://argus-5qai.onrender.com",
"api-key",
20*time.Second,
)
cfg := argus.Config{
Mode: argus.SmartShield, // or argus.LatencyFirst / argus.Paranoid
}
shield := argus.NewMiddleware(client, waf, cfg)
http.Handle("/api/", shield.Protect(yourHandler))
http.ListenAndServe(":8080", nil)
}
2. Docker 사이드카
Node, Python, Ruby, PHP 등으로 작성된 서비스의 경우, Argus를 가벼운 사이드카 리버스 프록시로 실행하면 됩니다. 코드 변경이 전혀 필요하지 않습니다.
docker run -d \
--name argus-sidecar \
-p 8000:8000 \
-e TARGET_URL=http://host.docker.internal:3000 \
-e ARGUS_API_KEY=api-key \
-e ARGUS_API_URL=https://argus-5qai.onrender.com/ \
ghcr.io/priyansh-dimri/argus-sidecar:latest
모든 트래픽은 애플리케이션에 도달하기 전에 사이드카를 통해 라우팅됩니다.
Source: …
핫 경로 최적화
미들웨어가 모든 요청의 핵심 경로에 위치하기 때문에 성능이 가장 중요합니다. Argus:
- 적절한 경우 최근 Gemini 응답을 캐시합니다.
- Coraza 경로에서 할당을 최소화합니다.
- 잠금 없는 원자 연산으로 서킷‑브레이커 로직을 실행합니다.
이러한 최적화 덕분에 추가 지연 시간이 지연에 민감한 서비스의 허용 범위 내에 충분히 머무르면서도 LLM의 상황별 안전망을 제공할 수 있습니다.
즐거운 해킹 되세요!
During development we focused on optimizing the hot path, achieving:
- **262 µs** processing time for clean requests.
- **151 ns** overhead for the circuit breaker (atomic state checks instead of mutexes).
- **56 %** parallel efficiency when scaling up to 4 cores.
You can check out the source code and contribute at
[github.com/priyansh-dimri/argus/](https://github.com/priyansh-dimri/argus/).