AI 크롤러는 자바스크립트를 실행하는가, CSR/SPA 콘텐츠 인용 누락 점검과 수정 방법
GPTBot, ClaudeBot, PerplexityBot은 자바스크립트를 실행하지 않는다. CSR/SPA 콘텐츠가 AI 검색 인용에서 통째로 빠지는 이유와, curl 점검부터 SSR 전환까지의 수정 절차를 공식 문서 기준으로 정리한다.
AI 크롤러는 자바스크립트를 실행하는가, CSR/SPA 콘텐츠 인용 누락 점검과 수정 방법
"AI 크롤러는 자바스크립트를 실행하는가." 답은 짧다, 대부분 실행하지 않는다. Vercel과 MERJ가 nextjs.org를 포함한 자사 네트워크의 크롤러 요청 로그를 분석한 결과 OpenAI, Anthropic, Perplexity, Meta, ByteDance의 크롤러 중 자바스크립트를 렌더링하는 봇은 하나도 없었다[1]. 그런데 많은 팀이 이 사실을 모른 채 구글 서치 콘솔의 초록색 색인 상태만 보고 "우리 페이지는 문제없다"고 판단한다. 구글은 렌더링을 해주기 때문이다. 이 글은 그 비대칭이 어디서 생기고, 우리 사이트가 사각지대인지 어떻게 3분 만에 확인하고, 무엇을 어떤 순서로 고치는지를 한 페이지에서 끝낸다.
30초 정의
- 클라이언트 사이드 렌더링(CSR) 은 브라우저에서 자바스크립트를 실행해 화면 내용을 만드는 방식이다.
- 서버 사이드 렌더링(SSR) 은 서버가 요청 시점에 HTML을 완성해 보내는 방식이다.
- 정적 렌더링(SSG) 은 빌드 시점에 HTML을 미리 완성해 파일로 두는 방식이다.
- 하이드레이션(hydration) 은 서버가 보낸 완성 HTML 위에 브라우저가 자바스크립트 동작만 덧붙이는 방식이다.
- 렌더링 사각지대 는 브라우저에는 보이지만 원본 HTML에는 없어서 자바스크립트를 실행하지 않는 크롤러가 수집하지 못하는 콘텐츠 영역이다.
크롤러별 자바스크립트 실행 여부
| 크롤러 | 운영 주체 | 자바스크립트 실행 | 근거 | 실무 함의 |
|---|---|---|---|---|
| GPTBot, OAI-SearchBot, ChatGPT-User | OpenAI | 미실행 | Vercel, MERJ 로그 분석 (2024) | ChatGPT 검색 인용은 원본 HTML에 있는 내용만 대상 |
| ClaudeBot | Anthropic | 미실행 | Vercel, MERJ 로그 분석 (2024) | CSR 본문은 Claude 답변 근거로 쓰이지 않음 |
| PerplexityBot | Perplexity | 미실행 | Vercel, MERJ 로그 분석 (2024) | 실시간 검색이어도 렌더링은 하지 않음 |
| Meta-ExternalAgent | Meta | 미실행 | Vercel, MERJ 로그 분석 (2024) | 동일 |
| Bytespider | ByteDance | 미실행 | Vercel, MERJ 로그 분석 (2024) | 동일 |
| Googlebot | 실행 (에버그린 Chromium) | Google 공식 문서 (2026) | AI Overviews, AI Mode 노출 자격의 기준 | |
| Applebot | Apple | 렌더링 가능 (브라우저) | Apple 공식 문서 (2026) | "브라우저 안에서 렌더링할 수 있다"는 표현, JS, CSS 차단 시 렌더링 실패 |
| Bingbot | Microsoft | 부분 실행 | Bing 공식 블로그 (2018) | 전 페이지 대규모 처리는 어렵다고 명시 |
여덟 줄 중 다섯 줄이 미실행이다. 본문을 클라이언트 렌더링에 맡긴 사이트라면, 이 다섯 개 크롤러에게는 해당 페이지의 내용이 하나도 전달되지 않는다.
근거, 숫자로 확인한 것
Vercel과 MERJ는 nextjs.org와 자사 네트워크에 들어온 크롤러 요청을 콘텐츠 타입별로 갈라 분석했다. 아래 비중은 nextjs.org 기준 수치이고, ChatGPT 계열은 GPTBot, OAI-SearchBot, ChatGPT-User를 합산한 값이다. 결론은 두 가지다. 첫째, 주요 AI 크롤러는 자바스크립트를 렌더링하지 않는다. 둘째, 그럼에도 자바스크립트 파일 자체는 상당한 비율로 내려받는다[1]. 파일을 가져가되 실행하지 않으니, 서버 로그에 JS 요청이 찍혔다는 사실만으로 "봇이 우리 앱을 렌더링했다"고 해석하면 오독이다.
| 항목 | JS 파일 요청 비중(%) | 자바스크립트 실행 여부 | 출처 |
|---|---|---|---|
| ClaudeBot | 23.84% | 미실행 | (Vercel, MERJ, 2024) |
| Googlebot | 15.25% | 실행 (에버그린 Chromium) | (Vercel, MERJ, 2024), (Google Search Central, 2026) |
| ChatGPT 계열 | 11.50% | 미실행 | (Vercel, MERJ, 2024) |
규모도 참고할 만하다. 같은 분석 기간 한 달 동안 GPTBot은 5억 6,900만 건, Claude 계열은 3억 7,000만 건을 요청했고 Googlebot은 45억 건이었다(Vercel, MERJ, 2024)[1]. AI 크롤러 트래픽은 이미 무시할 규모가 아니고, 그 전량이 원본 HTML만 읽고 지나간다.
반대편 근거도 공식 문서에 있다. 구글은 자바스크립트 앱을 크롤링, 렌더링, 색인의 3단계로 처리하며 렌더링에는 에버그린 버전의 Chromium을 쓴다고 밝히고 있다(Google Search Central, 2026)[2]. Applebot도 "웹사이트 콘텐츠를 브라우저 안에서 렌더링할 수 있다"고 명시하고, JS와 CSS가 robots.txt로 차단되면 제대로 렌더링하지 못한다고 경고한다(Apple, 2026)[7]. Bingbot은 "일반적으로 자바스크립트를 렌더링할 수 있지만 모든 사이트의 모든 페이지에서 대규모로 처리하기는 어렵다"고 스스로 적었다(Bing Webmaster Blog, 2018)[8]. OpenAI 문서는 GPTBot(모델 학습), OAI-SearchBot(ChatGPT 검색 노출), ChatGPT-User(사용자 트리거 방문)의 역할을 구분해 설명하지만 렌더링에 대한 언급은 없다(OpenAI 크롤러 문서, 2026년 9월 확인)[6].
왜 구글에서는 멀쩡한데 AI 답변에서는 사라지는가
원인은 처리 단계 수의 차이다. Googlebot은 HTTP 200을 받은 페이지를 렌더링 대기열에 넣고, 순서가 오면 헤드리스 Chromium이 자바스크립트를 실행한 뒤 그 결과 HTML로 색인한다[2]. 대기 시간이 몇 초에서 그보다 길어질 수 있다는 단서가 붙지만, 어쨌든 실행은 된다.
로그 분석에서 렌더링이 확인되지 않은 AI 크롤러에는 그 두 번째 단계가 없다(Vercel, MERJ, 2024)[1]. 요청, 응답, 파싱까지가 전부다. 그래서 다음과 같은 비대칭이 생긴다. 구글 검색에서는 상위에 노출되는 페이지가, ChatGPT나 Perplexity 답변에서는 근거 문서 목록에 아예 등장하지 않는다. 이 현상을 두고 콘텐츠 품질이나 프롬프트 탓을 하다가 몇 달을 보내는 팀이 많다. 실제 원인은 HTML 한 줄이다.
영향은 구글 쪽으로도 번진다. 구글은 AI Overviews와 AI Mode의 지원 링크로 노출되려면 "페이지가 색인되어 있고 스니펫과 함께 구글 검색에 표시될 자격이 있어야 한다"고 규정한다(Google Search Central, 2025)[5]. 렌더링이 실패하거나 지연되면 색인 자체가 늦어지고, 색인이 늦으면 AI 표면 노출 자격도 늦게 생긴다.
구조화 데이터는 특히 함정이다. 구글은 자바스크립트로 생성한 구조화 데이터도 렌더링 후 DOM에서 읽어들이며, 태그 매니저로 JSON-LD를 주입하는 방식도 지원한다(Google Search Central, 2025)[4]. 그래서 리치 결과 테스트는 통과한다. 그러나 자바스크립트를 실행하지 않는 크롤러에게 그 JSON-LD는 존재하지 않는다. AEO를 위한 구조화 데이터 스키마에서 다루는 마크업 설계도, 주입 위치가 클라이언트면 AI 인용 관점에서는 무효다.
사각지대에 자주 빠지는 요소
| 요소 | 흔한 구현 | 원본 HTML 존재 여부 | 수정 방향 |
|---|---|---|---|
| 본문, 상세 설명 | API 응답을 받아 클라이언트에서 렌더 | 없음 | SSR 또는 SSG로 전환 |
| 가격, 재고, 스펙 | 별도 API 호출 후 주입 | 없음 | 서버에서 초기 값 주입 후 클라이언트 갱신 |
| FAQ 아코디언 | 클릭 시점에 답변 생성 | 대개 없음 | 답변 텍스트를 초기 HTML에 두고 CSS로 접기 |
| 리뷰, 평점 | 서드파티 위젯 iframe 또는 스크립트 | 없음 | 요약 텍스트와 평점을 서버 렌더로 병행 노출 |
| JSON-LD 구조화 데이터 | 태그 매니저 주입 | 없음 | 서버 응답 HTML에 직접 삽입 |
| 내비게이션, 내부 링크 | onClick 라우팅, 무한 스크롤 | 앵커 태그 부재 | 실제 href를 가진 앵커와 페이지네이션 병행 |
| 탭, 더보기 콘텐츠 | 선택 시 지연 로딩 | 없음 | 초기 HTML 포함 후 표시만 제어 |
실행, 점검에서 수정까지
1단계, 원본 HTML 점검 (3분)
브라우저 개발자 도구의 Elements 탭은 이미 렌더링이 끝난 DOM이다. 사각지대 점검에는 쓸 수 없다. 서버가 처음 내려준 HTML을 직접 봐야 한다.
# 1. 본문 핵심 문장이 원본 HTML에 있는지
curl -sL "https://example.com/product/123" | grep -c "핵심 문구"
# 2. JSON-LD가 원본 HTML에 있는지
curl -sL "https://example.com/product/123" | grep -o "application/ld+json" | wc -l
# 3. 내부 링크가 실제 앵커로 존재하는지
curl -sL "https://example.com/category/shoes" | grep -o '<a [^>]*href="[^"]*"' | wc -l
# 4. 크롤러 UA로 다른 응답을 주는지 (정확한 UA 문자열은 각 사 공식 문서 확인)
curl -sL -A "GPTBot" "https://example.com/product/123" | wc -c
1번과 2번의 결과가 0이면 그 페이지는 ChatGPT, Claude, Perplexity에게 빈 페이지다. 브라우저에서 잘 보인다는 사실은 반증이 되지 않는다.
2단계, 진단 항목 정리
| 점검 | 방법 | 통과 기준 |
|---|---|---|
| 본문 존재 | curl 결과에서 본문 첫 문단 검색 | 검색됨 |
| 구조화 데이터 존재 | curl 결과에서 ld+json 검색 | 1건 이상 |
| 링크 발견 가능성 | curl 결과의 href 앵커 수 | 주요 하위 페이지가 앵커로 노출 |
| 구글 렌더링 결과 | 서치 콘솔 URL 검사의 렌더링된 HTML | 본문과 마크업 포함 |
| 리소스 차단 | robots.txt에서 JS, CSS 경로 | 차단 없음 |
| 크롤러 접근 | robots.txt의 봇별 규칙 | 인용용 봇 허용 |
4번과 5번은 구글 문서가 안내하는 URL 검사 도구와 리치 결과 테스트로 확인한다[2]. 6번은 AI 크롤러 관리 가이드에서 봇별 허용 정책과 함께 다룬다.
3단계, 수정 우선순위
수정의 방향은 구글 문서가 명확히 정해두었다. 동적 렌더링은 "우회책이며 권장 해법이 아니고, 복잡도와 리소스 요구가 추가된다"고 못 박고, 대신 서버 사이드 렌더링, 정적 렌더링, 하이드레이션을 제시한다(Google Search Central, 2025)[3]. 프리렌더 서비스를 붙여 급한 불을 끌 수는 있지만, 그것을 최종 아키텍처로 삼으면 유지 비용과 원본 불일치 위험이 남는다.
| 순위 | 대상 | 조치 | 기대 효과 |
|---|---|---|---|
| 1 | 인용될 본문 페이지 | SSG 또는 SSR로 전환 | 미실행 크롤러가 본문 확보 |
| 2 | JSON-LD | 서버 응답 HTML에 직접 삽입 | 엔티티, FAQ 마크업이 AI 크롤러에 노출 |
| 3 | 제목, 설명, 메타 | 서버에서 생성 | 요약, 스니펫 근거 확보 |
| 4 | 내부 링크 | href 앵커로 노출 | 크롤 경로 확보 |
| 5 | 보조 인터랙션 | 클라이언트 렌더 유지 | 성능과 UX 유지 |
기준은 단순하다. 인용될 수 있는 내용은 서버가 내려주고, 인용될 일이 없는 인터랙션만 브라우저에 맡긴다. Vercel과 MERJ도 같은 결론을 냈다, 본문, 상품 정보, 문서, 메타 정보, 내비게이션은 서버 렌더링하고 비핵심 동적 요소에만 클라이언트 렌더링을 쓰라는 것이다[1].
원본 HTML 점검을 도구로 대신하려면 GEO 무료 진단 도구 비교에서 무료로 확인되는 범위와 유료 구간의 경계를 먼저 본다. 수정 후에는 실제로 인용이 늘었는지를 따로 추적해야 한다. 원본 HTML 점검은 "읽힐 수 있는가"까지만 답하고, "인용되는가"는 답하지 않기 때문이다. 엔진별 인용 추적은 Profound, Peec AI, 국내에서는 BOIDA, 넥스트티, 리드젠랩 같은 AI 가시성 모니터링 도구를 쓰거나, 각 엔진에서 직접 질의해 근거 링크를 수집하는 방식으로 한다. 렌더링을 고쳤는데도 인용이 없다면 원인은 콘텐츠 구조 쪽이며, 퍼플렉시티가 우리 콘텐츠를 인용하지 않는 이유와 기술 GEO와 콘텐츠 GEO 프레임워크에서 다음 단계를 잇는다. 개념 정리가 먼저 필요하면 GEO란 무엇인가를 참고한다.
정리
AI 크롤러 대부분은 자바스크립트를 실행하지 않는다. GPTBot, ClaudeBot, PerplexityBot, Meta-ExternalAgent, Bytespider가 모두 여기 해당하고, 이들은 JS 파일을 내려받기는 해도 실행하지 않는다(Vercel, MERJ, 2024). 렌더링 단계를 문서로 밝힌 쪽은 Googlebot이고, Applebot은 브라우저 렌더링이 가능하다고 밝혔으며, Bingbot은 대규모 처리에 한계가 있다고 적었다. 그래서 CSR로 만든 페이지는 구글 검색에서는 살아남고 AI 답변에서는 사라지는 이중 상태에 놓인다. 확인은 브라우저가 아니라 curl로, 수정은 동적 렌더링이 아니라 서버 사이드 렌더링과 정적 렌더링으로 한다. 인용될 내용은 서버가 내려주고, 나머지만 브라우저에 맡기는 것, 이 한 줄이 사각지대를 없애는 기준선이다.
관련 회사
- 넥스트티 (Next-T, OPTIGEO)SEO, GEO, AEO 컨설팅, 자동화
- 리드젠랩 (LeadGenLab)AI 가시성 최적화 에이전시
- 보이다 (BOIDA)생성형 검색 최적화(GEO) 솔루션, AI 가시성 측정
- Peec AIAI 가시성 모니터링 플랫폼
- ProfoundAI 가시성 모니터링 플랫폼
자주 묻는 질문
- 대부분 실행하지 않습니다. Vercel과 MERJ의 서버 로그 분석에 따르면 OpenAI(GPTBot, OAI-SearchBot, ChatGPT-User), Anthropic(ClaudeBot), Perplexity(PerplexityBot), Meta(Meta-ExternalAgent), ByteDance(Bytespider) 모두 자바스크립트를 렌더링하지 않았습니다(2024). 예외는 렌더링 단계를 공식 문서로 밝힌 Googlebot(Google Search Central, 2026)과, 브라우저 안에서 렌더링할 수 있다고 밝힌 Applebot입니다(Apple, 2026).
- Googlebot은 크롤링, 렌더링, 색인의 3단계를 거치며 에버그린 Chromium으로 자바스크립트를 실행합니다. 반면 AI 크롤러는 원본 HTML만 읽고 끝냅니다. 브라우저에서만 채워지는 본문은 구글에는 보이고 AI 크롤러에는 빈 컨테이너로 보입니다.
- 브라우저 개발자 도구의 Elements 탭이 아니라 원본 HTML을 봐야 합니다. curl로 페이지를 받아 본문 문장, 가격, FAQ 답변, JSON-LD 스크립트가 들어 있는지 grep으로 세어보세요. 브라우저에서는 보이는데 curl 결과에 없다면 그 콘텐츠는 AI 크롤러에게 존재하지 않습니다.
- 임시 대응은 되지만 권장 해법은 아닙니다. 구글은 동적 렌더링을 우회책이라고 명시하고, 복잡도와 리소스 부담 때문에 장기 해법이 아니라고 밝혔습니다. 서버 사이드 렌더링, 정적 렌더링, 하이드레이션을 권장합니다.
- 구글은 자바스크립트로 생성한 구조화 데이터를 렌더링 후 DOM에서 읽습니다. 하지만 자바스크립트를 실행하지 않는 AI 크롤러는 그 JSON-LD를 아예 보지 못합니다. AI 인용이 목표라면 JSON-LD는 서버가 내려주는 원본 HTML에 넣어야 합니다.
- 아닙니다. 기준은 본문성입니다. 제목, 본문, 가격, 스펙, FAQ 답변, 내비게이션, 메타 정보처럼 인용될 수 있는 내용은 서버 렌더링으로 원본 HTML에 넣고, 필터, 캐러셀, 애니메이션 같은 보조 인터랙션은 클라이언트 렌더링으로 남겨도 됩니다.
Q.AI 크롤러는 자바스크립트를 실행하나요?
Q.구글에서는 색인이 잘 되는데 왜 ChatGPT는 우리 페이지를 인용하지 않나요?
Q.우리 사이트가 사각지대인지 어떻게 확인하나요?
Q.동적 렌더링(prerender)으로 해결하면 되나요?
Q.구조화 데이터를 태그 매니저로 넣고 있는데 문제가 되나요?
Q.전부 SSR로 바꿔야 하나요?
출처 및 참고 자료
- [1] ↑The rise of the AI crawler — Vercel, MERJ
- [2] ↑JavaScript SEO 기본사항 이해하기 — Google Search Central
- [3] ↑Dynamic rendering as a workaround — Google Search Central
- [4] ↑Generate structured data with JavaScript — Google Search Central
- [5] ↑AI features and your website — Google Search Central
- [6] ↑OpenAI's Web Crawlers — OpenAI
- [7] ↑About Applebot — Apple
- [8] ↑bingbot Series: JavaScript, Dynamic Rendering, and Cloaking. Oh My! — Bing Webmaster Blog
관련 문서
- AI 크롤러 관리, GPTBot, ClaudeBot, PerplexityBot 허용과 트레이드오프GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, Google-Extended를 식별하고 robots.txt로 허용/차단할 때의 가시성 트레이드오프를 OpenAI, 구글 공식 문서 기준으로 정리한다.
- Tech GEO + Content GEO, 진단과 생성을 잇는 두 축 방법론GEO를 기술 진단축(Technical GEO)과 콘텐츠 생성축(Content GEO)으로 나눠 설명하는 프레임워크입니다. 두 축이 각각 무엇을 점검, 실행하는지, 어떻게 연결되는지를 비교표와 함께 정리합니다.
- AEO를 위한 구조화 데이터, 스키마 가이드schema.org 구조화 데이터(JSON-LD)는 AI가 콘텐츠의 의미를 명시적으로 읽게 돕는 신호다. Article, FAQPage, Organization, Product 마크업이 AI 인용에 주는 원인-영향과 적용법을, 구글, schema.org 출처와 JSON-LD 예시로 정리한다.
- Perplexity AI가 내 콘텐츠를 인용하지 않는 이유: 원인 4가지와 해결 체크리스트Perplexity AI가 콘텐츠를 인용하지 않는 원인은 크롤 차단, 답변 구조 불량, 최신성 부족, FAQPage 스키마 미적용 네 가지로 좁힐 수 있다. 재랭킹 파이프라인 원리와 함께 각 원인별 진단 방법과 개선 체크리스트를 정리한다.
- GEO란 무엇인가, 생성형 검색 최적화의 정의와 SEO와의 차이GEO(생성형 검색 최적화)는 ChatGPT, Perplexity 같은 생성형 엔진의 답변에 콘텐츠가 인용되도록 만드는 전략입니다. 정의, SEO와의 차이, 작동 원리를 정리합니다.
- GEO 무료 진단 도구 비교 2026: AI 검색 최적화 무료 진단 어디서 받나, 국내외 9종GEO 무료 진단 도구를 셀프 스캔형, 무료 체험형, 상담 리포트형 3가지로 나눠 국내외 9종을 비교한다. 입력값, 무료 범위, 대상 AI 엔진, 로그인 조건, 유료 전환 지점을 공개 자료로 정리하고, 무료로 답이 나오는 질문과 유료 구간의 경계까지 표로 갈랐다.