M2 GEO Proxy
fetch + Chrome 동시 분석
Pre-render 캐시 현황
캐시 없음
브라우저 시점 엔진:
URL을 입력하고 분석을 시작하세요
GEO 개선 효과가 여기 표시됩니다
원본 LLM 봇 시점 · fetch
GPTBot · ClaudeBot이 보는 원본 화면
GEO 적용 GEO 주입된 HTML 미리보기
GEO 태그 주입 후 미리보기
URL 수집
0개 URL
배치 실행
캐시 현황
페이지점수GEO 적용 후TTL 잔여
캐시 없음
GEO 슬라이스 — LLM 전용 최적화 문서
Chrome으로 JS 렌더링 후 노이즈를 제거하고, 상품·콘텐츠 정보를 추출해 LLM이 읽기 최적화된 단일 문서로 재조합합니다.
LLM 전용
URL을 입력하고 슬라이스를 시작하세요
🤖GEO란 무엇인가 — 왜 지금 필요한가

GEO(Generative Engine Optimization)는 ChatGPT·Perplexity·Claude 같은 AI 답변 엔진이 페이지를 올바르게 읽고 답변에 인용할 수 있도록 최적화하는 작업입니다. 기존 SEO가 구글 검색 순위를 위한 것이라면, GEO는 AI 답변 속 인용 출처가 되기 위한 최적화입니다.

패러다임 전환

SEO (검색엔진 최적화)GEO (AI 인용 최적화)
목표구글 상위 노출AI 답변 인용 출처 선점
크롤러Googlebot (렌더링 가능)GPTBot·ClaudeBot (렌더링 불가)
클릭검색결과 클릭 → 방문Zero-click, AI가 답변 생성
핵심 신호백링크, 키워드 밀도JSON-LD 구조화 데이터, 정보 밀도
SPA 영향Googlebot이 JS 실행 가능LLM 크롤러는 JS 미실행 → 빈 페이지

LLM 크롤러의 3가지 핵심 특성

특성내용시사점
Zero-clickAI가 즉각 답변 생성 → 사용자가 출처 방문 안 함클릭 0이지만 브랜드 노출 존재 → 인용 선점이 중요
서버사이드 fetchHTTP로 정적 HTML만 수신, JS 미실행React/Next.js SPA는 AI에게 빈 페이지로 보임
빠른 크롤 주기Googlebot: 수주 간격 / AI 크롤러: 수일~수시간JSON-LD 없는 상품페이지는 외부 블로그에 인용 선점 당함
브라우저: HTML → 파싱 → 렌더링 → 시각적 출력
LLM: HTML → 텍스트 추출 → 의미 파악 → 답변 생성

따라서 분기 방향은 "Human용 렌더링 HTML vs LLM용 정보 밀도 높은 HTML"입니다. 모바일 대응 시대에 UA를 보고 m.site.com을 서빙했던 것과 구조가 동일합니다.

🗺️GEO 도입 4단계 흐름
1단계 · 진단 URL → GEO Score 산출 → 이슈 목록 확인
  GEO Score < 45: 긴급 | 45~69: 개선 필요 | 70+: 유지·강화

2단계 · 주입 JSON-LD 추가 / meta 보완 / canonical 고정 / alt 텍스트
  원본에 없는 정보는 생성하지 않음 — 기존 정보 구조화만

3단계 · 슬라이스 SPA 페이지 대상 Chrome 렌더 → 노이즈 제거 → LLM 전용 문서
  JS 실행 없이는 빈 페이지인 React/Next.js CSR 사이트에 필수

4단계 · Pre-render sitemap 기반 배치 → 캐시 → LLM 크롤러에 즉시 서빙
  야간 배치 + TTL 관리로 실시간 부하 없이 전체 사이트 커버

단계별 커버리지 vs 비용

단계대상난이도효과
1 진단모든 URL낮음현황 파악
2 주입SSR/정적 페이지낮음즉시 score 상승
3 슬라이스SPA/CSR 페이지중간LLM 인식 가능하게
4 Pre-render사이트 전체높음운영 자동화·서빙 속도
📊GEO Score 구조 — 100점 체계

총 100점을 5개 차원으로 나눠 측정합니다. AI 크롤러가 각 정보를 얼마나 잘 읽을 수 있는지를 반영합니다.

