개발 slecs

파트너 관리자 페이지에 IP 블랙리스트와 봇 차단 필터 도입

목차

IP 블랙리스트 도입한 이유

며칠 전 파트너 관리자 페이지에 비정상 트래픽이 꾸준히 들어옴. 로그 까보니 동일 IP 대역에서 짧은 간격으로 로그인 시도 + 상세 조회를 반복함. UA는 평범한 척 위장했지만 헤더 조합이 어색하고, Referer가 비어있는 비율이 높았음.

처음엔 그냥 rate limit만 걸까 싶었는데, 정상 파트너도 같이 걸리면 운영팀 CS가 폭발할 게 뻔해서 IP 단위 블랙리스트 + 봇 차단 필터 두 단계로 분리하기로 함.

차단 레이어 구조

레이어 판정 기준 대응
봇 필터 UA·헤더·요청 패턴 401 + 로그
IP 블랙리스트 운영팀이 등록한 IP/CIDR 즉시 차단
정상 트래픽 위 둘 통과 컨트롤러로

블랙리스트는 DB 테이블 한 개로 관리. CIDR 표기 지원 안 하면 같은 대역 IP를 100개씩 등록해야 해서 처음부터 /24 같은 prefix 매칭 넣어둠.

입력: 203.0.113.45  → /24 매칭 → block
입력: 198.51.100.7  → 화이트   → pass

봇 필터 짤 때 시행착오

처음엔 UA에 bot|crawler|spider 정규식만 걸었는데 의외로 정상 헬스체크까지 같이 막힘. 운영팀이 외부 모니터링 도구 두 개 쓰고 있었는데 그게 다 UA에 bot 들어있었음. 결국:

  • UA 단독 판정 금지
  • (UA 의심) AND (Referer 빈값) AND (POST /login 빈도 임계 초과) 3-AND 조건으로 변경
  • 화이트리스트 IP는 무조건 통과

3-AND로 바꾸고 나니 오탐이 거의 0에 수렴. 처음부터 단일 시그널 믿지 말걸 그랬음.

파트너 상세 개선

블랙리스트 작업하다가 파트너 상세 화면에서 차단 이력을 볼 수 있어야 운영팀이 쓸 수 있다는 걸 깨달음. 그래서:

  • 파트너별 최근 차단 시도 N건 표시
  • 마지막 로그인 IP / 국가
  • 의심 행동 카운터(최근 24시간)

원래 한 줄로 끝낼 수도 있었지만 운영팀이 매번 로그 까서 IP 찾아내는 게 진짜 비효율이었음.

부록: 설정 파일 정리

  • CLAUDE 가이드에 "보안 변경은 운영팀 승인 후" 한 줄 추가
  • .gitignore에 로컬 차단 룰 dump 파일 패턴 추가 (실수로 IP 리스트 커밋되는 거 방지)

배운 것

  1. 차단은 항상 다층 + AND 조건. OR로 묶으면 오탐 폭발
  2. CIDR 미리 넣어둘 것. 나중에 마이그레이션하면 지옥
  3. 보안 기능 만들 때 운영팀이 쓸 화면까지 같이 만들어야 실제로 운영됨. 백엔드만 만들고 던지면 결국 내가 IP 등록해주고 있음

다음

댓글 0

첫 댓글 달아줘.