
해커가 우리 사이트를 공격했다: WAF(웹 방화벽)로 방어한 썰
서비스 런칭 3일 차, 갑자기 DB CPU가 100%를 찍었습니다. 로그를 보니 SQL Injection 공격이 들어오고 있었죠. 급하게 AWS WAF를 도입하여 공격을 차단하고, 더 나아가 Rate Limiting으로 DDoS까지 방어한 경험담입니다. Positive/Negative 보안 모델과 OWASP CRS의 개념도 함께 다룹니다.

서비스 런칭 3일 차, 갑자기 DB CPU가 100%를 찍었습니다. 로그를 보니 SQL Injection 공격이 들어오고 있었죠. 급하게 AWS WAF를 도입하여 공격을 차단하고, 더 나아가 Rate Limiting으로 DDoS까지 방어한 경험담입니다. Positive/Negative 보안 모델과 OWASP CRS의 개념도 함께 다룹니다.
프론트엔드 개발자가 알아야 할 4가지 저장소의 차이점과 보안 이슈(XSS, CSRF), 그리고 언제 무엇을 써야 하는지에 대한 명확한 기준.

Debug에선 잘 되는데 Release에서만 죽나요? 범인은 '난독화'입니다. R8의 원리, Mapping 파일 분석, 그리고 Reflection을 사용하는 라이브러리를 지켜내는 방법(@Keep)을 정리해봤습니다.

서버를 끄지 않고 배포하는 법. 롤링, 카나리, 블루-그린의 차이점과 실제 구축 전략. DB 마이그레이션의 난제(팽창-수축 패턴)와 AWS CodeDeploy 활용법까지 심층 분석합니다.

새벽엔 낭비하고 점심엔 터지는 서버 문제 해결기. '택시 배차'와 '피자 배달' 비유로 알아보는 오토 스케일링과 서버리스의 차이, 그리고 Spot Instance를 활용한 비용 절감 꿀팁.

보안 이슈 사례를 공부하다 보면 빠지지 않고 등장하는 상황이 있습니다.
서비스 런칭 초기, order_note 컬럼에 이런 데이터가 쌓이기 시작하는 것입니다.
' OR 1=1 --
'; DROP TABLE users; --
UNION SELECT 1, @@version --
등골이 서늘해지는 데이터입니다. SQL Injection 공격입니다. 누군가 사이트의 취약점을 찾기 위해 자동화된 스캐너를 돌리고 있는 것이죠. ORM이 기본적인 방어는 해주더라도, 로그를 보면 초당 100회 이상의 접속 시도로 서버 CPU가 100%를 치고 있는 경우가 많습니다.
이런 상황에서 "코드 레벨에서 IP 차단할까?"라는 생각이 들 수 있지만, 그렇게 하면 서버가 그 IP 검사하느라 또 자원을 씁니다. 애플리케이션 서버에 도달하기 전에 막아야 합니다.
WAF는 말 그대로 '웹 애플리케이션 방화벽'입니다. 이해하기 쉽게 공항 보안 검색대에 비유해 보겠습니다.
우리는 급하게 AWS WAF를 ALB(Load Balancer) 앞에 붙였습니다.
WAF에는 OWASP CRS라는 표준 규칙 세트가 있습니다. 이걸 켜기만 하면, 전 세계적으로 알려진 공격 패턴들을 자동으로 막아줍니다.
' OR 1=1 같은 패턴 차단.<script> 태그 포함 시 차단./etc/passwd 같은 시스템 파일 경로 접근 차단.적용하자마자 공격 로그가 뚝 끊겼습니다. 빨갛게 달아올랐던 서버 CPU가 평온을 되찾았습니다.
WAF를 운영할 때 반드시 알아야 할 두 가지 철학이 있습니다.
id 필드는 숫자여야만 해"라고 WAF에 정의하는 것.WAF를 도입하고 며칠 뒤, 이런 문제가 보고됩니다. 회원가입이 안 된다는 사용자 신고가 들어온 것입니다.
로그를 보니 차단된 사용자의 닉네임이 "Select" 였습니다.
WAF가 Select라는 단어를 보고 "어? 이거 SQL Injection 구문(SELECT * FROM) 아니야?" 하고 차단해버린 겁니다. (실화입니다)
이것이 오탐(False Positive)입니다. 보안이 너무 강력해서 정상적인 사용자를 범죄자 취급하는 것이죠.
해결책:옛날에는 ModSecurity 같은 오픈소스 WAF를 직접 서버(Nginx)에 설치해서 썼습니다. 하지만 요즘은 무조건 Cloud WAF (AWS, Cloudflare)를 추천합니다.
스타트업 CTO분들이 흔히 하는 말. "AWS WAF 비싸지 않나요?"
계산해 봅시다. AWS WAF는 월 $5 + 요청 100만 건당 $0.6입니다. 트래픽이 적은 스타트업이라면 커피 두 잔 값도 안 나옵니다.
반면, 보안 사고가 터지면? 개인정보 유출 과태료, 고객 신뢰 하락, 복구 비용... 수억 원이 깨집니다. 회사가 문을 닫을 수도 있습니다.
개발자 여러분, SQL Injection 방어 코드를 짜느라 밤새지 마세요. 정규식 깎고 있지 마세요. 그냥 WAF를 켜세요. 그리고 남은 시간에 비즈니스 로직을 짜세요. 그게 회사와 여러분의 정신건강 모두를 지키는 길입니다.
클라우드 WAF를 쓸 돈이 없다면, ModSecurity가 대안입니다. Nginx, Apache에 플러그인으로 설치하는 가장 유명한 오픈소스 WAF입니다. 하지만 설정이 악명 높기로 유명합니다.
예를 들어 SQL Injection을 막는 규칙은 이렇게 생겼습니다:
SecRule ARGS "DELETE[[:space:]]+FROM" "id:1000,deny,msg:'SQL Injection Attempt'"
이걸 직접 짜는 건 무모한 일이고, 보통 OWASP CRS라는 규칙 세트를 다운받아 적용합니다. 단점은 성능입니다. 모든 요청의 본문을 정규표현식으로 검사하느라 서버 속도가 10~20% 느려질 수 있습니다. 트래픽이 많은 서비스라면 서버 비용이 WAF 비용보다 더 나올 수도 있습니다.