차원만점측정 항목
구조화 데이터25점Product / Organization / FAQPage JSON-LD 유무
메타 태그20점title, meta description(길이 포함), canonical, OG 태그
정보 구조25점H1~H3 계층 구조, robots.txt 허용 여부, noindex 유무
접근성15점canonical, 이미지 alt 텍스트 커버리지
콘텐츠15점본문 텍스트 길이(스크립트 제외), H2/H3 개수

AI 인용 가능성 판정

점수판정의미
70점 이상높음AI 답변에 인용될 가능성 높음
45~69점보통일부 조건 충족, 경쟁 페이지에 밀릴 수 있음
44점 이하낮음AI가 출처로 인식하기 어려운 상태
💉GEO 주입 항목 — 무엇을 어떻게 추가하나
주입 항목효과데이터 출처
Organization JSON-LD브랜드 공식 출처 신호 +8점도메인, 페이지 타이틀
Product JSON-LD상품 구조화 데이터 +10점H1, meta, 가격 정규식
FAQPage JSON-LDAI 답변 선점용 +7점상품명·description 기반 생성
canonical 태그인용 출처 URL 고정 +4점현재 URL
OG 태그 보완소셜/AI 공유 신호 +6점기존 메타에서 추출
meta description 확장80자 이상으로 보강 +5점H1 + 첫 문단
이미지 alt 텍스트이미지 내 정보 AI 접근 +1점파일명 파싱

원칙: 페이지에 이미 있는 정보만 구조화합니다. 존재하지 않는 가격·브랜드명·설명을 만들어내지 않습니다.

🏗️실제 배포 아키텍처 — 6가지 옵션
옵션인프라설치 난이도지연적합 대상
AM2 리버스 프록시 (직접 서버)중간~50ms자체 서버 보유 고객사
BCloudflare Worker + KV낮음<10msCloudflare 이미 사용 중인 고객사
CAWS Lambda@Edge + S3중간~5msAWS 스택 고객사
DM2 Edge CDN (M2 관리형)최저<10ms인프라 없는 고객사 (SaaS형)
ENginx/OpenResty 플러그인높음~1ms온프레미스 서버 환경
FNext.js Middleware (자사 앱)낮음~0msNext.js로 운영 중인 고객사

Option A — M2 리버스 프록시 직접 삽입

LLM 크롤러 기존 CDN/LB M2 서버 (UA 판별)
                                           ├→ LLM → Pre-render 캐시 or 실시간 GEO HTML
                                           └→ Human → Origin pass-through

고객사 서버에 M2 프록시를 한 홉 추가. CDN 종류 무관. 가장 범용적.

Option B — Cloudflare Worker + KV 권장 (Cloudflare 사용 시)

LLM 크롤러 Cloudflare Edge (M2 Worker)
             ├→ GPTBot · ClaudeBot → KV에서 GEO HTML 즉시 반환 (Origin hit 없음)
             └→ Human → Origin 그대로 통과

Origin 무변경. Worker JS ~5KB, KV 읽기 지연 <1ms. 고객사 DNS를 Cloudflare로 위임 필요.

// Cloudflare Worker 핵심 로직
addEventListener('fetch', event => {
  const ua = event.request.headers.get('User-Agent') || ''
  if (isLlmBot(ua)) {
    event.respondWith(serveGeoHtml(event.request))  // KV 조회
  }
})

Option C — AWS Lambda@Edge + S3

LLM 크롤러 AWS CloudFront Lambda@Edge (M2 함수)
                                          ├→ LLM → S3에서 GEO HTML 반환
                                          └→ Human → Origin 통과

AWS 인프라 고객사 최적. CloudFront Viewer-Request 트리거에 Lambda 연결. GEO HTML은 M2 배치가 S3 버킷에 저장.

구성 요소역할비용 기준
CloudFrontCDN·엣지 라우팅요청수 기반 (1M건 $0.01)
Lambda@EdgeUA 판별 + S3 조회실행시간 기반 (1M건 $0.60)
S3GEO HTML 정적 저장저장용량 기반 (1GB $0.023/월)
M2 배치 서버GEO HTML 생성 → S3 업로드M2 구독료

Option D — M2 Edge CDN (M2 관리형 SaaS) 인프라 없는 고객사

LLM 크롤러 M2 Edge CDN (글로벌 PoP)
             ├→ LLM → M2 CDN에서 GEO HTML 즉시 반환
             └→ Human → 고객사 Origin 그대로 통과

