오늘날 접근 로그(access log)를 열어보면 GPTBot, OAI-SearchBot, ChatGPT-User, PerplexityBot 등 수많은 AI 크롤러가 지나다니는 것을 볼 수 있습니다. 이들을 차단할지, 허용할지, 아니면 축하할지 결정하기 전에, 지루하지만 중요한 질문을 던져볼 가치가 있습니다. 바로 '이들이 진짜인가?'입니다.
사용자 에이전트(user agent)는 단지 문자열일 뿐입니다. 어떤 스크래퍼든 OAI-SearchBot/1.3과 같은 값을 전송하고 방화벽이 이를 통과시키기를 바랄 수 있습니다. 좋은 소식은 주요 크롤러를 운영하는 회사들이 실제로 사용하는 IP 범위를 공개한다는 것이므로, 이를 확인해 볼 수 있다는 점입니다.
공식 범위가 존재하는 곳
이 파일들은 모두 JSON 형식이며, ipv4Prefix / ipv6Prefix 항목의 prefixes 목록을 포함하고 있습니다 (모두 2026년 10월 26일에 확인됨):
| 크롤러 | 기능 | IP 목록 |
|---|
OAI-SearchBot | ChatGPT 검색에 사이트 노출 | https://openai.com/searchbot.json |
| ... | | |
Google은 또한 Googlebot을 위한 DNS 방법을 문서화했습니다 (IP에 대한 역방향 조회(reverse lookup)를 수행하여 호스트 이름이 googlebot.com 또는 google.com으로 끝나는지 확인한 후, 동일 IP로 순방향 해석(forward-resolve)합니다). JSON 목록이 배치 검사에는 더 간단하므로, 스크립트는 이 방식을 사용합니다. | | |
스크립트
표준 라이브러리만 사용합니다. 결합 형식 로그(nginx 및 Apache 기본값)를 읽고, 사용자 에이전트 이름 중 하나가 이러한 크롤러에 속하는 요청을 골라내어 클라이언트 IP가 해당 크롤러의 공개된 범위와 일치하는지 확인합니다.
"""
접근 로그에서 어떤 "AI 크롤러" 히트가 실제로 크롤러 소유자로부터 왔는지 확인합니다.
사용법: python3 verify_ai_bots.py access.log
...
"""
## 출력 결과 예시
제가 직접 작성한 5줄짜리 **샘플 로그**를 대상으로 실행해 보았습니다. 이 샘플에는 OpenAI가 공개한 `OAI-SearchBot` 범위 내의 IP에서 온 요청 하나, 문서화 전용 IP(`203.0.113.9`)에서 `OAI-SearchBot`을 주장하는 요청 하나, 실제 `PerplexityBot` IP 하나, 실제 Googlebot IPv6 주소 하나, 그리고 일반 브라우저에서 온 요청 하나가 포함되어 있습니다. 스크립트는 실시간 목록을 가져와 다음과 같이 출력했습니다:
Googlebot verified HTTP 200 x1
OAI-SearchBot SPOOFED HTTP 403 x1
OAI-SearchBot verified HTTP 200 x1
...
브라우저 라인은 무시되고 가짜 `OAI-SearchBot`이 포착됩니다. 이를 실제 로그에 실행하면 흥미로운 행들은 보통 다음과 같습니다:
* **`verified` 상태인데 `HTTP 403` 또는 `429` 오류가 발생한 경우.** 실제로 차단하고 있는 크롤러(예: CDN 봇 규칙, WAF 프리셋, 속도 제한)일 가능성이 높습니다. ChatGPT나 Perplexity 답변에 노출되기를 원한다면, 이 행을 가장 먼저 수정해야 합니다.
* **`SPOOFED` 상태인데 `HTTP 200` 코드가 반환된 경우.** 규칙을 우회하기 위해 크롤러의 이름을 도용하는 사람입니다. IP 주소로 차단해도 안전합니다.
* **크롤러에 대한 행이 전혀 없는 경우.** 방문하지 않았거나 로그 로테이션 과정에서 누락된 것입니다. 아무것도 가정하기 전에 `robots.txt`를 확인하세요.
## 유용한 무언가에 연결하는 방법
단순 일회성 검사를 넘어 제가 활용할 몇 가지 방법들입니다:
1. **cron을 통해 매일 실행하고, 중요한 페이지에서 `verified` 크롤러가 4xx 오류를 받을 때 알림을 받습니다.**
2. **사용자 에이전트(user agents)를 신뢰하는 대신, 해당 범위들을 방화벽 허용 목록(allowlist)에 입력합니다.** 목록은 정기적으로 새로 고쳐야 합니다. (각 파일의 `creationTime` 필드가 언제 변경되었는지 알려줍니다.)
3. **URL별로 분리합니다.** 카운터 키에 `url`을 추가하여 각 크롤러가 실제로 어떤 페이지를 가져오는지 확인합니다. `OAI-SearchBot`이 블로그는 읽지만 가격 책정 페이지(pricing page)는 절대 읽지 않는 것을 발견할 수도 있습니다.
## 이것이 알려주지 않는 것
검증된 크롤러 트래픽은 엔진이 페이지를 _읽을 수 있다_는 것을 증명할 뿐입니다. 구매자가 질문을 할 때 그 엔진이 당신의 이름을 _언급하는지_는 알려주지 않습니다. 이것은 별도의 확인 과정입니다: 구매자들이 하는 질문들을 검색 기능을 켜고 직접 물어보고, 누가 추천되는지, 어떤 페이지가 인용되는지를 살펴보세요.
두 번째 절반이 바로 [Presence Scout](https://presencescout.com)에서 구축하는 부분입니다. ChatGPT, Gemini, Perplexity, AI Overviews 및 AI Mode가 구글 순위와 나란히 당신의 브랜드를 언급하는지 추적합니다. 이 짧은 데모는 실제 브랜드에 적용했을 때 어떤 모습인지 보여줍니다:
하지만 로그부터 시작하세요. 만약 실제 크롤러들이 403 오류를 받고 있다면, 다른 것은 아직 중요하지 않습니다.
_저는 Ankit이며 Presence Scout에서 마케팅 업무를 합니다. 스크립트를 자유롭게 복사하여 적용해 보세요._
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25