Anubis는 실제로 누구를 막는가?
2 days ago
4
- HTTP 접근 전에 작업 증명(Proof-of-Work) 을 요구하는 Anubis는 AI 스크레이퍼보다 일반 사용자와 저사양 기기, JavaScript 미지원 클라이언트에 더 큰 지속적 비용을 부과함
- LLM이 만든 anubis-fetch는 작업 증명을 직접 풀고 필요하면 Chromium을 실행하며, Chrome의 TLS/JA3 지문을 모방해 Cloudflare의 수동 차단까지 통과함
- 스크레이퍼는 발급받은 쿠키를 캐시·재사용해 비용을 여러 요청에 걸쳐 상각할 수 있지만, 사람은 방문할 때마다 수초의 대기와 배터리 소모를 감수해야 함
- 기본 난이도 4는 평균 65,536회 해시를 요구하며, 네이티브 Go 구현은 약 1.3ms, 브라우저 JavaScript는 약 130ms가 걸리지만 실제 체감 대기 시간은 약 1~5초임
- 회당 체감 시간 2초와 에너지 20J를 가정하면 하루 100만 회의 도전은 연간 약 23인년·2MWh, 하루 1억 회는 약 2,300인년·200MWh를 소모함
AI가 우회한 Anubis
- Linux 커널에서 binfmt_misc의 bpf를 통해 인터프리터 PT_INTERP에 $ORIGIN을 지원하는 패치를 작업하면서, LLM에 Linux 커널 메일링 리스트 스레드를 읽도록 요청함
- lore.kernel.org는 리소스 접근 전에 작업 증명을 요구하는 HTTP 프록시 Anubis를 도입한 상태였음
- LLM은 이 제한을 처리하는 anubis-fetch를 제작함
- 우선 작업 증명을 네이티브로 풀고, 실패하면 Chromium으로 URL을 방문함
- req로 실제 Chrome의 TLS/JA3 지문을 모방해 Cloudflare의 수동 차단도 통과함
- anubis-fetch <URL>은 HTML을 표준 출력으로 내보내고, --text 옵션은 읽기 쉬운 일반 텍스트를 출력함
- Anubis가 겨냥한 AI와 봇은 작업 증명 지원을 한 번 추가하면 쉽게 우회할 수 있음
- 스크레이퍼는 도전을 해결한 뒤 받은 쿠키를 캐시·재사용해 비용을 여러 요청에 걸쳐 상각함
- 반면 사람은 방문할 때마다 스피너를 기다리고 배터리를 소비하며, 이 비용을 다른 사용자와 나눌 수 없음
- 저사양 기기와 스마트폰일수록 부담이 커지고, JavaScript를 사용하지 않는 w3m·lynx·스크린 리더·RSS 리더는 접근할 수 없음
- AI를 막으려는 장치가 AI에는 쉽게 우회되는 반면, 사람과 개방형 웹에는 계속 비용을 부과하는 역진적 부담으로 작동함
작업 증명이 만드는 시간·에너지 비용
- 난이도 d는 해시가 가져야 하는 선행 0의 16진수 문자 개수이며, 풀이당 기대 작업량은 W = 16^d회 해시임
- 흔한 기본값인 난이도 4는 65,536회 해시를 요구함
- 약 50 MH/s인 네이티브 Go 구현: 약 1.3ms
- 약 0.5 MH/s인 브라우저 JavaScript: 약 130ms
- 페이지 로드와 워커 실행, 재로딩을 포함한 체감 시간: 약 1~5초
- 난이도 5는 1,048,576회 해시를 요구함
- 네이티브 Go 구현: 약 20ms
- 브라우저 JavaScript: 약 2초
- 체감 시간: 약 5~15초
- 전 세계의 일일 Anubis 도전 풀이 횟수를 C, 회당 체감 시간을 t = 2초, 화면과 CPU를 포함한 기기 에너지를 E = 20J로 가정함
- 연간 사람 시간은 C × t × 365 / 3.15×10⁷로 계산함
- 연간 에너지는 C × E × 365 / 3.6×10⁶kWh로 계산함
- 이 가정에 따른 연간 비용은 다음과 같음
- 하루 100만 회: 약 23인년, 약 2MWh
- 하루 1,000만 회: 약 230인년, 약 20MWh
- 하루 1억 회: 약 2,300인년, 약 200MWh
- 모든 수치는 대략적인 추정치이며, 봇 팜과 AI 도구가 몇 자릿수 더 많은 에너지를 사용하므로 환경 문제를 주장하기 위한 계산은 아님
- 로봇에게 시간은 제약이 아니지만 사람의 시간은 유한하므로, 이용자들은 AI 시대 이전에는 없었던 웹사이트 접근 대기에 집단적으로 상당한 시간을 쓰게 됨
-
Homepage
-
Tech blog
- Anubis는 실제로 누구를 막는가?