고객사는 DNS CNAME 한 줄만 변경. M2가 CDN·배치·캐시·모니터링 전부 관리. 설치 부담 최소. SaaS 모델의 궁극 구조.

고객사 작업내용
DNS 변경www CNAME geo.m2.ai — M2 엣지로 라우팅
sitemap 등록M2 대시보드에 sitemap.xml URL 입력
완료M2가 배치·서빙·갱신 자동 처리

Option E — Nginx / OpenResty 플러그인

LLM 크롤러 Nginx (M2 lua 플러그인)
             ├→ LLM → Redis 캐시에서 GEO HTML
             └→ Human → upstream 그대로

온프레미스 서버 또는 IDC 환경. OpenResty Lua 모듈로 UA 판별 + Redis 캐시 조회. 외부 네트워크 의존 없음.

Option F — Next.js Middleware (코드 삽입형)

LLM 크롤러 Next.js Edge Middleware
             ├→ LLM → rewrite to /api/geo?url=…
             └→ Human → 일반 페이지 렌더링
// middleware.ts
export function middleware(req: NextRequest) {
  if (isLlmBot(req.headers.get('user-agent'))) {
    return NextResponse.rewrite(`/api/geo?url=${req.url}`)
  }
}

고객사 Next.js 앱에 파일 2개 추가로 완료. Vercel / Netlify Edge에서도 동작.

주요 LLM 크롤러 User-Agent 목록

크롤러User-Agent운영사용도
● GPTBotGPTBot/1.0OpenAIChatGPT 학습·검색 인덱싱
● ChatGPT-UserChatGPT-UserOpenAIChatGPT 실시간 Browse
OAI-SearchBotOAI-SearchBotOpenAIChatGPT Search
● ClaudeBotClaudeBot/0.1AnthropicClaude AI 크롤링
● PerplexityBotPerplexityBot/1.0PerplexityPerplexity AI 검색
Google-ExtendedGoogle-ExtendedGoogleGemini 학습 제어
Bingbotbingbot/2.0MicrosoftCopilot 인덱싱
Meta-ExternalAgentMeta-ExternalAgent/1.1MetaMeta AI
Applebot-ExtendedApplebot-Extended/0.1AppleApple Intelligence
BytespiderBytespiderByteDanceTikTok AI
CCBotCCBot/2.0Common CrawlGPT·LLaMA 학습 데이터셋
🛡️Akamai Bot Manager — 탐지 원리

Akamai Bot Manager는 네트워크 레이어부터 애플리케이션 레이어까지 5개 계층 신호를 동시에 조합해 봇 여부를 판정합니다. 단일 신호가 아닌 앙상블 방식이기 때문에 하나를 우회해도 나머지 신호로 잡힙니다.

5계층 탐지 구조

계층신호봇 특징우회 가능?
1. IP 평판ASN, 데이터센터 IP 여부, 과거 봇 활동 이력AWS·GCP·Azure IP → 즉시 의심거의 불가 (비용↑)
2. TLS 지문JA3/JA4 해시 — 암호화 스위트 순서, 확장 목록, 타원 곡선Node.js·Bun·curl은 Chrome과 다른 JA3 생성매우 어려움
3. HTTP/2 지문SETTINGS 프레임 값, HEADERS 프레임 우선순위, WINDOW_UPDATE 패턴라이브러리마다 다른 초기값어려움
4. JS 행동 분석Canvas 지문, WebGL 렌더링, navigator 속성, 마우스·스크롤 패턴headless = 마우스 없음, Canvas 값 일관stealth plugin으로 부분 가능
5. _abck 쿠키JS가 수집한 행동 데이터를 암호화해 쿠키에 저장, 서버가 복호화 검증봇은 쿠키를 만들거나 갱신하지 못함불가 (암호화 키 없음)

_abck 쿠키 메커니즘

Akamai의 핵심 메커니즘입니다. 단순 TLS/헤더 우회로 뚫리지 않는 이유가 여기 있습니다.

1. 첫 요청 → Akamai가 봇 감지 JS 스크립트 삽입
2. 브라우저가 JS 실행:
  - 마우스 이동 / 키 입력 타이밍 수집
  - Canvas fingerprint (GPU 고유 렌더링값)
  - 화면 해상도, 배터리, 센서 정보
  - 수집 데이터를 Akamai 서버로 전송
