리눅스 개발은 철저하게 공개된 방식으로 이뤄진다. 누구나 git 저장소를 복제할 수 있고, 메일링 리스트 아카이브까지도 실시간으로 따라 읽을 수 있다. 이런 개방성은 오랫동안 커뮤니티의 자산이었지만, 대규모 언어모델(LLM) 학습 열풍이 불면서 오히려 인프라를 위협하는 요인이 됐다. LKML(리눅스 커널 메일링 리스트)조차 통째로 복제할 수 있을 만큼 모든 것이 git 저장소로 열려 있는데, LLM 개발자들에게 이런 데이터는 그야말로 노다지다. 커널 커밋의 전체 역사는 사람이 만든, 즉 AI가 생성하지 않은 순수한 학습 데이터임이 보장되기 때문이다. AI가 만든 콘텐츠로 다시 AI를 학습시키면 일종의 '디지털 광우병'에 걸리는 만큼, LLM 오염이 없는 원천 데이터의 가치는 매우 높다.
가장 비효율적인 수집 방식
문제는 크롤러들이 이 데이터를 가져가는 방식이 지극히 비효율적이라는 데 있다. 정상적이라면 저장소를 한 번 복제하고 모든 커밋을 순회하면 끝이다. 그런데 크롤러들은 커밋을 하나하나 HTML로 렌더링해 가져간 뒤 파싱하는 방식을 택한다. 현재 linux.git은 약 148만 개의 커밋을 갖고 있고, git.kernel.org에는 약 922개의 포크가 존재한다. 백엔드 입장에서 이 포크들은 대부분 동일한 객체를 공유하므로 저장 효율이 높지만, 크롤러 입장에서는 사실상 수십억 개의 유효 URL이 생겨나는 셈이다. 결국 동일한 148만 커밋을 922번 중복 수집하는 일이 벌어진다. cgit이 패치, 일반 렌더, 임의 커밋 간 diff까지 모두 제공하기 때문에, 포크 하나당 사실상 무한에 가까운 URL이 만들어진다. 사람이나 robots.txt를 지키는 크롤러를 전제로 설계된 기능들이 지금은 고스란히 부담으로 돌아온 것이다.
차단과 우회의 군비 경쟁
초기 대응은 단순했다. 로그에서 스크래퍼 IP를 찾아 fail2ban으로 막는 것이다. 봇들이 user-agent로 자신을 밝히던 시절에는 쉬웠다. 그러나 봇들은 곧 평범한 브라우저인 척 위장하기 시작했다. 그래서 IP 단위 차단으로 넘어갔고, 8년 된 방치 포크의 모든 커밋을 훑는 트래픽이 진짜 사용자일 리 없다는 판단은 합리적이었다. 봇들이 서브넷 전체로 퍼지자 클라우드 사업자 ASN 단위로 차단했다. 문제는 그다음이었다. 크롤러들이 수백만 개의 주거용·모바일 IP에서 접속하기 시작한 것이다. 각 IP는 4~5개 요청만 보내고 다시는 나타나지 않았다. 정체를 파악할 즈음이면 이미 작업을 마친 뒤라 차단은 무의미했고, 방화벽 룰만 불필요하게 비대해질 뿐이었다. 이것이 이른바 '프록시 SDK 수익화'의 세계다. 앱들이 사용자의 가전제품이나 TV를 트래픽 경유지로 팔아넘기는 큰 사업이며, 크롤러는 메뚜기 떼처럼 몰려와 시스템을 무너뜨리고 다음 표적으로 이동했다 다시 돌아오기를 반복한다.
아누비스, 그리고 다시 뚫린 방어선
약 1년 전 커널 인프라 팀은 봇에게 무의미한 연산 비용을 부과하는 방식으로 판을 뒤집으려 했다. 접속자의 IP와 서버가 제공한 비밀값을 조합해 앞자리에 0이 네 개 붙는 sha256 해시를 찾게 하는 작업 증명, 즉 Anubis를 모든 서비스 앞에 세웠다. 처음엔 즉각적인 효과가 있어 봇들이 포기하고 떠났다. 몇 달의 평화가 지나자 봇들이 난이도 4를 풀며 돌아왔고, 난이도를 5로 올렸다. 이때부터 정상 사용자의 불만이 커졌다. 모바일 기기에서 난이도 5는 몇 초가 걸리고 기기가 불편할 정도로 뜨거워진다. 그럼에도 얼마간 시간을 벌었지만, 결국 봇들은 난이도 5마저 풀기 시작했다. 오늘날 git.kernel.org는 하루 약 600만 건의 무작위 커밋 요청을 받는데, 이 중 66%는 Anubis 챌린지로 즉시 걸러지지만 33%는 연산을 마치고 본 사이트에 도달한다. 커널 저장소의 데이터가 그만한 연산 비용을 감수할 가치가 있다고 판단된다는 뜻이다.
남은 것은 기능 축소라는 고통
관대한 가정을 여럿 동원해도 정상 요청은 전체 트래픽의 약 2%에 불과하고 나머지는 스크래퍼로 추정된다. 흥미로운 점은, 시스템을 실제로 다운시키는 주범이 크롤러가 아니라는 것이다. 오히려 20개 노드에서 동시에 stable.git을 얕은 복제(shallow clone)하려는 조악한 CI 시스템이 더 큰 위협이다. 다만 90개 코어 중 상시 14~16개 코어가 오직 크롤러를 위한 커밋 렌더링에만 매달려 있다는 사실은 무겁다. 평균 20%의 용량이 학습 데이터 공급이라는 단 하나의 목적을 위해 상시 소모되며, 실제 그래프는 파도처럼 몰려오는 특성상 훨씬 더 뾰족하게 튄다. 정상 접근과 클론에 쓰는 CPU보다 스크래퍼용 커밋 렌더링에 쓰는 CPU가 더 많다는 것이 핵심이다.
한국의 오픈소스 인프라 운영자나 사내 git 서버, 문서 아카이브를 공개 운영하는 실무자에게 이 사례는 남의 일이 아니다. user-agent 필터, IP·ASN 차단, 작업 증명 챌린지가 차례로 무력화되는 과정은 방어 측이 늘 한 발 늦을 수밖에 없는 구조적 비대칭을 보여준다. 분산 주거용 프록시 앞에서는 전통적 레이트 리밋과 IP 평판 기반 방어가 사실상 통하지 않는다. 커널 팀이 내놓은 대응은 결국 크롤링 가능한 URL 수를 줄이고 비용이 큰 동작을 차단하는 것, 즉 익명 접근 시 일부 기능을 포기하는 방향이다. cgit처럼 임의 diff나 커밋별 렌더 같은 편의 기능을 무제한 노출하는 설계 자체가 부담을 키운다는 점은 자체 서비스를 설계할 때 되새길 만한 교훈이다.
근본적으로 간단한 해법은 없다. 커스텀 AI 모델을 내세운 신생 기업은 지금도 매일 생겨나 학습 데이터에 굶주려 있고, 앱 제작사들은 수익을 위해 계속해서 가정용 기기를 트래픽 경유지로 바꿔 놓을 것이다. AI 거품이 꺼져 학습 수요가 줄거나, 크롤러들이 스스로 저장소 복제 같은 효율적 방식으로 전환하는 것이 그나마 기대할 수 있는 시나리오다. 다만 커널 팀은 데이터 자체는 요청하는 누구에게나 계속 내려받게 하겠다고 약속했다. 개방성의 원칙은 유지하되, 그 데이터를 온전히 얻으려면 더 많은 관문을 통과해야 하는 시대가 된 것이다.