크롤러 함정을 만들어 본 뒤, 차단과 벽, 폭탄, 속임수보다 스크레이퍼에게 값싼 동적 헛소리를 먹이는 편이 더 쉽고 저렴하다는 것을 깨달은 경험담.
2025년 8월 3일 (프로그래밍) 일주일 전에 무한 헛소리 크롤러 함정을 설치했다 — 이제 그것이 내 서버 트래픽의 99%를 차지한다. 놀라웠던 건, 스크레이퍼들에게 쓰레기를 먹이는 게 내가 할 수 있는 일 중 가장 싸고 쉬운 방법이었다는 점이다.
이들은 예전의 인덱싱 봇이 아니라, LLM 학습용 데이터를 긁어 모으는 스크레이퍼들이다. 크롤링하는 웹사이트가 계속 살아 있어야 하는 검색 엔진과 달리, AI 기업들은 대체재를 제공한다.
이들 봇이 공격적이고 집요하다는 건 놀랄 일이 아니다: robots.txt를 무시하고, 사용자 에이전트로 막으면 브라우저인 척한다. IP를 차단하면 주소를 바꾼다.
… 하루 종일, 매일, 초당 여러 개의 요청을 보내면서.
그럼 그냥 사이트 접근을 허용하면 어떨까?
정적 파일 제공은 비교적 저렴하지만 공짜는 아니다. SSD 접근 시간만 해도 수십 밀리초이고, 이는 파일시스템 오버헤드를 치르기 전의 얘기다. 봇들은 캐시에 있을 법하지 않은 오래되고 희귀한 페이지를 특히 좋아한다. 결과적으로 서버를 느려지게 만드는 데 그리 많은 요청이 필요하지 않다.
대역폭 문제도 있다: 많은 블로그 글에는 수백에서 수천 kB에 달하는 이미지가 포함되어 있어 금세 누적된다. 평균 파일 크기가 100 kB일 때 초당 4개의 요청이면 한 달에 1테라바이트가 된다 — 엄청난 양은 아니지만 내가 기꺼이 버리고 싶은 양보다 많다.
그냥 IP 목록을 만들어 막는 건 일반적인 봇에겐 통한다…
… 하지만 이건 정상적인 봇이 아니다. 수십억 달러 규모의 기업이 뒤에 있으니, 주소 몇 개가 아니라 수천 개를 갖고 있다. 설령 전부 차단해도 더 사 오면 그만이다.
요청 제한도 같은 이유로 소용없다: 그냥 IP를 바꾼다. 아예 요청 하나마다 새 IP를 쓰는 경우도 봤다.
그럼 페이월, 로그인 월, CAPTCHA, 아니면 해시 기반 작업증명은 어떨까?
이런 건 모두 사용자에게 불편을 준다. 계정을 요구하면 내가 쓴 걸 아무도 읽지 않게 된다. 간단한 자바스크립트 챌린지만으로도 JS를 지원하지 않는 브라우저를 쓰는 사람은 전부 막힌다 … 그리고 정상 동작하더라도, 본문이 로드되기 전에 반드시 불러와야 하는 것은 페이지 로딩을 크게 느리게 한다.
“gzip 폭탄 몇 개만 먹이면 정신 차릴 거다” — 인터넷의 절반.
Gzip의 압축률은 기껏해야 천 배 남짓이다: 100GB로 펼쳐지는 파일을 만들고 싶다면 100MB 자산을 제공해야 한다. 더 나쁜 건, 해 보니 봇들은 대수롭지 않게 받아들이고, 어떤 놈들은 더 달라고 다시 왔다.
그럼 그냥 404만 보내서, 내 사이트가 존재하지 않는다고 믿게 만들면 어떨까.
이런 요령은 상대가 속아 줄 ‘마음’이 있을 때만 통한다. 어딘가에 링크가 게시되면 봇들은 그것이 존재한다는 걸 알게 되고, 접근할 수 없으면 더 공격적으로 변한다: 더 많은 사용자 에이전트와 더 많은 주소로, 더 많은 요청을 보낸다.
그들을 만족시키면 감당 가능해진다.
하지만 동적으로 생성한 콘텐츠를 보내 주는 건 비쌀 것 같지 않나?
음… 아니다.
현대 컴퓨터에서 CPU와 RAM은 가장 빠른 부품이다. 동적 콘텐츠가 느리다는 평판은 보통 데이터베이스(디스크 IO 잔뜩), 수백만 줄의 자바스크립트, 혹은 둘 다가 끼어들기 때문이다.
내가 약간만 최적화한 마르코프 재잘이는 요청 하나당 대략 60 CPU 마이크로초를 쓴다. 디스크 IO는 없고, 메모리 비용도 약 1.2 MB에 불과하다. 유지해야 할 규칙이나 블랙리스트도 없다: 봇들이 알아서 몰려들고, 이것이 그들을 먹어 치운다.