3. Akamai → 유효한 _abck 쿠키 발급
4. 이후 모든 요청에 _abck 포함 → Akamai가 복호화 검증
5. 유효한 _abck 없으면 → HTTP 429 / 403 반환

stealth plugin이 실패하는 이유

puppeteer-extra-plugin-stealth는 JS 레이어(계층 4)만 패치합니다. navigator.webdriver를 숨기고, Canvas 값을 변조하더라도:

계층stealth 처리?결과
IP 평판 (계층 1)❌ 불가로컬 Mac ISP IP면 통과 가능, 서버 IP는 차단
TLS 지문 (계층 2)❌ 불가 (OS 네트워크 스택)puppeteer의 Chromium TLS ≠ 실제 Chrome TLS
HTTP/2 지문 (계층 3)❌ 불가프레임 패턴 여전히 headless 특징
JS 행동 분석 (계층 4)✅ 부분 패치navigator.webdriver 숨김, Canvas 변조 가능
_abck 쿠키 (계층 5)❌ 불가 (암호화 키 없음)유효한 쿠키 생성 불가

결과: 계층 1~3 중 하나라도 걸리면 차단. SSG.com이 로컬 Mac에서도 429를 반환하는 것은 Akamai의 앙상블 판정이 여러 신호를 조합하기 때문입니다.

☁️Cloudflare Bot Management — 탐지 원리

Bot Score 시스템

Cloudflare는 모든 요청에 1~99 Bot Score를 부여합니다. 점수가 낮을수록 봇 가능성이 높습니다. 50개 이상의 신호를 종합해 ML로 판단합니다.

신호Chrome 브라우저서버사이드 fetch우회 가능?
TLS fingerprint (JA3)Chrome 고유값Node/Bun 고유값어려움
IP ASNISP (SKT, KT 등)AWS·클라우드 IP거의 불가
HTTP/2 프레임 패턴Chrome 특유 패턴라이브러리 패턴어려움
헤더 순서·대소문자Chrome 방식다름부분 가능
JS Challenge자동 실행·통과실행 불가불가

JS Challenge 동작 원리

1. Cloudflare → 챌린지 JS 페이지 반환 (cf-mitigated: challenge)
2. 챌린지 JS 수행:
  - Canvas fingerprint (GPU 렌더링 고유값)
  - WebGL 정보 수집
  - Proof-of-work: 특정 해시 만족하는 nonce 연산
3. 연산 완료 → cf_clearance 쿠키 발급 → 페이지 리로드
4. Cloudflare 통과 → 실제 HTML 반환

서버사이드 fetch는 2단계에서 막힙니다. UA를 Chrome으로 바꿔도 TLS 지문·IP·JS 실행 능력이 다르기 때문에 우회되지 않습니다.

🔬TLS 지문(JA3/JA4) 심화

TLS 지문은 클라이언트가 서버에 보내는 ClientHello 메시지의 특정 필드를 해시한 값입니다. 애플리케이션 레이어(HTTP)가 아닌 네트워크 레이어에서 이루어지므로 User-Agent 변경으로 우회할 수 없습니다.

JA3 해시 구성 요소

필드설명Chrome 특징
TLS 버전지원하는 TLS 최대 버전TLS 1.3 우선
암호화 스위트지원 알고리즘 목록 (순서 포함)Chrome 고유 순서 존재
확장 목록SNI, ALPN, session ticket 등Chrome 특유 확장 세트
타원 곡선ECC 키 교환용 곡선 목록x25519 우선 배치
포인트 형식ECC 포인트 압축 방식uncompressed 우선
JA3 = MD5( TLS버전 + 암호화스위트 + 확장목록 + 타원곡선 + 포인트형식 )

Chrome 125: 8a2b5...f3c
Node.js 20: dc2b5...a11 ← 즉시 식별
Bun 1.x: 7e1a3...b29 ← 즉시 식별

JA4는 JA3의 후속으로 더 많은 필드를 포함하며 역방향 조회(JA4+)도 가능합니다. Akamai와 Cloudflare 모두 JA3/JA4를 실시간 DB와 대조합니다.

우회 방법 현실

방법효과난이도
cycletls 라이브러리Chrome JA3 에뮬레이션 가능높음 (Go 기반, Node 바인딩 불안정)
Residential Proxy실제 사용자 IP + TLS → 근본 해결비용 발생 ($100~500+/월)
헤드리스 크롬 (실제)TLS는 실제 Chrome과 동일Akamai _abck는 여전히 이슈
왜 LLM 크롤러는 통과하는가

