AI 검색최적화 robots.txt, 이렇게 수정했습니다 — 그리고 댓글 하나로 다시 뒤집혔습니다

새우 · 콘텐츠 / 마케팅 · · 좋아요 0 · 답글 0

연재 사이트의 AI 검색 노출 전략 7/8편

제주에서 스쿠버다이빙 체험과 자격증 교육을 운영하는 지인의 홈페이지를 제가 직접 구축했습니다. Astro로 만들었고 한국어·영어·일본어·중국어 4개 언어를 운영합니다.

목표는 처음부터 명확했습니다. 광고비를 쓰는 대신 AI가 먼저 추천하는 홈페이지를 만드는 것. 요즘 손님들은 네이버보다 ChatGPT에 먼저 물어봅니다. "제주 스쿠버다이빙 어디가 좋아?"라는 질문에 지인의 상호가 나오게 하는 게 설계 목표였습니다.

그런데 아무리 좋은 콘텐츠를 써도 크롤러가 못 들어오면 전부 무효입니다.

그 허가증이 robots.txt입니다. 이미 한 번 작성해서 올려둔 상태였지만 이게 최적인지 확신이 없어서, Claude에 검증을 맡겼습니다.

그리고 이 글을 처음 올린 뒤, 댓글 하나 때문에 확정했던 파일을 40줄에서 3줄로 다시 줄였습니다. 그 과정까지 전부 담았습니다.

라운드 1 — Claude(웹)에서 현재 파일 분석 요청

기존 robots.txt 전문을 그대로 붙여넣고 물었습니다.

아래 robots.txt를 분석해줘. 더 개선해야 하는 거 없어?

# jejuscubadiving.com — AI 검색 가시성 확보 정책
# 리트리벌·검색 봇: 전면 허용 (AI 답변 인용 = 예약 유입 경로)

User-agent: OAI-SearchBot
Allow: /

User-agent: ChatGPT-User
Allow: /

User-agent: Claude-SearchBot
Allow: /

... (봇별로 개별 그룹 10개) ...

User-agent: *
Allow: /

Sitemap: https://jejuscubadiving.com/sitemap-index.xml

가장 뼈아팠던 지적은 이거였습니다.

"robots.txt는 그룹을 상속하지 않습니다."

크롤러는 자기 이름이 적힌 그룹 하나만 읽고 나머지는 전부 무시합니다. 지금은 User-agent: *가 전체 허용이라 문제가 안 보이지만, 나중에 특정 경로를 막겠다고 * 그룹에 Disallow를 추가하면 개별 그룹이 있는 AI 봇 10종은 그 규칙을 전혀 적용받지 않습니다.

이 지적은 나중에 아주 중요한 복선이 됩니다. 일단 넘어가겠습니다.

또 하나. 국내 크롤러가 통째로 빠져 있었습니다. 네이버는 Yeti, 다음은 Daumoa입니다. 제주 로컬 비즈니스인데 이걸 명시하지 않은 건 명백한 누락이었습니다.

라운드 2 — 프레임워크를 밝히자 답이 뒤집혔습니다

라운드 1의 개선안에는 /wp-admin/, admin-ajax.php, /?s= 같은 경로가 잔뜩 들어 있었습니다. 전부 WordPress 전제였습니다. 그래서 정정했습니다.

이 사이트는 Astro 프레임워크로 제작되었어.
https://jejuscubadiving.com/sitemap-index.xml 은 맞아

답이 상당 부분 뒤집혔습니다.

  • 제외할 게 거의 없다. Astro는 정적 빌드라 /wp-admin/ 같은 경로가 존재하지 않습니다

  • /_astro/는 절대 막으면 안 된다. 번들된 CSS/JS가 여기 있어서 차단하면 렌더링 평가에서 손해를 봅니다

  • sitemap-index.xml은 정확하다. @astrojs/sitemap의 기본 출력물이 이 이름입니다

  • Astro는 오히려 GEO에 유리하다. AI 크롤러 대부분은 JavaScript를 실행하지 않는데, Astro는 빌드 시점에 완성된 HTML을 내보내므로 크롤러가 본문 전체를 그대로 받습니다

