AI 크롤러는 자바스크립트를 실행하지 않는다 — 서버 로그 실측
관측일 2026-09-14 · 대상 geocanon.com · 지니어스코리아
요약. 하루 동안 우리 서버에 들어온 AI 크롤러 요청을 전부 로그로 찍어 봤다. 세 가지가 나왔다.
① AI 실시간 페처(ChatGPT-User, Claude-User)는 HTML만 가져간다. 같은 시간에 들어온
Googlebot은 CSS와 JS까지 받아 렌더했다. ② 엔진은 실패 사유를 잘못 보고한다.
ChatGPT-User는 200을 받아갔는데 ChatGPT는 "503이라 못 읽었다"고 답했다.
③ Perplexity는 "직접 열어보라"고 해도 요청 자체를 보내지 않는다.
로그에 단 한 건도 없는데 "접속 실패했다"고 답한다.
1. 어떻게 관측했나
서버(Node.js/Express)에 요청 로거를 붙여, 알려진 AI 봇 User-Agent 18종을 태깅해 모든 요청의 경로·응답 코드·응답 시간·IP를 기록하도록 했다. 로그 형식은 이렇다.
[BOT:<봇이름>] <ISO 시각> <메서드> <경로> <상태코드> <ms> ip=<IP> ua="<User-Agent>"
그 상태에서 각 엔진(로그아웃 웹 화면)에 "이 URL을 지금 직접 열어서 어떤 사이트인지 요약해줘"를 던져 실시간 페처를 유발하고, 엔진의 답변과 서버 로그를 맞춰 봤다. 대상 도메인은 이 사이트(geocanon.com)로, 2026년 9월에 새로 만든 신생 도메인이다.
2. 관측된 원본 로그
07:13:55 [BOT:ClaudeBot] GET /robots.txt 200 5ms ip=216.73.217.84 07:13:55 [BOT:ClaudeBot] GET /sitemap.xml 200 1ms ip=216.73.217.84 07:39:06 [BOT:Claude-User] GET /bot.html 200 1ms ip=34.162.191.81 07:40:51 [BOT:ChatGPT-User] GET / 200 1ms ip=9.129.46.0 07:47:16 [BOT:Claude-User] GET / 200 4ms ip=34.162.191.81 08:38:58 [BOT:Claude-User] GET /about 200 3ms ip=34.162.191.81 08:38:58 [BOT:Claude-User] GET /sitemap.xml 200 2ms ip=34.162.191.81 08:39:01 [BOT:Googlebot] GET /robots.txt 200 1ms ip=66.249.66.194 08:39:02 [BOT:Googlebot] GET / 200 1ms ip=66.249.66.192 08:39:20 [BOT:Googlebot] GET /assets/index-*.css 200 5ms ip=66.249.66.192 08:39:25 [BOT:ChatGPT-User] GET / 200 1ms ip=9.129.46.5 08:39:29 [BOT:Googlebot] GET /assets/index-*.js 200 4ms ip=66.249.66.192 08:39:46 [BOT:Googlebot] GET /assets/index-*.js 200 48ms ip=66.249.66.192
시각은 UTC. 이 창(1시간) 안에 PerplexityBot 및 Perplexity-User 요청은 0건이다.
3. 관측 1 — AI 페처는 HTML만 가져간다
같은 시간대에 두 종류의 봇이 들어왔고, 가져간 것이 명확히 다르다.
| 봇 | HTML | CSS | JS | 해석 |
|---|---|---|---|---|
| Googlebot | ✅ | ✅ | ✅ | 자바스크립트를 실행해 렌더링한다 |
| ChatGPT-User | ✅ | ❌ | ❌ | 받은 HTML 그대로만 읽는다 |
| Claude-User | ✅ | ❌ | ❌ | 받은 HTML 그대로만 읽는다 |
| ClaudeBot | ✅ (robots/sitemap) | ❌ | ❌ | 수집용 크롤러 |
여기가 SEO와 GEO가 갈리는 지점이다. 본문을 자바스크립트로 그리는 사이트는 구글에서는 정상으로 보이지만, AI 페처에게는 빈 페이지다. 구글 순위가 잘 나온다는 사실이 AI 답변에 인용된다는 보장이 되지 않는 이유가 여기 있다.
4. 관측 2 — 엔진은 실패 사유를 잘못 보고한다
이 사이트는 처음에 본문을 전부 자바스크립트로 그리는 구조였다. HTML은 이랬다.
<body> <div id="root"></div> <script type="module" src="/src/main.tsx"></script> </body>
제목과 메타 설명은 있지만 본문은 한 글자도 없다. 이 상태에서 ChatGPT에 물었더니 이렇게 답했다.
"현재 geocanon.com은 제 쪽에서 503 Service Unavailable을 반환해서 페이지 본문을 직접 불러오지는 못했습니다."
그런데 같은 순간의 서버 로그는 [BOT:ChatGPT-User] GET / 200 1ms다.
503은 없었다. 지연도 없었다(1밀리초). 엔진이 받은 것은 200이었고,
실제로 일어난 일은 "200 + 빈 본문"인데, 보고된 사유는 "503"이었다.
그리고 본문을 읽지 못한 ChatGPT는 그 자리를 철자가 같은 다른 것으로 메웠다 — PyPI에 있는 동명의 파이썬 패키지 설명을 가져다 이 사이트를 설명했다. 즉 본문 부재는 "언급되지 않음"이 아니라 "다른 것으로 오인됨"으로 나타난다.
5. 관측 3 — Perplexity는 요청을 보내지 않는다
Perplexity(로그아웃)에 두 번 같은 요청을 했고, 두 번 다 이렇게 답했다.
"페이지에 직접 접속하여 내용을 가져오는 데 실패했습니다. 이 도메인은 현재 접속이 안 되거나, 서버가 응답하지 않거나, 아예 존재하지 않는 사이트일 가능성이 있습니다."
그러나 서버 로그 1시간 전체에 Perplexity 계열 요청이 0건이다. 접속을 시도한 적이 없다.
같은 시각 외부에서 그 주소는 정상으로 열렸고, ChatGPT와 Claude의 페처는 같은 주소에서 200을 받아갔다.
게다가 이 답변에는 질의와 무관한 국토지리정보원(ngii.go)이 출처로 달려 있었다.
해석하면, Perplexity의 로그아웃 웹 화면은 "직접 열어보라"는 지시를 받아도 임의 URL을 가져오지 않고 자기 색인만 조회한다. 신생 도메인이라 색인에 없으면 "접속 실패"라는 사유를 만들어 붙인다.
6. 처치와 그 결과
HTML 본문에 실제 텍스트를 넣는 것 하나만 바꾸고, 같은 질의를 다시 던졌다. 다른 조건은 모두 같다.
| 처치 전 (07:40:51 UTC) | 처치 후 (08:39:25 UTC) | |
|---|---|---|
| 서버 로그 | ChatGPT-User GET / 200 1ms | ChatGPT-User GET / 200 1ms |
| 엔진 자기보고 | "503이라 본문을 불러오지 못했다" | "방금 직접 열어 확인했습니다" |
| 답변 내용 | 동명의 PyPI 파이썬 패키지 설명 | 이 사이트의 실제 내용 (정확) |
| 인용 출처 | PyPI 페이지 | geocanon.com |
봇 요청은 전후가 완전히 동일하다 — 같은 경로, 같은 200, 같은 1밀리초. 바뀐 것은 그 200 안에 텍스트가 있느냐뿐이고, 답변은 통째로 뒤집혔다.
7. 여기서 끌어낼 수 있는 것
- 엔진의 자기보고를 진단 근거로 쓸 수 없다. "못 읽었다", "503이었다", "접속 실패"는 실제로 일어난 일과 다를 수 있다. 두 엔진에서 각각 다른 방식으로 어긋났다. 유일하게 믿을 수 있는 것은 대상 서버의 요청 로그다. 엔진 답변만 보고 "크롤이 막혔다"고 판정하는 진단은 성립하지 않는다.
- 본문이 JS로 그려지면 AI에게는 없는 것이다. Googlebot이 읽는다는 사실은 근거가 되지 않는다. 둘은 다르게 동작한다.
- 본문 부재의 비용은 "누락"이 아니라 "오인"이다. 특히 이름이 겹치는 다른 대상이 인터넷에 있으면 그쪽 설명으로 채워진다.
- 크롤이 되는 것과 선택되는 것은 다른 문제다. 위 처치로 브랜드명 질의는 정확해졌지만, 같은 날 "국내에서 쓸 수 있는 GEO 진단 도구 추천해줘"라는 카테고리 질의에서는 여전히 한 번도 언급되지 않았다. 그 질의에서 엔진이 인용한 것은 도구 제작사 홈페이지가 아니라 도구들을 비교한 문서였다.
8. 한계
- 단일 도메인, 하루치 관측이다. 일반화하려면 더 많은 도메인과 기간이 필요하다.
- 대상이 신생 도메인(2026년 9월 개설)이다. 색인에 축적된 이력이 있는 도메인에서는 특히 Perplexity의 동작이 다를 수 있다.
- 엔진은 모두 로그아웃 웹 화면으로 측정했다. 로그인 상태나 벤더 API로는 결과가 다를 수 있다.
- User-Agent는 위조 가능하므로, 로그의 봇 식별은 IP 대역 검증까지 하지 않은 1차 식별이다.