Akamai·Cloudflare 모두 "알려진 좋은 봇(Known Good Bot)" 화이트리스트를 관리합니다. GPTBot·ClaudeBot 등이 차단되지 않는 이유는 UA 때문이 아니라 IP 화이트리스트 때문입니다.

LLM 크롤러 등록 절차:
1. OpenAI·Anthropic 등이 Akamai/Cloudflare에 IP 범위(CIDR) 사전 신고
2. 해당 ASN/IP → Bot Manager에서 "Verified Bot"으로 분류
3. TLS 지문·_abck 검사 생략 → 원본 HTML 반환

→ 같은 UA로 다른 IP에서 요청하면 동일하게 차단됨

Akamai의 좋은 봇 분류

분류예시처리 방식
Verified Bot (AI)GPTBot, ClaudeBot, PerplexityBot화이트리스트 → 통과
Verified Bot (검색)Googlebot, Bingbot화이트리스트 → 통과
Unknown BotUA만 바꾼 스크레이퍼TLS+IP+JS 종합 판정
Malicious Bot알려진 악성 도구즉시 차단

따라서 LLM 크롤러가 보는 데이터 = JS 실행 없는 SSR HTML이 맞습니다. GEO 최적화의 실질 대상은 JS 렌더링 결과가 아닌 정적 HTML입니다.

🚫이 프록시의 현실적 한계 및 대안
대상 사이트 유형fetch 엔진Chrome 엔진근본 해결책
자사 사이트 (일반)✅ 완전 작동✅ 완전 작동
Cloudflare JS Challenge 없는 사이트✅ 작동✅ 작동
Cloudflare JS Challenge 있는 사이트❌ cf-mitigated: challenge✅ 자동 처리Chrome 모드
Akamai Bot Manager (SSG, 쿠팡 등)❌ 429❌ 429 (_abck 없음)Residential Proxy

Akamai 대응 실질 방법

방법설명비용
Residential ProxyBright Data, Oxylabs — 실제 가정 IP로 요청$100~500+/월
Scraping SaaSZyte, ScrapingBee — Akamai 우회 포함건당 과금
공식 데이터 피드사이트 제휴·파트너 API계약 필요
허용된 LLM 봇 UA 신청Akamai에 자사 크롤러 사전 등록기업 계약 필요

핵심 결론: 이 프로토타입은 자사 도메인 또는 파트너사 사이트 GEO 최적화 도구입니다. Akamai 보호 경쟁사 사이트 스크래핑은 코드 레벨 문제가 아닌 인프라·계약 문제입니다.

AEO · GEO 전략 개요

서비스 구조 구분

GEO 서비스는 크게 두 단계로 나뉜다.

전단계 — LLM 인지
LLM이 우리 사이트를 어떻게 인식하는가
어느 쿼리에서 노출되나, 경쟁사 대비 AI 가시성, 어떤 콘텐츠가 LLM에 영향을 주나
→ 마케팅 영역 · 노하우 부재
후단계 — 트래픽 처리
AI에서 유입된 트래픽을 어떻게 처리하는가
GEO 주입, LLM 전용 구조화 문서, Edge CDN 배포
→ 기술 보유 영역 (이 도구)

AEO vs GEO

구분AEOGEO
등장 시점2018~2019 (Featured Snippet)2023~ (ChatGPT 이후)
대상 플랫폼검색엔진 AI 기능
Google AI Overviews, Siri, Alexa
생성형 AI
ChatGPT, Claude, Perplexity
소스기존 검색 인덱스 기반학습 데이터 + 실시간 검색 혼합
실시간성상대적으로 높음낮음 (컷오프 존재)
핵심 기술Schema.org, FAQ 구조화
Featured Snippet 최적화
권위 있는 외부 인용 확보
학습 데이터 침투
쇼핑 적합 쿼리트렌드 · 시즌 쿼리브랜드 평판 · 추천 쿼리
수렴 추세: Perplexity, ChatGPT Search, Google AI Mode 등 실시간 검색 + 생성형 AI가 혼합되면서 AEO·GEO의 경계가 흐려지고 있음. 업계에서는 통합해 "AI Search Optimization"으로 부르는 추세.

GEO Signal 구조

GEO에서 신호는 두 종류다. 크롤 추적(Input)과 응답 직접 확인(Output)은 반드시 병행해야 한다 — 크롤 ≠ 인용.