교훈: 환경 정보를 먼저 주지 않으면 AI는 가장 흔한 케이스(WordPress)를 가정합니다. 이건 AI 잘못이 아니라 제 정보 제공 부족이었습니다.

라운드 3 — 코드베이스로 교차검증

채팅으로 받은 진단을 그대로 실행하지 않고, 코드베이스 전체에 접근할 수 있는 Claude Code에 그 진단을 통째로 넣어 검증시켰습니다.

결과적으로 몇 가지 지적이 걸러졌습니다. 채팅 쪽은 제가 붙여넣은 파일만 보고 판단할 수밖에 없는데, 실제 코드에는 이미 해결된 부분이 있었던 겁니다. 파일 조각만 보고 내린 진단과, 렌더링된 결과물과 소스를 다 본 진단은 다릅니다.

robots.txt 관련 지적은 이 검증을 통과했습니다. 그래서 확정했습니다.

1차 확정본 (40줄)

# jejuscubadiving.com · AI 검색 가시성 확보 정책
# Astro 정적 빌드 / 최종 수정: 2026-08-06
# 정책: 로컬 비즈니스 = 인용 1건이 예약 1건. 검색·실시간·학습 전면 허용.
#
# 주의 1: /_astro/ 는 CSS·JS 번들 경로이므로 절대 차단하지 말 것.
#
# 주의 2: 크롤러는 "가장 구체적으로 일치하는 그룹 하나"만 적용하고 나머지는 무시한다.
#   아래에 이름이 적힌 봇은 User-agent: * 그룹을 절대 읽지 않는다.
#   따라서 나중에 무언가를 차단해야 하면 * 에만 넣어서는 안 되고,
#   차단이 필요한 모든 그룹에 같은 Disallow 를 반복해서 넣어야 한다.
#
# 주의 3: noindex 페이지(/404/, /*/thanks/, /authors/)를 여기서 Disallow 하지 말 것.
#   크롤을 막으면 구글이 noindex 메타를 읽지 못해 URL만 검색결과에 남는다.

# ===== AI 검색·리트리벌 =====
User-agent: OAI-SearchBot
User-agent: ChatGPT-User
User-agent: Claude-SearchBot
User-agent: Claude-User
User-agent: PerplexityBot
User-agent: Perplexity-User
User-agent: DuckAssistBot
Allow: /

# ===== AI 학습 =====
User-agent: GPTBot
User-agent: ClaudeBot
User-agent: CCBot
User-agent: Google-Extended
User-agent: Applebot-Extended
User-agent: meta-externalagent
Allow: /

# ===== 일반 검색엔진 (국내 포털 포함) =====
User-agent: Googlebot
User-agent: Bingbot
User-agent: Applebot
User-agent: Yeti
User-agent: Daumoa
Allow: /

# ===== 기본: 전체 허용 =====
User-agent: *
Disallow:

Sitemap: https://jejuscubadiving.com/sitemap-index.xml

여기까지가 처음 이 글을 올렸을 때의 결론이었습니다.

배운 점 & 꿀팁

1. AI에게 물을 때 환경 정보를 먼저 주세요. "Astro입니다" 한 줄을 라운드 2에서야 말했더니 답이 절반쯤 뒤집혔습니다. 프레임워크, 호스팅, CMS, 언어 구성. 이 네 가지를 첫 질문에 넣으세요.

2. 파일 조각만 보여주면 진단도 조각납니다. 채팅에 파일 하나를 붙여넣으면 AI는 그 파일만 보고 판단합니다. 코드베이스 전체를 볼 수 있는 도구로 한 번 더 검증하세요.

3. 기존 구조를 개선할 때 "이 구조가 필요한가"를 먼저 물으세요. 이게 이번 최대 교훈입니다. 저도 Claude도 처음부터 "개별 나열 구조를 어떻게 개선할까"만 생각했습니다. 봇을 추가하고, 그룹을 통합하고, 주석을 다듬었습니다. 그런데 그 구조 자체가 필요 없었습니다. 물음이 잘못되면 답이 아무리 정교해도 소용없습니다.

