
"블랙리스트 IP는 진입점에서 바로 드롭한다." 원문의 문장입니다. 맞는 말이지만 반만 맞습니다. 실험실에서 IP 기준으로 "거부된 서로 다른 주문 3개"를 세게 했더니, 공격자보다 먼저 통신사 공유 IP 뒤의 정상 사용자 50명이 한 덩어리로 걸릴 뻔했습니다. IP는 사람이 아니라 주소입니다. 이번 글은 IP 평판을 어디까지 믿을지입니다.
IP 평판(IP reputation)은 "이 주소가 최근 나쁜 짓에 쓰였나"를 점수나 목록으로 나타낸 것입니다. 위협 인텔리전스(TI, Threat Intelligence)는 그런 정보를 모아 나눠 주는 일 전체를 말합니다. 흔히 쓰는 출처는 이렇습니다.
CrowdSec는 원문이 "Fail2ban의 현대적 대안"이라고 부른 도구입니다. 공식 문서 기준 구조는 이렇습니다.
결정에는 기간이 붙습니다. 기본 프로필은 IP를 4시간 차단하고, 반복되면 시간을 늘리는 식을 예시로 둡니다. 차단 대신 캡차를 걸 수도 있습니다. WAF 역할을 하는 AppSec 구성 요소도 있습니다. AppSec가 어떤 엔진 위에 만들어졌는지는 문서에서 확인하지 못했습니다(확인 필요).
AbuseIPDB는 GET /api/v2/check에 IP를 보내면 악용 신뢰 점수(abuseConfidenceScore)를 돌려줍니다. API 키가 필요하고, 무료 등급은 하루 조회 1,000회입니다. 점수 범위를 문서가 명시하지는 않습니다(예시는 0, 52, 100. 0~100으로 보이나 확인 필요). 이 시리즈 실험실은 키가 필요한 외부 API를 부르지 않았습니다.
외부 평판 API를 요청 경로에서 매번 부르면 문제가 셋입니다.
그래서 피드를 내려받아 캐싱합니다. 목록을 주기적으로 받아 Redis 집합이나 방화벽의 IP 집합에 넣고, 요청 경로에서는 로컬 조회만 합니다. 항목마다 만료를 둡니다. IP는 주인이 바뀌기 때문입니다.

통신사 CGNAT, 회사·학교의 NAT, 공용 와이파이 뒤에서는 많은 사람이 공인 IP 하나를 나눠 씁니다. RFC 6269(IP 주소 공유의 문제)는 이렇게 적습니다. 주소를 나눠 쓰면 로그인을 여러 번 실패한 사용자 한 명이 다른 사용자들까지 막을 수 있고, 주소 공유가 널리 퍼지면 IP 기준 "벌칙 상자" 방식은 제대로 동작하지 않는다.
실험실 정상 사용자 중 50명은 CGNAT 주소 두 개(100.64.0.1, 100.64.0.2) 뒤에 있습니다. IP 기준 규칙의 기준값을 낮추면 이렇게 됩니다(2시간 분량 합성 트래픽).
| IP 기준 규칙 | 오탐 사용자 | 그 IP를 함께 쓰는 정상 사용자 |
|---|---|---|
| 거부된 서로 다른 주문 3개 / 10분 | 3명 | 50명 |
| 거부된 서로 다른 주문 5개 / 1시간 | 10명 | 50명 |
| 서로 다른 주문 10개 / 10분 | 51명 | 60명 |
| 같은 규칙을 계정 기준으로 | 0~5명 | 해당 없음 |
가족이 보낸 주문 링크를 연 정상 사용자 몇 명이 같은 CGNAT 주소에서 합쳐져 기준을 넘었습니다. 그 IP를 막았다면 50명이 함께 막혔을 겁니다.
반대로 공격자는 주거 프록시(일반 가정 회선을 빌려 쓰는 프록시 서비스)나 클라우드 인스턴스로 요청마다 IP를 바꿀 수 있습니다. 실험실의 "IP를 바꾸는 열거"는 요청마다 다른 IP를 썼고, IP 기준으로 세는 규칙은 어느 기준값에서도 이 공격을 잡지 못했습니다(미끼는 예외, 5편). 계정 기준 규칙은 5번째 요청에서 잡았습니다.
IP 평판은 결정이 아니라 점수의 재료로 쓸 때 가장 쓸모 있습니다.
모든 링크는 2026-10-30에 확인했습니다.
lab/results/run-shadow-redis/sweeps.csv의 keytype=ip 행(2026-10-30 실행, 14편)이전 글 방어선 2-①: WAF와 OWASP CRS가 잡는 것, 못 잡는 것
다음 글 방어선 3: 실시간 파이프라인은 언제 필요한가
시리즈 전체 목록 해킹 시도를 몇 초 안에 잡는 서버 전체 목록