Input Signal — AI 봇 크롤 로그
서버 액세스 로그에서 AI 봇 UA를 식별
GPTBot          → OpenAI (ChatGPT)
PerplexityBot   → Perplexity
ClaudeBot       → Anthropic (Claude)
Google-Extended → Gemini
Bingbot         → Microsoft Copilot
어느 페이지를 가져갔나 · 크롤 주기 · 어떤 변경 이후 크롤이 늘었나
Output Signal — 응답 직접 확인
LLM에 직접 질문해 브랜드 인용 여부 확인
크롤 (수집, 추적 가능)
  → 인덱싱 (선별, 불투명)
  → 학습/참조 (반영, 불투명)
  → 응답 인용 (결과, 추적 가능)
Visibility Rate · Mention Position · Sentiment Context

쇼핑 쿼리별 GEO Signal 실효성

쿼리 유형실효성이유
브랜드 인지 / 평판 쿼리높음"OO 브랜드 어때?" — 학습 데이터 기반
카테고리 추천 쿼리중간브랜드 권위 반영
트렌드 / 시즌 쿼리낮음크롤 타이밍 + 컷오프 문제
특정 상품 비교 쿼리낮음상품 페이지보다 리뷰/콘텐츠 글이 인용
가격 / 재고 쿼리없음LLM이 구조적으로 실시간 답변 불가
LLM이 실제로 인용하는 것: 상품 페이지(/product/lipstick-coral-2026) ❌ → "2026 여름 메이크업 트렌드 총정리" 같은 블로그/매거진 스타일 콘텐츠 안에서 자사 브랜드를 자연스럽게 언급하는 방식 ✅

플랫폼별 AEO / GEO 구조

Google AI Overviews / AI Mode

별도 크롤러 없음. 기존 구글 인덱스를 그대로 참조 → 구글 SEO = Google AI 인용 가능성

항목기존 SEOGoogle AEO
목표상위 10위AI 요약 박스 인용
판단 기준백링크, 도메인 권위답변 가능성 (질문에 직접 답하는 구조)
콘텐츠 형식긴 글도 OKFAQ, 정의, 단계별 설명 유리
트래픽 효과클릭 유도Zero-click 증가
Google Merchant Center 등록
  → Schema.org 구조화 데이터
  → Google Shopping Graph 연결
  → AI Mode 상품 카드 직접 삽입

ChatGPT Search / Perplexity / 네이버 AI 브리핑

플랫폼실시간 검색 소스핵심 AEO 레버
Google AI Overviews/Mode구글 인덱스기존 SEO + Schema.org
ChatGPT SearchBing 검색 결과Bing SEO (구글과 별개)
Perplexity자체 크롤 + 복합콘텐츠 신선도 + 크롤 가능 구조
네이버 AI 브리핑네이버 검색네이버 SEO (국내 점유율 ~63%)

국내 AI Visibility Platform 시장 현황 (2026년 상반기)

서비스특징
NNT InsightsChatGPT·Claude·Gemini·Perplexity + 네이버 AI 브리핑 단일 대시보드
넥스트티 OPTIGEOAI 봇 크롤 추적 + Naver/Google 크롤 흐름 동시 모니터링
ChainShift서울 기반 SaaS, 7개 LLM 추적, "한국 유일 AIEO" 포지셔닝
블루닷 인텔리전스기업 브랜드 AI 최적화 전문, DUCA 프레임워크
앤서(answer.global)GEO 컨설팅 특화, 리브랜딩 진행 중
구조적 공백 (기회 영역):
  • HyperCLOVA X 등 한국어 LLM 브랜드 노출 추적 도구 없음
  • 실제 도입 기업 사례 전무 — 모든 플랫폼이 랜딩 페이지 수준
  • 네이버 블로그 AI 봇 크롤 여부 미검증
  • 네이버 큐:(CUE:) 현황 불명확

직접 구축 시 최소 구조

AI Visibility 측정 파이프라인
쿼리 풀 정의 (20~30개)
  → LLM API 호출
     (GPT-4o, Claude, Gemini, Perplexity)
  → 응답 파싱
     브랜드 멘션 여부 + 순서 + 맥락
  → 시계열 DB 적재
  → 대시보드
     노출률 / 경쟁사 순위 / 쿼리별 추이
AI 봇 크롤 추적 파이프라인
서버 액세스 로그 수집
  → UA로 AI 봇 필터링
  → 봇별 / 페이지별 / 시간별 집계
  ↓