4. robots.txt는 보안 수단이 아닙니다. 차단은 WAF와 인증의 몫입니다. Disallow는 착한 봇에게만 통하고, 나쁜 봇에게는 오히려 지도를 그려줍니다.

5. 국내 크롤러를 잊지 마세요. GEO 자료가 대부분 해외 기준이라 Yeti, Daumoa가 빠지기 쉽습니다. 전부 허용이면 *로 커버되지만, 정책을 나눌 때는 반드시 명시해야 합니다.

6. 실시간 요청 봇을 챙기세요. ChatGPT-User, Claude-User, Perplexity-User. 손님이 우리 링크를 AI에 직접 던지는 순간 = 구매 직전입니다.

7. 커뮤니티에 공개하는 것 자체가 검증 단계입니다. Claude 3라운드, Claude Code 교차검증까지 거쳐 "확정"이라고 올린 파일이 댓글 한 줄에 무너졌습니다. AI를 몇 번 돌려도 안 나오던 질문이 사람 한 명에게서 나왔습니다. 체크님께 감사드립니다.

시행착오

  • 첫 질문에 환경 정보를 안 넣어서 WordPress 기준 답변을 받고 라운드 하나를 날렸습니다

  • 불필요한 구조를 정성껏 최적화했습니다. 봇 25개를 분류하고 주석까지 달았는데, 그 구조 자체가 필요 없었습니다

  • 제가 만든 위험을 설명하는 주석을 붙였습니다. 주석 2번이 그것입니다. 경고문이 필요하다는 건 설계가 잘못됐다는 신호였는데 못 알아챘습니다

  • robots.txt로 봇 공격을 막을 수 있다고 막연히 생각했습니다. 그런 기능은 원래 없습니다

도움이 필요한 부분

  • AI 인용 여부 자체를 추적하는 방법이 고민입니다. 클릭이 없어도 답변에 언급되면 브랜드 효과가 있는데 GA로는 안 잡힙니다. 다른 분들은 어떻게 추적하시나요?

  • 학습봇 허용 여부를 어떻게 판단하셨는지 의견 듣고 싶습니다. 저는 노출 우선으로 전부 허용했는데 반대 관점도 궁금합니다

앞으로의 계획

  1. 코스 페이지 구조화 데이터 — 가격·소요시간·최소 연령·포함 내역. AI가 "제주 체험다이빙 얼마야?"에 답할 때 인용할 건더기가 여기서 나옵니다. robots.txt보다 이게 훨씬 중요합니다

  2. 코스 페이지 lastmod 추가 — 단, 빌드 날짜를 자동으로 찍으면 안 됩니다. 매 배포마다 오늘 날짜가 들어가면 구글이 이 사이트의 lastmod 전체를 불신합니다. 실제로 바뀔 때만 사람이 갱신하는 별도 필드로 분리

  3. hreflang 상호 참조 검증 — 각 언어 버전이 서로를 정확히 가리키는지

  4. 월 1회 인용 모니터링 — 한/영/일/중 질문 세트를 매달 동일하게 던져 상호 노출 여부 기록

robots.txt는 30분이면 끝나고 0원인데, 안 하면 그 뒤의 모든 작업이 0점이 되는 파일입니다. 그런데 정작 대부분의 사이트가 한 번도 안 열어봅니다.

그리고 이번에 배운 건, 잘 만드는 것보다 "이게 필요한가"를 먼저 묻는 게 중요하다는 겁니다. 저는 40줄을 정성껏 만들고 나서야 3줄이면 됐다는 걸 알았습니다.

혹시 아직 확인 안 해보셨다면, 지금 새 탭 열고 본인도메인.com/robots.txt 한 번만 확인해 보세요. 30초면 됩니다 🙌

퍼널해커 장원근

태그: #GEO노출전략