robots.txt가 ChatGPT로부터 사이트를 숨기고 있을 수 있습니다. 10분 만에 확인하는 방법
요약
웹사이트의 `robots.txt` 파일은 AI 모델 학습 데이터 차단과 검색 엔진 색인 제어라는 복잡한 문제를 안고 있습니다. 콘텐츠 소유자는 특정 봇(예: GPTBot)을 금지하여 학습 사용을 막으면서도, 다른 봇(예: OAI-SearchBot)에게는 검색 결과 노출은 허용하는 정교한 설정을 할 수 있습니다.
핵심 포인트
- 학습 차단과 검색 색인 유지는 별개의 설정입니다.
- 특정 봇만 명시적으로 제어해야 하며, `User-agent: *`는 모든 경우에 적용되지 않습니다.
- Python의 `urllib.robotparser`를 사용하여 robots.txt 파일을 스크립트로 검증하는 것이 가장 정확합니다.
최근 몇 년 동안 많은 웹사이트들이 robots.txt 파일에 다음 내용을 추가했습니다:
User-agent: GPTBot
Disallow: /
...
만약 콘텐츠가 모델 학습에 사용되는 것을 원치 않는다면 합리적인 선택입니다. 하지만 많은 팀들은 CDN 규칙, WAF 설정 또는 광범위한 'AI 봇 차단' 스위치를 적용하여 더 강력하게 막기도 합니다. 아무도 결정하지 않았더라도, 사이트는 AI 검색(ChatGPT 검색, Perplexity, Claude의 웹 검색)에서도 사라지게 됩니다.
현재 AI 회사들은 학습용, 검색 색인용, 그리고 사용자가 요청할 때 페이지를 가져오는 용도로 별도의 봇을 운영합니다. 이 세 가지를 다르게 취급할 수 있습니다. 하지만 대부분의 사이트들이 그렇지 못한 이유는 이러한 이름들이 명확하지 않기 때문입니다.
어떤 봇이 무엇을 하는가
각 회사 자체 문서를 참고했습니다:
| 회사 | 봇 | 용도 | 차단 시 영향 |
|---|---|---|---|
| OpenAI | GPTBot | 학습 데이터 | 콘텐츠를 OpenAI의 모델 학습에 사용하지 못하게 함 |
| ... | |||
| (표 내용이 원문에 불완전하여 생략됨) |
두 가지 점이 눈에 띕니다.
Google의 AI Overviews는 목록에 없습니다. 이는 Googlebot이 크롤링하는 일반 검색 색인에서 구축됩니다. Google-Extended는 Gemini 학습 및 접지(grounding)를 제어할 뿐, AI Overviews에 표시될지 여부를 결정하지 않습니다. Googlebot을 차단한다고 해서 AI Overviews에서 제외되는 것이 아니라, 아예 검색 전체에서 제외됩니다.
학습과 검색은 별개의 스위치입니다. OpenAI의 문서가 이를 명확히 설명합니다: 사이트는 GPTBot을 금지하여 콘텐츠가 학습에 사용되지 않도록 하면서도, OAI-SearchBot이 검색 결과에 표시되도록 허용할 수 있습니다.
AI 검색에는 남아있지만 학습에서는 제외되는 robots.txt
만약 이러한 상충 관계(trade-off)를 원한다면 다음과 같이 설정할 수 있습니다:
# 검색 및 사용자 요청 가져오기: 허용
User-agent: OAI-SearchBot
User-agent: ChatGPT-User
...
한 가지 쉬운 실수가 있습니다. 크롤러는 자신의 이름과 일치하는 가장 구체적인 그룹만 따르고 User-agent: *를 완전히 무시합니다. 따라서 모든 사람에게 차단하려는 경로( /api/, /admin/)는 위 예시처럼 모든 명명된 그룹에 반복되어야 합니다. 그렇지 않으면 명명된 봇들이 해당 경로에 접근할 수 있게 됩니다.
학습을 차단할지 여부는 기술적인 문제가 아니라 비즈니스 결정입니다. 일부 회사는 모델이 자사 제품에 대해 정확하게 설명하도록 문서가 학습 데이터에 포함되기를 원합니다. 핵심은 의도적으로 선택하는 것입니다.
읽기보다는 스크립트로 테스트하세요
robots.txt를 눈으로 읽는 것은 위에서 언급된 실수가 코드 검토 과정에서도 살아남게 하는 방식입니다. Python의 표준 라이브러리를 사용하면 이를 구문 분석할 수 있습니다:
# check_robots.py
from urllib.robotparser import RobotFileParser
...
결과는 몇 초 만에 읽을 수 있는 그리드 형태입니다:
/ /blog/ /pricing /api/health /admin/
GPTBot BLOCK BLOCK BLOCK BLOCK BLOCK
OAI-SearchBot allow allow allow BLOCK BLOCK
...
이를 CI(지속적 통합)에 포함하고, 예상되는 그리드를 함께 커밋하여 robots.txt의 변경으로 인해 셀 값이 바뀌면 빌드가 실패하도록 만드세요.
(urllib.robotparser는 원래의 robots.txt 규칙을 따릅니다. 일치하는 첫 번째 규칙을 적용하며, Google은 가장 구체적인 규칙을 적용합니다. 이것이 위에서 Disallow 라인이 Allow: /보다 먼저 오는 이유입니다. 파일은 두 경우 모두 동일하게 읽힙니다. 또한 경로에 대한 *와 $ 와일드카드를 지원하지 않으므로, 파일을 간단하게 유지하거나 와일드카드 규칙을 별도로 테스트하세요.)
그다음, robots.txt가 볼 수 없는 계층을 확인하세요
robots.txt는 요청입니다. 실제로 응답하는 것은 CDN(콘텐츠 전송 네트워크), WAF(웹 방화벽) 또는 봇 관리 설정입니다. 요청은 robots.txt가 참조되기 전에 이미 그곳에서 차단될 수 있습니다. 두 가지를 확인하세요.
1. 서버가 각 사용자 에이전트에게 반환하는 것:
for ua in "OAI-SearchBot/1.4" "Claude-SearchBot" "PerplexityBot" "GPTBot/1.4"; do
code=$(curl -s -o /dev/null -w "%{http_code}" -A "Mozilla/5.0 (compatible; $ua)" https://example.com/blog/)
echo "$ua -> $code"
...
403 오류나 인증 페이지가 나타난다는 것은 robots.txt 외의 다른 무언가가 결정하고 있다는 의미입니다. 이는 사용자 에이전트(user-agent) 헤더를 기반으로 한 규칙만 테스트합니다. 일부 봇 관리 제품은 또한 봇의 IP 범위를 확인하는데, 이를 위조한 curl로는 재현할 수 없습니다. OpenAI가 크롤러의 IP 범위를 공개하므로, 필요하다면 허용 목록(allow-list)에 추가할 수 있습니다.
2. 봇들이 실제로 귀하에게 도달하는지 여부. 접근 로그(access logs)가 진실의 근거입니다:
grep -Eo "OAI-SearchBot|ChatGPT-User|GPTBot|Claude-SearchBot|Claude-User|ClaudeBot|PerplexityBot" access.log \
| sort | uniq -c | sort -rn
만약 허용했던 검색 봇이 절대 나타나지 않거나, 오직 403 오류만 받는다면, 차단은 robots.txt보다 상위 단계(upstream)에서 이루어지고 있는 것입니다.
이것이 하지 않는 것들 (What this doesn't do)
검색 봇을 허용하는 것은 귀하가 인용될 수 있는 자격(eligible)을 갖게 할 뿐입니다. 누군가가 귀하를 인용하게 만드는 것은 아닙니다. 그것은 귀하의 페이지가 사람들이 묻는 질문에 답하고, 요약으로는 대체할 수 없는 구체적인 내용을 담고 있는지 여부에 달려 있습니다. 이것은 설정 문제가 아니라 콘텐츠 문제입니다. 하지만 크롤러가 403 오류를 받는다면 아무리 좋은 콘텐츠라도 도움이 되지 않기 때문에, 먼저 설정을 수정하는 것이 가치가 있습니다.
만약 여기서 어떤 에이전시나 도구에 돈을 지불할 가치가 있는지 알아보고자 한다면, 저희는 GEO 에이전시 선택 가이드를 작성했으며, 회의적인 태도를 가져야 할 주장들도 포함했습니다.
저희는 Ahmedabad에 위치한 소프트웨어 회사인 Redlio Labs이며, B2B 사이트를 위한 SEO 및 AI 검색 작업을 수행합니다. 댓글에 귀하의 robots.txt 구성을 올려주시면 그 안에 특이한 점이 있는지 확인해 보겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기