메뉴 닫기

Nginx Rate Limiting을 활용한 웹 엔드포인트 무차별 대입 공격(Brute Force) 방어

What is Rate Limiting? - captcha.eu

 

 

웹 서비스를 운영하다 보면 특정 IP나 자동화 봇에 의해 /login, /admin 같은 인증 엔드포인트로 초당 수십~수백 건의 계정 대입 요청(Brute Force)이 인입되는 경우가 빈번히 발생합니다.

이러한 L7 공격은 백엔드 WAS(Tomcat, Node.js, Spring 등)와 데이터베이스까지 부하를 그대로 전달해 서비스 장애를 유발하므로, 웹 서버 앞단에서 신속하게 걷어내는 것이 가장 효과적입니다.

애플리케이션 변경 없이 웹 서버 앞단인 Nginx 레벨에서 Rate Limiting을 적용해 초과 요청을 429 상태 코드로 제어하는 방법과, 실제 구성 시 유의해야 할 사항을 공유합니다.


사전 준비 (Prerequisites)

🖥️ : Ubuntu 24.04

🌐 : nginx/1.24.0

 

Nginx 설정

설정은 크게 2단계입니다.

nginx .conf 에서 메모리 공간과 속도 제한 기준을 잡고, 가상호스트 설정에서 막을 경로를 지정합니다.

 1) 메모리 Zone 및 제한 기준 정의 (nginx.conf)

/etc/nginx/nginx.conf파일을 열고 http { …}  블록 안에 아래 내용을 추가합니다.

 

2) 보호 대상 엔드포인트 적용 (sites-available/default)

기본 사이트 설정 파일(/etc/nginx/sites-available/default)을 열고 server { … } 블록 안에 /login/ 경로를 추가합니다.

⚠️ Troubleshooting Tip

테스트 시 location 블록 내부에 return 200 “OK”; 같은 Rewrite 모듈 지시자를 선언하면 안 됩니다.

Nginx 내부에서 return의 실행 우선순위가 limit_req보다 훨씬 높아 제한 룰이 무시되고 200 응답이 먼저 반환됩니다.

실제 운영 환경처럼 try_files나 proxy_pass로 전달되도록 구성해야 정상적으로 차단 검사가 수행됩니다.

 

테스트 파일 생성 및 Nginx 재시작

테스트용 엔드포인트 디렉터리 및 파일 생성
# mkdir -p /var/www/html/login
# echo "Login OK" | sudo tee /var/www/html/login/index.html

문법 검사 후 재시작
# nginx -t
# systemctl restart nginx

 

 

🔍 공격 시뮬레이션 및 검증

로컬 루프백(127.0.0.1) 대신 실제 네트워크 인입 환경과 동일하게 외부 테스트 클라이언트에서 대상 서버 공인 IP로 10회 연속 단시간 요청을 발송합니다.

> for i in {1..10}; do curl -s -o /dev/null -w “%{http_code}\n” http://서버 IP/login/; done

첫 요청 이후 허용 임계치(rate=3r/s)를 초과한 요청부터 즉각 429 Too Many Requests 상태 코드가 반환되며 연결이 거절되는 것을 확인했습니다.

 웹 서버 에러 로그 확인

서버의 /var/log/nginx/error.log를 모니터링하면, Nginx가 초과 요청을 차단한 내역이 밀리초 단위로 기록됩니다.

외부 클라이언트 IP가 정책 기준을 초과(excess)하자마자 Nginx 메모리 존(login_limit)에 의해 요청이 차단된 것을 검증할 수 있습니다.

이 글은 본인의 실제 경험과 학습을 기반으로 직접 작성하였으며, AI는 참고용으로만 활용하였습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다