API DDoS 대응 (공격 구조, 방어 전략, 자동 대응)
서비스가 갑자기 응답을 멈추면 제일 먼저 드는 생각이 뭔가요? 처음엔 배포 실수를 의심했습니다. 그런데 로그를 열어보니 특정 API 하나로 요청이 폭발적으로 쏟아지고 있었고, 그제야 DDoS 공격이라는 걸 직감했습니다. API 기반 서비스를 운영하다 보면 이 상황을 한 번쯤은 맞닥뜨리게 됩니다. 이 글은 그 경험을 바탕으로 공격 구조부터 자동 대응까지 실제 운영 관점에서 정리한 내용입니다.
공격 구조, 왜 API는 특히 더 위험한가
DDoS(Distributed Denial of Service)란 여러 곳에 분산된 시스템이 동시에 하나의 서버를 향해 요청을 쏟아내어 자원을 고갈시키는 공격입니다. 단순하게 설명하면, 가게 문 앞에 수천 명이 동시에 몰려들어 정작 진짜 손님이 들어오지 못하게 막는 상황과 같습니다.
과거에는 대역폭을 포화시키는 네트워크 계층 공격이 주류였습니다. 그런데 요즘 API 서비스에서 더 골치 아픈 건 Layer 7 공격입니다. Layer 7 공격이란 HTTP 요청처럼 겉으로는 정상적으로 보이는 트래픽을 반복 발생시켜 서버 내부 자원을 갉아먹는 방식입니다. 네트워크 장비가 이걸 "정상 요청"으로 인식하기 때문에 초기 탐지가 어렵습니다.
API가 특히 취약한 이유가 있습니다. 요청 구조가 단순하고 자동화하기 쉽기 때문입니다. 검색 API 하나를 1초에 500번 호출하는 스크립트를 짜는 건 공격자 입장에서 그리 어렵지 않습니다. 제 경우에도 공격 대상은 인증 API였는데, 이게 마비되자 로그인이 필요한 모든 기능이 연쇄적으로 먹통이 됐습니다. 인프라 전체가 살아있어도 실질적으로 서비스 전체가 죽은 것과 마찬가지였습니다.
더 무서운 건 "느린 DDoS"입니다. 공격자가 요청 속도를 임계값 바로 아래로 맞추면서 장시간 지속적으로 자원을 소비시키는 방식인데, 모니터링 알람이 잘 안 터지고 사람이 눈으로 보기 전까지는 공격인지 트래픽 증가인지 구별이 쉽지 않습니다. Cloudflare의 DDoS 분석 자료에 따르면 실제로 최근 몇 년간 Layer 7 기반의 정교한 API 공격 비중이 꾸준히 늘고 있습니다. 단순 트래픽 급증으로 오인하고 30분 이상을 허비했던 기억이 납니다.
방어 전략, 무엇부터 챙겨야 하는가
방어 체계를 설계할 때 가장 먼저 해야 할 게 뭐라고 생각하시나요? "WAF를 붙이면 되지 않나"라고 단순하게 생각했는데, 실제로 단일 기술 하나로 커버되는 공격은 생각보다 적었습니다.
현실적인 방어 체계는 여러 계층이 함께 작동해야 합니다. 핵심적인 구성 요소를 정리하면 다음과 같습니다.
- Rate Limiting: 특정 IP나 사용자 기준으로 단위 시간당 요청 수를 제한하는 기술입니다. 비정상적으로 빠른 요청 반복을 차단하는 첫 번째 방어선 역할을 합니다.
- WAF(Web Application Firewall): 알려진 공격 패턴을 필터링하고 비정상적인 요청 구조를 탐지해 차단하는 애플리케이션 계층 방화벽입니다. 쉽게 말해 서비스 앞에 세워두는 검문소입니다.
- CDN 및 Anycast 분산 네트워크: 공격 트래픽을 지리적으로 분산된 여러 노드로 나눠받아 단일 서버 과부하를 막는 구조입니다. 대규모 공격에서 특히 효과적입니다.
- Auto Scaling: 트래픽이 급증할 때 자동으로 서버 자원을 확장하는 기능입니다. 다만 무제한 확장은 비용 폭증으로 이어지기 때문에 상한선 정책을 반드시 함께 설정해야 합니다.
- IP 차단 및 지역 트래픽 필터링: 특정 IP 대역이나 이상 트래픽이 집중되는 지역을 일시적으로 차단하는 방식입니다. 빠른 대응이 가능하지만 정상 사용자를 함께 막을 위험이 있어 신중하게 적용해야 합니다.
운영하면서 느낀 건, 이 중 어느 하나만 믿고 나머지를 소홀히 하면 반드시 구멍이 생긴다는 점입니다. WAF가 탐지 못한 요청이 Rate Limiting에서 걸리기도 하고, 반대로 Rate Limiting을 교묘히 피한 공격이 WAF 패턴 룰에 걸리기도 합니다. 방어 레이어가 겹쳐야 비로소 실질적인 방어가 됩니다.
또 한 가지 중요한 건 병목 지점을 먼저 파악하는 일입니다. 인프라 규모가 크다고 해서 안전한 게 아닙니다. 가장 약한 연결고리 하나가 공격 대상이 되면 나머지가 아무리 튼튼해도 의미가 없습니다. 제가 본 케이스 중에는 로드밸런서는 멀쩡한데 그 뒤의 데이터베이스 연결 풀이 먼저 고갈돼 전체가 다운된 사례도 있었습니다. 한국인터넷진흥원(KISA)의 DDoS 대응 가이드에서도 서비스 아키텍처 전반에 걸친 취약 지점 점검을 우선순위로 권고하고 있습니다.
자동 대응, 사람이 손댈 시간은 없다
DDoS 공격이 시작되고 나서 사람이 상황을 파악하고 대응을 시작하기까지 얼마나 걸릴 것 같으신가요? 빨라도 수 분, 현실적으로는 10~20분 이상입니다. 그런데 그 사이에 서비스는 이미 죽어있습니다. 결국 자동 탐지와 자동 대응 구조가 없으면 사후 수습밖에 안 됩니다.
자동 대응 파이프라인을 구성할 때 저는 크게 세 단계를 기준으로 봅니다. 먼저 이상 트래픽 탐지, 그 다음 트리거 기반 자동 차단, 마지막으로 복구 후 정상화 확인입니다. 예를 들어 특정 API 엔드포인트의 분당 요청 수가 정상 기준의 5배를 넘으면 자동으로 해당 IP에 대한 Rate Limiting을 강화하고, 일정 시간 뒤 트래픽이 안정되면 정책을 복원하는 식입니다.
임계값(Threshold) 설정은 생각보다 까다롭습니다. 임계값이란 자동 차단이 발동하는 기준 수치를 말합니다. 너무 낮게 잡으면 정상적인 트래픽 피크에도 차단이 걸려 오탐이 발생하고, 너무 높게 잡으면 실제 공격이 들어와도 반응이 늦어집니다. 제가 직접 운영해봤는데, 이 임계값은 서비스 특성마다 달라서 처음에는 실제 트래픽 데이터를 쌓고 나서 조정하는 게 훨씬 현실적이었습니다.
또 한 가지 놓치기 쉬운 부분이 Auto Scaling과의 조합입니다. 공격 중에 인스턴스가 자동으로 늘어나면 비용이 폭증할 수 있습니다. 실제로 비용 한도 설정 없이 Auto Scaling만 켜뒀다가 공격 한 번에 예상치 못한 과금이 발생하는 사례가 있습니다. 저도 한 번은 이 부분을 간과해서 아찔했던 적이 있었습니다. 확장은 허용하되, 반드시 최대 인스턴스 수와 비용 알람을 함께 설정해야 합니다.
자동화 구조가 갖춰졌다고 끝이 아닙니다. 주기적으로 공격 시나리오를 가정한 시뮬레이션을 해봐야 합니다. 실제 공격이 왔을 때 처음으로 대응 로직이 작동하는 상황은 만들지 말아야 합니다.
결국 DDoS를 100% 막겠다는 목표는 현실적이지 않습니다. 공격 기술은 계속 진화하고 있고, 방어자는 항상 한 발 늦게 반응하는 구조이기 때문입니다. 현실적인 목표는 핵심 기능만큼은 살아있는 상태를 유지하는 것, 그리고 회복 시간을 최대한 단축하는 것입니다. DDoS 대응은 보안팀 혼자 짊어지는 문제가 아니라, 인프라·백엔드·운영팀이 함께 구조를 설계해야 비로소 실전에서 버티는 방어 체계가 됩니다. 아직 자동 대응 구조를 갖추지 못했다면, Rate Limiting과 모니터링 알람부터 먼저 챙기시길 권합니다.
관련 글
댓글
댓글 쓰기