숨은 링크 하나로 봇 트래픽 80% 감소: 허니팟 차단 도구 'B6' 살펴보기

들어가며
AI 크롤러가 늘어나면서 작은 사이트 운영자의 고민도 커졌습니다. 취미로 운영하는 사이트 OpenBenches.org는 한 달 데이터 전송량이 2.5TB를 넘었고, 운영자는 AI 봇이 데이터와 이미지를 계속 긁어 간 탓이라고 봤습니다.
운영자가 이 문제를 막으려고 만든 도구가 B6입니다. 원리는 아주 단순합니다. '들어가지 말라'고 적어 둔 곳에 들어온 방문자를 차단합니다. 이 글에서는 B6의 구조, 실제 효과, 한계를 차례로 정리합니다.
핵심 요약
- B6는
robots.txt로 접근을 금지한 숨은 허니팟에 들어온 IP를.htaccess에 등록해 사이트 전체 접근을 막습니다. - OpenBenches.org에 적용한 뒤 봇 트래픽이 80% 넘게 줄었고, 하루 전송량은 최고 216GB에서 약 25GB로 내려갔습니다.
- 모든 페이지에 사람 눈에는 보이지 않는 링크를 넣어 크롤러를 유도합니다. 캐시를 많이 쓰는 사이트에서도 작동합니다.
- User-Agent나 국가 같은 다른 신호는 보지 않고 곧바로 차단합니다. 사전 경고나 자동 이의 제기 절차는 없습니다.
- 유용한 봇이나 상관없는 이용자가 함께 막힐 수 있습니다. 허니팟을 피하거나
robots.txt를 지키면서 문제를 일으키는 봇은 잡지 못합니다.
B6는 어떻게 작동할까?
B6는 Jeff Starr의 Blackhole에서 아이디어를 느슨하게 빌려 왔습니다. 동작은 세 단계로 나뉩니다.
/honeypot/같은 디렉터리를 만들고 그 안에index.php를 둡니다.robots.txt에 이 경로 접근을 금지한다고 적습니다.- 사이트의 모든 페이지에 허니팟으로 가는 숨은 링크를 넣습니다.
규칙을 지키는 봇은 금지된 경로에 들어가지 않습니다. 일반 사용자에게는 링크가 보이지 않습니다. 그러니 이 링크를 따라오는 쪽은 규칙을 무시하는 봇일 가능성이 높습니다.
1) robots.txt 설정
사이트 루트의 robots.txt에 다음 내용을 추가합니다.
User-agent: *
Disallow: /honeypot/
봇은 보통 24시간마다 robots.txt 변경 사항을 확인합니다. 그래서 적용 후 하루 정도 기다리거나, 주요 크롤러에 갱신 내용을 직접 제출하는 편이 좋습니다. 그렇지 않으면 아직 새 규칙을 읽지 못한 정상 봇까지 막힐 수 있습니다.
2) .htaccess 차단 구역
mod_rewrite설정에 차단 IP 전용 구역을 만들고, 다른 재작성 규칙보다 앞에 둡니다.- 예제에서는 문서용으로 예약된 TEST-NET-1 주소
192.0.2.1을 첫 항목으로 넣습니다. RewriteCond로REMOTE_ADDR를 비교하고,RewriteRule ^ - [R=402,L]로 요청을 막습니다.ErrorDocument 402에 Payment Required - Access Denied. 문구를 넣어 돌려줍니다. 안내문은 원하는 텍스트로 바꿀 수 있습니다.
3) PHP로 방문 IP 기록
허니팟의 index.php는 다음 일을 합니다.
- 방문자의 IP와 User-Agent를 읽습니다.
.htaccess차단 구역에 새 조건을 추가하고 파일을 저장합니다.- 각 항목에 시각과 User-Agent를 주석으로 남기고, IP 조건은
[OR]로 연결합니다. - 차단 구역의 시작 표식이 없으면 그대로 종료합니다.
IP 추출 함수는 X-Forwarded-For의 주소 목록에 REMOTE_ADDR와 HTTP_CLIENT_IP를 더합니다. 그중 사설·예약 대역이 아닌 첫 번째 유효 IP를 고릅니다. 프록시나 CDN 뒤에 있는 사이트를 고려한 처리입니다.
4) 사람에게 보이지 않는 링크
크롤러는 페이지의 링크를 찾아 따라갑니다. B6는 이 습성을 이용합니다.
aria-hidden="true"를 붙여 스크린 리더 등 접근성 트리에서 뺍니다.- 링크 텍스트로 **폭 없는 결합 문자(zero width joiner)**를 씁니다.
- CSS의
display: none !important와cursor: none !important로 링크와 커서를 숨깁니다.
일주일 운영 결과
| 항목 | 결과 | |---|---| | 차단한 IP | 400개 이상 | | 봇 트래픽 | 80% 이상 감소 | | 하루 데이터 전송량 | 최고 216GB → 약 25GB | | 이용자 불만 | 없음 | | 차단을 풀려고 비용을 낸 봇 | 없음 😄 |
코드 몇십 줄로 얻은 결과입니다. 트래픽 비용이 부담스러운 개인 사이트라면 눈여겨볼 만합니다.
한계와 주의할 점
운영자는 B6가 가장 정교한 봇 차단기는 아니라고 분명히 밝힙니다. 실제로 쓰기 전에 다음 내용을 확인하세요.
오차단 가능성
- 사람이 숨은 링크를 클릭할 가능성은 낮지만 0은 아닙니다. 오류 안내문에 차단 해제 요청 방법을 적어 두면 좋습니다.
- 유용한 봇도 robots.txt를 무시할 수 있습니다. User-Agent로 구분된다면
.htaccess에서 해당 항목을 직접 지우거나 허용 목록 예외를 만들 수 있습니다. 다만 악성 봇은 User-Agent를 속이기도 합니다. - 봇이 탈취한 IP를 쓰다 떠나면 그 IP를 쓰는 다른 이용자가 계속 막힐 수 있습니다. 타임스탬프를 기준으로 오래된 항목을 주기적으로 지워 대응할 수 있습니다.
탐지 회피
- 모든 봇이 모든 링크를 따라가지는 않습니다.
- robots.txt를 지키면서 과도하게 수집하는 봇은 이 방식으로 잡을 수 없습니다.
- 봇이 수백 개 IP를 돌려 쓰면 같은 봇을 여러 번 차단하게 됩니다.
- CSS로 숨긴 링크를 알아보는 봇에는 보이지 않는 공백이나 문자를 쓰는 방법이 있습니다.
/honeypot/이라는 경로명을 피하는 봇에는 다른 이름을 씁니다. 접근하면 차단된다는 패턴까지 눈치채는 봇에는 여러 개의 함정이 필요할 수 있습니다.
성능
- 차단 IP가 수천 개로 늘면
.htaccess를 해석하는 비용 때문에 서버가 느려질 수 있습니다. 다만 근거는 아직 일화 수준이고, 운영자는 크게 걱정할 정도는 아니라고 봅니다.
다른 봇 차단 방식과 비교하면?
- 헤더 기반 추정: 언어 헤더 누락, 오래된 HTTP 버전, 지나치게 오래된 User-Agent 등으로 봇을 짐작해 막는 방식입니다. 오탐 위험이 있습니다.
- B6의 전제: 일반 사용자는 숨은 링크를 따라갈 수 없고, 규칙을 지키는 봇은 따라가지 않습니다. 따라서 허니팟에 들어온 쪽은 거의 확실히 문제 있는 봇이라고 판단합니다.
- Anubis와 비교: 운영자는 Anubis의 단점으로 설치 작업량과 일반 이용자가 겪는 불편을 꼽습니다. B6는 특정 호스팅 환경을 요구하지 않고, 사용자에게 확인 화면도 띄우지 않습니다.
앞으로의 계획
- 차단한 IP의 지리적 위치 기록
- 일정 기간이 지난 차단 항목의 자동 삭제
코드를 쓰거나 고칠 때는 AGPL v3 라이선스를 따라 달라고 운영자는 요청합니다.
마무리
B6는 '투박한 망치'라는 이름 그대로 정교함보다 단순함과 효과를 택한 도구입니다. 장점과 단점이 분명합니다.
- 장점: 구현이 쉽고, 호스팅 환경을 가리지 않으며, 일반 사용자 경험을 해치지 않습니다.
- 단점: 오차단을 막을 장치가 부족하고, 영리한 봇은 빠져나갈 수 있습니다.
AI 크롤러 때문에 트래픽 비용이 늘어난 소규모 사이트라면 가볍게 시도해 볼 만합니다. 적용할 때는 허용 목록과 오래된 차단 항목 자동 해제를 함께 준비해 두세요.
출처: GeekNews (https://news.hada.io/topic?id=36981)
원문: https://news.hada.io/topic?id=36981&utm_source=geeknews&utm_medium=rss&utm_campaign=news