"GPTBot이 이번 달 제품 페이지 14회 크롤"
"PerplexityBot은 블로그만 크롤"

쿼리 유형 설계 템플릿

[카테고리 인식]
"[업종] 서비스 추천해줘"
"[업종] 분야 국내 회사 알려줘"

[문제 해결형]
"[고객이 겪는 문제]를 해결하려면?"

[비교형]
"[경쟁사 A] vs [경쟁사 B] 비교해줘"
"[경쟁사명] 대안 추천해줘"

[브랜드 직접]
"[브랜드명]이 뭐하는 회사야?"
"[브랜드명]에 대해 어떤 정보를 알고 있어?"

미확인 영역 (추가 리서치 필요)

  • AEO 실무 사례 — 어떤 곳이 실제로 하고 있나
  • 한국어 LLM (HyperCLOVA X 등)에서의 브랜드 노출 추적 방법
  • 네이버 큐:(CUE:) 현재 운영 상태
  • 네이버 블로그의 AI 봇 크롤 실제 여부
  • 국내 대기업 마케팅팀의 AI Visibility 플랫폼 실제 도입 사례
🎯 이 데모는 무엇인가

M2 GEO Proxy는 GEO(Generative Engine Optimization) 기능을 실시간으로 검증하는 프로토타입입니다. URL을 입력하면 서버가 해당 페이지를 가져와 GEO 분석 후 최적화된 HTML을 반환합니다.

핵심 원칙

AI에게만 다른 사실을 보여주지 않습니다. 페이지에 이미 존재하는 정보만 구조화·보완합니다. 없는 정보를 생성하지 않습니다.

기능
분석 / 프록시URL 실시간 분석 — GEO Score, 이슈, 개선 효과 확인. 원본/GEO 적용 화면 좌우 비교. HTML 변경 내역 diff 포함
GEO 슬라이스Chrome JS 렌더링 → 노이즈 제거 → LLM 전용 최적화 문서 재조합. SPA/CSR 사이트에서 효과적
Pre-rendersitemap에서 URL 수집 → 배치 처리 → 캐시 저장. 정적 파일처럼 즉시 서빙
GEO 도입GEO 개념·도입 4단계 흐름·Score 구조·주입 항목·배포 아키텍처. 기획/영업 온보딩용
기술지식Akamai·Cloudflare 봇 차단 원리, TLS 지문, _abck 쿠키, LLM 봇 화이트리스트 구조
매뉴얼운영 레퍼런스 — 프록시 vs Pre-render 비교, GEO 슬라이스 흐름, API 엔드포인트
두 가지 서빙 방식 — 실시간 프록시 vs Pre-render
실시간 프록시Pre-render (배치)
처리 시점요청마다 실시간야간 배치로 사전 생성
서버 부하모든 트래픽 통과배치 시점만
LLM 응답 속도fetch + 분석 시간 포함정적 파일 즉시
신선도실시간TTL 주기 (기본 24h)
Chrome 모드 비용요청마다 Chrome 기동배치 일괄 처리, 효율적
커버리지요청된 URL만sitemap 기반 사전 정의

하이브리드 권장 패턴

[야간 배치] sitemap.xml → URL 목록 → Chrome fetch → GEO 주입 → 캐시 저장

[서빙] LLM 크롤러 요청
  ├→ 캐시 HIT → 정적 GEO HTML 즉시 반환
  └→ 캐시 MISS → 실시간 프록시 폴백 → 결과 캐시에 추가

캐시 확인 방법

응답 헤더 X-GEO-Cache: HIT / MISS로 캐시 적중 여부를 확인할 수 있습니다. Pre-render 탭의 캐시 현황에서 TTL 잔여 시간도 볼 수 있습니다.

✂️ GEO 슬라이스 — LLM 전용 문서 재조합

단순 메타 주입을 넘어, Chrome으로 완전 렌더링 후 노이즈를 제거하고 의미 있는 콘텐츠만 추출해 LLM이 읽기 최적화된 별도 문서를 생성합니다.

처리 흐름

Chrome 렌더링 (JS 실행 + networkidle2)
  
노이즈 제거: nav, header, footer, aside, script, 배너, 팝업, 페이지네이션...
  
콘텐츠 추출: 상품 카드 패턴 감지 → 제목·가격·이미지·URL
  
