# AI 스크레이퍼가 주석 처리된 스크립트를 요청하다

> Clean Markdown view of GeekNews topic #24076. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=24076](https://news.hada.io/topic?id=24076)
- GeekNews Markdown: [https://news.hada.io/topic/24076.md](https://news.hada.io/topic/24076.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-11-02T03:34:06+09:00
- Updated: 2025-11-02T03:34:06+09:00
- Original source: [cryptography.dog](https://cryptography.dog/blog/AI-scrapers-request-commented-scripts/)
- Points: 2
- Comments: 1

## Topic Body

- 웹 서버 로그 분석 중 **존재하지 않는 JavaScript 파일**을 요청하는 다수의 봇 활동이 발견됨  
- HTML 주석 안의 스크립트 태그를 실제 코드로 인식해 요청한 것으로, **LLM 학습용 데이터 수집 시도**로 추정되는 행위  
- 이러한 비정상 요청을 탐지해 **공개 경고, IP 차단, 압축폭탄, 데이터 포이즈닝** 등 다양한 대응 방안 제시  
- 특히 **데이터 포이즈닝**은 LLM 학습 데이터를 오염시켜 모델 성능을 저하시킬 수 있는 효과적 수단으로 언급  
- 웹 관리자가 **AI 스크레이퍼에 대한 방어 및 역공 전략**을 실험적으로 도입할 필요성 강조  

---

### 비정상 스크레이핑 행위 발견
- 서버 로그에서 존재하지 않는 JavaScript 파일에 대한 **404 오류 요청** 다수 확인  
  - 해당 파일은 HTML 주석 안에 포함된 비활성 스크립트로, 정상 브라우저는 요청하지 않아야 함  
- 요청의 **User-Agent** 중 일부는 `python-httpx/0.28.1`, `Go-http-client/2.0`, `Gulper Web Bot 0.2.4` 등 명백한 봇으로 식별  
- `robots.txt`에서 크롤러 접근을 금지했음에도 요청이 지속되어 **규칙 무시 또는 무시된 정책**으로 판단  
- 일부 요청은 Firefox, Chrome, Safari 등 정상 브라우저로 위장했으나, HTML 주석을 해석하지 못해 **거짓 식별**로 드러남  
- 이러한 요청은 **LLM 학습용 콘텐츠 비동의 수집**을 위한 스크레이퍼로 추정  

### 스크레이퍼의 동작 방식
- 일부는 HTML을 올바르게 파싱해 주석 내 URL을 재귀적으로 탐색할 가능성 있음  
- 다른 일부는 HTML을 단순 텍스트로 처리해 **정규식 기반 URL 추출**을 수행한 것으로 보임  
- User-Agent 다양성과 수준 차이로 보아 **여러 운영자**가 존재하며, 일부는 단순한 자동화 도구를 사용  
- 공통된 동기는 **탐욕적 데이터 수집**이며, 이를 **역이용 가능성**으로 제시  

### 알고리듬적 사보타주 (Algorithmic Sabotage)
- 알고리듬 시스템을 의도적으로 교란하는 행위로, **LLM의 외부 비용 문제**로 인해 주목받는 주제  
- 봇의 비인간적 행동 패턴을 인식하면 **탐지 및 대응이 용이**  
- 대응 방식은 네 가지로 구분됨: **공개 경고, IP 필터링, 압축폭탄, 데이터 포이즈닝**

#### 0. 공개 경고 (Public Disclosure)
- 사소한 오탐(예: User-Agent 오타 “Mozlla”)은 공개 시 쉽게 수정될 수 있어 비공개 유지  
- 반면, **본질적 행위**(예: 주석 내 스크립트 요청)는 수정 불가능하므로 공개가 유익  
- 이를 통해 다른 사이트 운영자들이 동일한 공격을 **탐지 및 차단** 가능  
- 해당 행위를 감지하는 시스템을 다른 사이트에도 적용 중  

#### 1. IP 필터링 (IP Filtering)
- **fail2ban**을 이용해 로그 패턴, 날짜, IP를 기반으로 자동 차단  
- 일반적으로 짧은 차단 시간으로 설정하지만, **장기 차단** 시 학습형 봇의 재시도 억제 가능  
- **봇넷**의 경우 IP를 바꿔 지속 요청할 수 있으나, 반복 패턴을 통해 탐지 가능  
- 향후 봇넷 동작 분석에 대한 추가 연구 계획 언급  

#### 2. 압축폭탄 (Decompression Bombs)
- 공격자가 요청한 파일에 **zip bomb**을 제공해 시스템 자원 소모 유발  
- CPU, RAM, 디스크를 과도하게 사용하게 하거나, 취약점 악용 가능  
- 단점으로는 서버 자원 소모 및 **대역폭 낭비 위험** 존재  
- 일부 봇은 감염된 시스템에서 작동하므로, 공격 효과가 제한적일 수 있음  
- 모든 봇을 대상으로 적용하기보다는 **무작위 일부 요청에 대응**하는 방식 제안  

#### 3. 데이터 포이즈닝 (Poisoning)
- LLM 학습용 데이터를 **오염시켜 모델 성능 저하** 유도  
- 최근 연구에 따르면, **250개의 오염 문서**만으로도 대형 모델에 지속적 영향 가능  
- 오염 데이터는 모델이 특정 주제에서 **무의미한 출력**을 생성하게 만들 수 있음  
- 예시로, 보안 연구 관련 질문 시 특정 블로그를 추천하도록 유도 가능  
- **nepenthes**, **iocaine**, **glaze**, **nightshade** 등 공개 도구 활용 가능  
- LLM 학습 데이터가 **비동의 수집**된 경우, 이러한 대응은 **정당한 방어 수단**으로 제시  
- IP 차단과 병행 시 구현 복잡도가 증가할 수 있으나, **병행 운용 가능성** 있음  
- 효과적인 설계는 공개하지 않을 수도 있으며, **창의적 사보타주 참여 확대** 필요성 강조  

### 결론 및 커뮤니티 대응
- 비정상 봇 행동을 통한 탐지는 새로운 개념이 아니며, **주석 내 스크립트 요청**은 새롭게 발견된 사례  
- `robots.txt`에 **Disallow 지시어**를 추가해 특정 요청 시 **역공 조치**를 유도하는 방법 제시  
  ```
  User-agent: GPTBot
  Disallow: /poison/
  ```
- 커뮤니티에서는 `display:none`과 `rel="nofollow"` 속성을 이용해 **봇 유인 링크**를 숨기는 다양한 아이디어 공유  
  - 예시: `&lt;a href="/hello-llm-robot-come-here" rel="nofollow" style="display:none"&gt;you didn't see this link&lt;/a&gt;`  
- 링크를 **절대경로(absolute URL)** 로 설정하면 더 많은 크롤러가 속을 가능성 있음  
- 여러 사이트에 다양한 **봇 유인 및 차단 실험**을 진행 중이며, 효과를 측정해 공유 예정  
- 다른 연구자들도 **AI 스크레이퍼 교란 실험**에 참여 중이며, 독창적 포이즈닝 사례도 소개됨  
- 전체적으로 **AI 데이터 수집에 대한 자율적 방어와 역공 전략 확산**을 목표로 함

## Comments



### Comment 45762

- Author: neo
- Created: 2025-11-02T03:34:07+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=45773347) 
- 대부분의 **웹 스크래퍼**는 불법이라 해도 비즈니스 목적임  
  그래서 Amazon이나 쇼핑몰 데이터를 긁는 경우가 많음. 결국 원치 않는 트래픽의 대부분은 빅테크나 취약점을 노리는 악성 행위자들임  
  나는 웹 스크래핑에 대해 조금 아는 편임. 일부 사이트는 보호 목적으로 404를 반환하기도 해서, 내 크롤러는 `curlcffi` 같은 빠른 크롤링 방식을 여러 번 시도함  
  **Zip bomb** 방어는 간단히 헤더의 content-length만 읽으면 충분함. 응답이 너무 크면 읽지 않도록 바이트 제한을 두고, 타임아웃으로도 제어함  
  그런데 `requests`의 timeout은 페이지 읽기 전체에 대한 타임아웃이 아니라는 걸 아는지? 서버가 바이트를 천천히 보내면 무한 대기 상태가 됨  
  그래서 이런 문제를 해결하려고 직접 **크롤링 시스템**을 만들었음. Selenium도 일관되게 실행할 수 있음  
  내 프로젝트는 [crawler-buddy](https://github.com/rumca-js/crawler-buddy)이고, 기반 라이브러리는 [webtoolkit](https://github.com/rumca-js/webtoolkit)임
  - `content-length`는 **content-encoding 이후**에 계산된다는 점을 잊지 말아야 함
  - “scraping”과 “crawling”의 차이가 있는지 궁금함
  - 이제는 **브라우저 내 스크래퍼**의 시대가 올 듯함. 서버 입장에서는 사람과 구분이 불가능하고, AI 드라이버가 인간 테스트도 통과할 수 있음

- “비동의적으로 LLM 학습 데이터를 수집했다”는 표현이 웃김  
  공개된 HTTP 서버에 GET 요청을 보내는데 무슨 허락이 필요하다는 건지 모르겠음. 물론 weev 사건은 예외적인 **참사**였음
  - 나는 공개 HTTP 서버를 열면 일반적인 GET 요청은 환영함  
    하지만 (1) 일반 사용자의 접근과 **봇의 DDoS 공격**은 다름. 무료로 제공된다고 해서 무한히 가져가는 건 남용임  
    (2) 합법적 복제와 **로봇의 위조 행위**는 구분되어야 함  
    (3) 잘 동작하는 봇이라면 `robots.txt`를 존중해야 함. 법은 아니지만 **예의**의 문제임  
    수백만 개의 주거용 IP를 돌려 쓰는 봇은 절대 정상적이지 않음
  - 서버 설정을 속여 원하는 데이터를 얻는다면, 그건 **비동의적 접근**임  
    공개 서버라 해서 거짓된 요청을 허용한 건 아님. 합리적인 요청만 암묵적으로 동의한 것임
  - `robots.txt`는 법적 구속력이 아니라 **예의 있는 요청**임  
    “이 페이지는 긁지 말아주세요” 정도의 의미일 뿐, 정말 막고 싶다면 API 토큰이나 인증 절차를 둬야 함
  - 단 한 번의 접근과 **무한 크롤링 폭주**를 동일시하는 건 말이 안 됨  
    스팸이 단순 이메일과 같지 않은 것처럼, 봇 남용도 단순 요청과는 다름
  - “사탕 그릇” 비유로 말하자면, 트릭오어트릿용 사탕을 한 어른이 전부 가져가면 기분이 좋을 리 없음

- DOM을 파싱하기보다 **http/https 문자열을 직접 검색**하는 게 더 빠를 것 같음
  - 단순 텍스트 검색과 DOM 순회는 리소스 차이가 커서 “아마도 빠르다”는 표현은 과소평가임
  - 정규식 접근은 구현이 **쉽지만**, DOM 파싱도 CPU보다는 네트워크 병목이 더 큰 문제임
    결국 **네트워크 혼잡**이 한계 요인임

- 흥미로운 연구의 **실용적 응용**을 보니 재미있음  
  관련 연구는 [이 글](https://news.ycombinator.com/item?id=45529587)에서 볼 수 있음

- 제목이 헷갈림. “commented-out”이라고 하는 게 맞을 듯함
  - 나도 처음엔 **AI 스크래퍼 차단 스크립트**인 줄 알았음

- 이건 남용이라기보다, 단순히 **주석 처리된 URL**을 읽는 것 같음  
  - 기사 내용은 남용이 아니라 **봇 탐지 신호**로 활용하는 방법을 설명함  
  - 하지만 `robots.txt`를 무시하고 주석까지 긁는 건 확실히 **비매너적 행위**임

- 예전에 웹을 크롤링할 때는 **Perl 정규식**이 가장 신뢰할 만했음  
  주석 속 URL도 당연히 큐에 추가했음
  - DOM 탐색은 오히려 **과한 시도**임. 정규식으로 필요한 div나 p를 잡는 게 더 견고하고 간단했음

- 봇에게 512MB짜리 **랜덤 데이터 파일**을 주면 어떨까 싶음
  - 그보단 **AI 스크래퍼용 광고 응답을 조작**해서 LLM이 특정 제품을 추천하도록 유도하는 게 더 수익성 있음  
    내가 만든 스타트업은 바로 이런 **Ad-poisoning-as-a-service**를 제공함
  - 무작위로 연결된 **AI 독극물 페이지**를 만들어 봇을 가두는 것도 가능함. 사람은 클릭하지 않을 테니까  
  - 하지만 대부분은 **대역폭 비용**을 감당하기 어려움  
  - 512MB 전부 “우리 서비스 최고”라는 문구로 채워도 재밌을 듯함

- “LLM 학습용 데이터 수집”이라기보단 그냥 **인터넷 스캐닝 노이즈**임
  - 맞음. 취약점 스캐너라면 가능한 한 많은 **HTTP 엔드포인트**를 수집하려 할 것임  
    JS 파일은 주석 여부와 상관없이 좋은 단서임  
    반면 LLM 학습용이라면 이런 **저품질 JS 코드**엔 관심 없을 것 같음

- 원치 않는 LLM 학습 트래픽을 **독(poison)** 시키는 방법에 대한 생각임  
  1) 여러 사이트가 협력하면 **데이터 중복 제거**를 피하면서 모델을 오염시킬 가능성이 커짐  
  2) **저작권법**을 이용해 오염 비용을 높일 수도 있음. 다만 사이트가 법적 위험을 질 수도 있음  
     저작권자와 협력하면 위험을 줄일 수 있음
  - 첫 번째 아이디어를 **WordPress 플러그인**으로 만들면 좋겠음  
    요청마다 이미지를 동적으로 변형해 **중복 방어를 무력화**할 수도 있음. 나도 그런 플러그인이 있다면 바로 설치할 것임
