터미널에 딱 한 줄 쳐봤어요. Claude 크롤러인 척 제 사이트에 들어가 본 거예요.
curl -A "ClaudeBot" https://coldsurf.io/ → 403
curl -A "PerplexityBot" https://coldsurf.io/ → 403
403이면 차단이에요. robots.txt엔 분명 "이 봇들 허용"이라고 적어놨는데도요. Claude한테 "우리 글 인용해도 돼요" 하고 문을 열어둔 줄 알았는데, 실은 잠겨 있었던 거죠. 내 사이트도 지금 이럴 수 있어요.
이 글은 검색이 아니라 인용을 노리는 AEO(Answer Engine Optimization) 이야기예요. 거창한 개념 설명 말고, 제가 뭘 열고 뭘 닫았는지 그대로 적을게요.
AEO가 뭐예요? — SEO는 클릭, AEO는 인용이에요
AEO는 ChatGPT·Claude·Perplexity·구글 AI Overviews 같은 AI 답변이 내 글을 출처로 가져다 쓰게 만드는 일이에요. SEO는 "검색에서 눌러서 내 사이트로 오게 하는" 게임이었죠. AEO는 그 클릭이 아예 없다고 보고 시작해요.
누가 AI한테 "이번 주 서울 인디 공연 뭐 있어?"라고 물으면, AI가 답을 그냥 말로 해줘요. 그 답에 누구 글이 인용되고 누가 출처로 붙느냐, 그게 핵심이에요. 검색 1페이지가 아니라 답변 문장 안에 내 이름이 남는 거예요.
왜 지금 중요해요? — 눌러서 안 오는 시대라서요
이제 사람들이 검색창보다 대화창에 물어보거든요. 그 대화창 답은 어딘가의 글을 요약하고 인용해서 만들어져요. 내 글이 그 재료가 안 되면, 아무리 잘 써도 그 대화 안에선 없는 거나 마찬가지예요.
작은 사이트한테는 오히려 기회예요. 검색 순위 싸움은 큰 사이트한테 밀리지만, "이걸 누가 먼저 제대로 정리했나"는 아직 자리가 비어 있거든요.
Allow라고 적었는데 왜 막혔을까요? — 부탁과 강제는 다르거든요
robots.txt는 그냥 부탁이에요. 진짜 차단은 그 앞단에서 따로 일어나요. 저는 Cloudflare를 쓰는데, 예전에 켜둔 "AI 봇 차단" 스위치가 문 앞에서 ClaudeBot이랑 PerplexityBot을 403으로 돌려보내고 있었어요. robots.txt에 아무리 Allow라고 적어도, 봇이 그 파일을 읽기도 전에 쫓겨나고 있던 거죠.
여기서 하나 배웠어요. AEO는 코드만으로 안 끝나요. 봇을 열고 막는 설정은 호스팅이나 CDN 대시보드에서 따로 확인해야 해요. 확인하는 법은 어렵지 않아요. 봇인 척 들어가서 200이 오는지 403이 오는지 눈으로 보면 끝이에요. 봇 여러 개를 한 번에 보려면 이렇게요.
for ua in ClaudeBot PerplexityBot OAI-SearchBot GPTBot; do
curl -s -o /dev/null -w "%{http_code} $ua\n" -A "$ua" https://coldsurf.io/
done
인용하러 오는 봇은 200, 학습하러 오는 봇은 403. 이렇게 나오면 내 선택대로 된 거예요.
뭘 열고 뭘 닫아요? — 인용하러 오는 봇은 열고, 학습하러 오는 봇은 닫아요
AI 봇을 두 종류로 나누면 쉬워요. 답변할 때 실시간으로 읽어가는 봇(OAI-SearchBot·PerplexityBot·ClaudeBot)은 열고, 모델 학습용으로 긁어가는 봇(GPTBot·CCBot·Google-Extended)은 닫는 거예요. robots.txt로 옮기면 딱 이래요.
# 인용하러 오는 봇 — 열기
User-agent: OAI-SearchBot
User-agent: PerplexityBot
User-agent: ClaudeBot
Allow: /
# 학습하러 오는 봇 — 닫기
User-agent: GPTBot
User-agent: CCBot
User-agent: Google-Extended
Disallow: /
이유는 간단해요. 인용은 받되, 학습 데이터로 글을 공짜로 내주진 않겠다는 거예요. 인용은 내 이름이 남지만, 학습은 이름 없이 그냥 쓰이고 마니까요. 물론 정답이 하나는 아니에요. "학습 데이터에 실려서 오래 기억되는 것도 이득"이라고 보면 학습 봇도 열 수 있어요. 중요한 건 어느 쪽이든 직접 골라야 한다는 거예요. 그리고 대시보드 설정이 그 선택대로 됐는지 curl로 꼭 확인하고요.
AI한테 사이트를 어떻게 안내해요? — llms.txt를 하나 두세요
사이트 맨 위에 /llms.txt 파일 하나만 두면 돼요. AI용 목차 같은 거예요. sitemap.xml이 크롤러한테 URL 목록을 주는 것처럼, llms.txt는 "이 사이트가 뭐고, 인용할 만한 자료가 어디 있는지"를 마크다운으로 한 장에 정리해줘요. 제 사이트 llms.txt는 이렇게 생겼어요.
# Paul Rockstar — A COLDSURF Labs publication
> 편집자가 작품 하나를 골라 발견의 자리를 만드는 큐레이션 매체.
## Reviews — COLDSURF Pick
- [Electioneering — Radiohead](https://coldsurf.io/reviews/tracks/radiohead-electioneering): Alternative Rock / Art Rock · 1997
- [LUX — Rosalía](https://coldsurf.io/reviews/albums/rosalia-lux): Art Pop / Avant-Pop · 2025
## Magazine
- [Engineering](https://coldsurf.io/b-side/dev): 비즈니스 수단으로서의 엔지니어링. 그리고 라이브 음악 산업.
저는 이걸 손으로 안 만들고 자동으로 뽑게 했어요. 이미 있는 글이랑 목록에서 빌드할 때 llms.txt가 알아서 만들어지게요. 글이 늘면 다음 빌드에 저절로 반영되고, 새로 챙길 파일은 하나도 안 늘어요. AEO 하다 보면 이 원칙이 계속 나와요. 새 관리거리를 만들지 말고, 이미 있는 걸로 만들라는 거예요.
사실을 기계가 읽게 하려면요? — 구조화 데이터를 넣어요
글에 담긴 사실을 JSON-LD(Schema.org)로 같이 넣어주면, AI가 "무슨 글이고 어떤 사실이 있는지"를 안 헷갈리고 가져가요. 페이지 종류마다 맞는 걸 써요. 리뷰 글엔 Review(뭘 평가했고 평가가 뭔지), 설명 페이지엔 FAQPage(질문-답 묶음), 일반 글엔 Article, 공연엔 MusicEvent(언제·어디서·누가)예요. 특히 리뷰엔 Review가 잘 맞아요. "누가 이걸 리뷰했고 결론이 뭐냐"는 AI가 답할 때 딱 찾는 정보거든요. FAQPage는 이런 모양이고요.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"url": "https://coldsurf.io/reviews/methodology",
"mainEntity": [
{
"@type": "Question",
"name": "COLDSURF Pick이 뭔가요?",
"acceptedAnswer": {
"@type": "Answer",
"text": "아직 발견되지 못한 작품에 편집자가 위상을 부여하는 라벨이에요."
}
}
]
}
함정이 하나 있어요. FAQ 데이터를 본문이랑 똑같은 뻔한 질문으로 잔뜩 채우면 오히려 손해예요. 구글이 그런 걸 안 좋아하거든요. 그래서 저는 진짜 답이 있는 질문만 넣고, 없으면 아예 뺐어요. 공연 페이지에선 이렇게 했어요. 예매처 데이터가 있는 공연에만 예매 질문을 넣고, 없으면 그 질문을 통째로 빼는 거죠.
// 예매처가 있는 공연에만 예매 질문을 넣어요. 없으면 아예 뺌.
const sellers = [...new Set(event.tickets.map((t) => t.sellerName))]
if (sellers.length > 0) {
items.push({
q: `${event.title} 티켓은 어디서 예매하나요?`,
a: `${sellers.join(', ')}에서 예매할 수 있어요.`,
})
}
구조화 데이터는 본문에 있는 사실을 기계어로 한 번 더 말해주는 거지, 없는 걸 지어내는 자리가 아니에요.
글은 어떻게 써요? — 문단 하나만 떼어내도 말이 되게요
AI는 글 전체가 아니라 문단 하나를 콕 집어서 인용해요. 그래서 잘 쓰는 게 곧 AEO예요. 규칙은 네 개예요.
- 제목은 질문으로. 소제목을 "배경", "서론"이 아니라 사람들이 진짜 궁금해하는 질문으로 달아요. 지금 이 글 소제목들처럼요.
- 결론 먼저. 문단 첫 문장에 결론을 둬요. 한참 뜸 들이다 마지막에 결론이 나오면 인용이 안 돼요.
- 문단 하나로 완결. 앞 문단 없이 떼어내도 그 문단만으로 말이 되게 써요. "이건", "그래서 그 사람은"처럼 바깥을 가리키는 말로 시작하지 않아요.
- 누가·언제·어디서. 날짜랑 이름이랑 출처를 흐리지 않아요. AI는 날짜 붙은 원본 정보를 더 믿거든요.
눈치챘을 수도 있는데, 이 글이 딱 그 규칙대로 쓰였어요. AEO 글을 AEO 규칙으로 쓰는 게 제일 정직하잖아요.
효과는 언제 느껴요? — 며칠에서 몇 주요. Perplexity가 제일 빨라요
인용은 바로 안 생겨요. 순서가 있어요. 봇 열기 → 검색 색인 → 답변 인용이에요. 배포하자마자 llms.txt랑 봇 접근이 열렸는지는 curl로 몇 분 안에 보고, 검색 색인은 며칠, 진짜 답변에 인용되는 건 며칠에서 몇 주 걸려요.
빠른 순서는 Perplexity(실시간으로 읽어감) → ChatGPT 검색 → Claude → 구글 AI Overviews예요. 그래서 Perplexity에서 제일 먼저 느껴져요. 내 사이트 이름이 들어간 질문부터 뜨고, 일반적인 질문은 사이트가 좀 쌓인 다음에 붙어요.
AEO는 꼼수가 아니에요
AEO는 검색 엔진 속이는 잔재주가 아니에요. 내가 쌓아온 신뢰를 기계도 읽을 수 있게 정리하는 일이에요. 봇한테 문 열어주고, 목차 주고, 사실 정리해주고, 문단 하나로도 말이 되게 쓰는 것. 네 개 다 결국 "이 사이트는 믿고 인용해도 돼요"를 기계한테 보여주는 방법이에요.
그러니까 순서는 이래요. 좋은 걸 먼저 쌓으세요. 그다음에 그게 기계 눈에도 보이게 하고요. 문이 잠겨 있진 않은지, curl 한 줄부터 쳐보세요.