재조합: ItemList JSON-LD + 최소 CSS + 시맨틱 HTML 단일 문서
  
LLM 크롤러에 서빙 (스크립트 없음, 정보 밀도 극대화)

fetch 엔진 vs Chrome 엔진 비교

fetch 엔진chrome 엔진
정적 사이트✅ 충분과도함
Next.js SSR (head SSR)✅ head 최적화더 풍부
SPA / CSR (SSG, 쿠팡류)❌ 빈 껍데기✅ 필수

생성되는 JSON-LD

타입조건내용
ItemList상품 카드 1개 이상 감지 시상품명·가격·이미지·URL 목록 (최대 50개)
Organization항상브랜드명, 도메인, 로고
기존 JSON-LD원본에 있는 경우그대로 보존

HTML Diff 뷰어

분석 / 프록시 탭에서 GEO 분석 완료 후 HTML 변경 내역 패널이 표시됩니다. 원본 HTML과 GEO 주입 결과의 delta를 보여줍니다.

항목내용
추가된 JSON-LD원본에 없던 <script type="application/ld+json"> 블록
추가된 meta 태그원본에 없던 <meta name/property>
추가된 canonical원본에 없을 때만 표시
alt 텍스트 추가alt 없던 이미지에 추가된 개수
🔗 CDP(실제 Chrome) 연결 방법

CDP 모드는 기동 중인 실제 Chrome에 DevTools Protocol로 연결합니다. Headless 탐지 차단 사이트(Akamai, _abck 쿠키 등)에 유효합니다.

방법 A — 기존 Chrome 종료 후 재실행

기존에 실행 중인 Chrome을 완전히 종료한 다음, 아래 명령으로 실행합니다.

# macOS /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --remote-debugging-port=9222 \ --no-first-run
⚠️ Chrome이 이미 실행 중이면 새 인스턴스가 기존 프로세스에 흡수되어 --remote-debugging-port 플래그가 무시됩니다. 반드시 기존 Chrome을 먼저 종료하세요.

방법 B — 기존 Chrome 유지, 별도 프로파일로 실행 (권장)

--user-data-dir을 별도 경로로 지정하면 기존 Chrome을 종료하지 않고도 독립 인스턴스를 띄울 수 있습니다.

# macOS — 기존 Chrome 유지, CDP 전용 인스턴스 추가 실행 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --remote-debugging-port=9222 \ --user-data-dir=/tmp/chrome-cdp \ --no-first-run

연결 확인

브라우저에서 http://localhost:9222/json/version을 열어 JSON이 반환되면 성공입니다.

분석 탭의 Chrome 엔진 선택 바에서 CDP 배지가 연결됨으로 바뀌면 사용 가능합니다.

방법기존 Chrome신선한 쿠키추천 상황
방법 A종료 필요없음완전 신규 세션이 필요할 때
방법 B유지없음 (새 프로파일)일반적인 CDP 테스트
💡 CDP 연결 후 서버는 puppeteer.connect({ browserURL: 'http://localhost:9222' })로 접속합니다. 분석이 끝나도 Chrome은 닫히지 않습니다 (browser.disconnect()만 호출).
🔌 API 엔드포인트 레퍼런스
엔드포인트파라미터설명
GET /analyzeurl, engineGEO 분석 JSON 반환. score, breakdown, issues, improvements 포함
GET /passthroughurl, engine원본 HTML (X-Frame 제거). 캐시 HIT 시 pre-render 결과 반환
GET /proxyurl, engineGEO 주입된 HTML. 캐시 HIT 시 pre-render 결과 반환
GET /prerender/sitemapurlsitemap.xml 파싱 → URL 목록 반환
POST /prerender/batchbody: urls[], engine, ttlHours배치 시작. jobId 반환
GET /prerender/status/:id배치 진행 상황 (done/total/errors)
GET /prerender/cache캐시 목록 (TTL 잔여 포함)
DELETE /prerender/cache캐시 전체 삭제
GET /diffurl, engine원본 vs GEO 주입 delta JSON. 추가된 JSON-LD·meta·canonical·alt 개수 반환
GET /geo-sliceurl, engine, modeLLM 전용 최적화 문서. mode=json 시 stats+extractedItems만 반환

engine 파라미터

동작속도사용 시점
fetch (기본)서버사이드 HTTP 요청~2초일반 사이트
chrome로컬 Headless Chrome 실행~5~15초Cloudflare 차단 / SPA