| 페이지 | 점수 | GEO 적용 후 | TTL 잔여 | |
|---|---|---|---|---|
| 캐시 없음 | ||||
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-click | AI가 즉각 답변 생성 → 사용자가 출처 방문 안 함 | 클릭 0이지만 브랜드 노출 존재 → 인용 선점이 중요 |
| 서버사이드 fetch | HTTP로 정적 HTML만 수신, JS 미실행 | React/Next.js SPA는 AI에게 빈 페이지로 보임 |
| 빠른 크롤 주기 | Googlebot: 수주 간격 / AI 크롤러: 수일~수시간 | JSON-LD 없는 상품페이지는 외부 블로그에 인용 선점 당함 |
LLM: HTML → 텍스트 추출 → 의미 파악 → 답변 생성
따라서 분기 방향은 "Human용 렌더링 HTML vs LLM용 정보 밀도 높은 HTML"입니다. 모바일 대응 시대에 UA를 보고 m.site.com을 서빙했던 것과 구조가 동일합니다.
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 | 사이트 전체 | 높음 | 운영 자동화·서빙 속도 |
총 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가 출처로 인식하기 어려운 상태 |
| 주입 항목 | 효과 | 데이터 출처 |
|---|---|---|
| Organization JSON-LD | 브랜드 공식 출처 신호 +8점 | 도메인, 페이지 타이틀 |
| Product JSON-LD | 상품 구조화 데이터 +10점 | H1, meta, 가격 정규식 |
| FAQPage JSON-LD | AI 답변 선점용 +7점 | 상품명·description 기반 생성 |
| canonical 태그 | 인용 출처 URL 고정 +4점 | 현재 URL |
| OG 태그 보완 | 소셜/AI 공유 신호 +6점 | 기존 메타에서 추출 |
| meta description 확장 | 80자 이상으로 보강 +5점 | H1 + 첫 문단 |
| 이미지 alt 텍스트 | 이미지 내 정보 AI 접근 +1점 | 파일명 파싱 |
원칙: 페이지에 이미 있는 정보만 구조화합니다. 존재하지 않는 가격·브랜드명·설명을 만들어내지 않습니다.
| 옵션 | 인프라 | 설치 난이도 | 지연 | 적합 대상 |
|---|---|---|---|---|
| A | M2 리버스 프록시 (직접 서버) | 중간 | ~50ms | 자체 서버 보유 고객사 |
| B | Cloudflare Worker + KV | 낮음 | <10ms | Cloudflare 이미 사용 중인 고객사 |
| C | AWS Lambda@Edge + S3 | 중간 | ~5ms | AWS 스택 고객사 |
| D | M2 Edge CDN (M2 관리형) | 최저 | <10ms | 인프라 없는 고객사 (SaaS형) |
| E | Nginx/OpenResty 플러그인 | 높음 | ~1ms | 온프레미스 서버 환경 |
| F | Next.js Middleware (자사 앱) | 낮음 | ~0ms | Next.js로 운영 중인 고객사 |
Option A — M2 리버스 프록시 직접 삽입
├→ LLM → Pre-render 캐시 or 실시간 GEO HTML
└→ Human → Origin pass-through
고객사 서버에 M2 프록시를 한 홉 추가. CDN 종류 무관. 가장 범용적.
Option B — Cloudflare Worker + KV 권장 (Cloudflare 사용 시)
├→ 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 → S3에서 GEO HTML 반환
└→ Human → Origin 통과
AWS 인프라 고객사 최적. CloudFront Viewer-Request 트리거에 Lambda 연결. GEO HTML은 M2 배치가 S3 버킷에 저장.
| 구성 요소 | 역할 | 비용 기준 |
|---|---|---|
| CloudFront | CDN·엣지 라우팅 | 요청수 기반 (1M건 $0.01) |
| Lambda@Edge | UA 판별 + S3 조회 | 실행시간 기반 (1M건 $0.60) |
| S3 | GEO HTML 정적 저장 | 저장용량 기반 (1GB $0.023/월) |
| M2 배치 서버 | GEO HTML 생성 → S3 업로드 | M2 구독료 |
Option D — M2 Edge CDN (M2 관리형 SaaS) 인프라 없는 고객사
├→ 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 → Redis 캐시에서 GEO HTML
└→ Human → upstream 그대로
온프레미스 서버 또는 IDC 환경. OpenResty Lua 모듈로 UA 판별 + Redis 캐시 조회. 외부 네트워크 의존 없음.
Option F — Next.js 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 | 운영사 | 용도 |
|---|---|---|---|
| ● GPTBot | GPTBot/1.0 | OpenAI | ChatGPT 학습·검색 인덱싱 |
| ● ChatGPT-User | ChatGPT-User | OpenAI | ChatGPT 실시간 Browse |
| OAI-SearchBot | OAI-SearchBot | OpenAI | ChatGPT Search |
| ● ClaudeBot | ClaudeBot/0.1 | Anthropic | Claude AI 크롤링 |
| ● PerplexityBot | PerplexityBot/1.0 | Perplexity | Perplexity AI 검색 |
| Google-Extended | Google-Extended | Gemini 학습 제어 | |
| Bingbot | bingbot/2.0 | Microsoft | Copilot 인덱싱 |
| Meta-ExternalAgent | Meta-ExternalAgent/1.1 | Meta | Meta AI |
| Applebot-Extended | Applebot-Extended/0.1 | Apple | Apple Intelligence |
| Bytespider | Bytespider | ByteDance | TikTok AI |
| CCBot | CCBot/2.0 | Common Crawl | GPT·LLaMA 학습 데이터셋 |
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/헤더 우회로 뚫리지 않는 이유가 여기 있습니다.
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의 앙상블 판정이 여러 신호를 조합하기 때문입니다.
Bot Score 시스템
Cloudflare는 모든 요청에 1~99 Bot Score를 부여합니다. 점수가 낮을수록 봇 가능성이 높습니다. 50개 이상의 신호를 종합해 ML로 판단합니다.
| 신호 | Chrome 브라우저 | 서버사이드 fetch | 우회 가능? |
|---|---|---|---|
| TLS fingerprint (JA3) | Chrome 고유값 | Node/Bun 고유값 | 어려움 |
| IP ASN | ISP (SKT, KT 등) | AWS·클라우드 IP | 거의 불가 |
| HTTP/2 프레임 패턴 | Chrome 특유 패턴 | 라이브러리 패턴 | 어려움 |
| 헤더 순서·대소문자 | Chrome 방식 | 다름 | 부분 가능 |
| JS Challenge | 자동 실행·통과 | 실행 불가 | 불가 |
JS 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 지문은 클라이언트가 서버에 보내는 ClientHello 메시지의 특정 필드를 해시한 값입니다. 애플리케이션 레이어(HTTP)가 아닌 네트워크 레이어에서 이루어지므로 User-Agent 변경으로 우회할 수 없습니다.
JA3 해시 구성 요소
| 필드 | 설명 | Chrome 특징 |
|---|---|---|
| TLS 버전 | 지원하는 TLS 최대 버전 | TLS 1.3 우선 |
| 암호화 스위트 | 지원 알고리즘 목록 (순서 포함) | Chrome 고유 순서 존재 |
| 확장 목록 | SNI, ALPN, session ticket 등 | Chrome 특유 확장 세트 |
| 타원 곡선 | ECC 키 교환용 곡선 목록 | x25519 우선 배치 |
| 포인트 형식 | ECC 포인트 압축 방식 | uncompressed 우선 |
Chrome 125:
8a2b5...f3cNode.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는 여전히 이슈 |
Akamai·Cloudflare 모두 "알려진 좋은 봇(Known Good Bot)" 화이트리스트를 관리합니다. GPTBot·ClaudeBot 등이 차단되지 않는 이유는 UA 때문이 아니라 IP 화이트리스트 때문입니다.
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 Bot | UA만 바꾼 스크레이퍼 | 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 Proxy | Bright Data, Oxylabs — 실제 가정 IP로 요청 | $100~500+/월 |
| Scraping SaaS | Zyte, ScrapingBee — Akamai 우회 포함 | 건당 과금 |
| 공식 데이터 피드 | 사이트 제휴·파트너 API | 계약 필요 |
| 허용된 LLM 봇 UA 신청 | Akamai에 자사 크롤러 사전 등록 | 기업 계약 필요 |
핵심 결론: 이 프로토타입은 자사 도메인 또는 파트너사 사이트 GEO 최적화 도구입니다. Akamai 보호 경쟁사 사이트 스크래핑은 코드 레벨 문제가 아닌 인프라·계약 문제입니다.
AEO · GEO 전략 개요
서비스 구조 구분
GEO 서비스는 크게 두 단계로 나뉜다.
어느 쿼리에서 노출되나, 경쟁사 대비 AI 가시성, 어떤 콘텐츠가 LLM에 영향을 주나
GEO 주입, LLM 전용 구조화 문서, Edge CDN 배포
AEO vs GEO
| 구분 | AEO | GEO |
|---|---|---|
| 등장 시점 | 2018~2019 (Featured Snippet) | 2023~ (ChatGPT 이후) |
| 대상 플랫폼 | 검색엔진 AI 기능 Google AI Overviews, Siri, Alexa | 생성형 AI ChatGPT, Claude, Perplexity |
| 소스 | 기존 검색 인덱스 기반 | 학습 데이터 + 실시간 검색 혼합 |
| 실시간성 | 상대적으로 높음 | 낮음 (컷오프 존재) |
| 핵심 기술 | Schema.org, FAQ 구조화 Featured Snippet 최적화 | 권위 있는 외부 인용 확보 학습 데이터 침투 |
| 쇼핑 적합 쿼리 | 트렌드 · 시즌 쿼리 | 브랜드 평판 · 추천 쿼리 |
GEO Signal 구조
GEO에서 신호는 두 종류다. 크롤 추적(Input)과 응답 직접 확인(Output)은 반드시 병행해야 한다 — 크롤 ≠ 인용.
GPTBot → OpenAI (ChatGPT) PerplexityBot → Perplexity ClaudeBot → Anthropic (Claude) Google-Extended → Gemini Bingbot → Microsoft Copilot
크롤 (수집, 추적 가능) → 인덱싱 (선별, 불투명) → 학습/참조 (반영, 불투명) → 응답 인용 (결과, 추적 가능)
쇼핑 쿼리별 GEO Signal 실효성
| 쿼리 유형 | 실효성 | 이유 |
|---|---|---|
| 브랜드 인지 / 평판 쿼리 | 높음 | "OO 브랜드 어때?" — 학습 데이터 기반 |
| 카테고리 추천 쿼리 | 중간 | 브랜드 권위 반영 |
| 트렌드 / 시즌 쿼리 | 낮음 | 크롤 타이밍 + 컷오프 문제 |
| 특정 상품 비교 쿼리 | 낮음 | 상품 페이지보다 리뷰/콘텐츠 글이 인용 |
| 가격 / 재고 쿼리 | 없음 | LLM이 구조적으로 실시간 답변 불가 |
플랫폼별 AEO / GEO 구조
Google AI Overviews / AI Mode
별도 크롤러 없음. 기존 구글 인덱스를 그대로 참조 → 구글 SEO = Google AI 인용 가능성
| 항목 | 기존 SEO | Google AEO |
|---|---|---|
| 목표 | 상위 10위 | AI 요약 박스 인용 |
| 판단 기준 | 백링크, 도메인 권위 | 답변 가능성 (질문에 직접 답하는 구조) |
| 콘텐츠 형식 | 긴 글도 OK | FAQ, 정의, 단계별 설명 유리 |
| 트래픽 효과 | 클릭 유도 | 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 Search | Bing 검색 결과 | Bing SEO (구글과 별개) |
| Perplexity | 자체 크롤 + 복합 | 콘텐츠 신선도 + 크롤 가능 구조 |
| 네이버 AI 브리핑 | 네이버 검색 | 네이버 SEO (국내 점유율 ~63%) |
국내 AI Visibility Platform 시장 현황 (2026년 상반기)
| 서비스 | 특징 |
|---|---|
| NNT Insights | ChatGPT·Claude·Gemini·Perplexity + 네이버 AI 브리핑 단일 대시보드 |
| 넥스트티 OPTIGEO | AI 봇 크롤 추적 + Naver/Google 크롤 흐름 동시 모니터링 |
| ChainShift | 서울 기반 SaaS, 7개 LLM 추적, "한국 유일 AIEO" 포지셔닝 |
| 블루닷 인텔리전스 | 기업 브랜드 AI 최적화 전문, DUCA 프레임워크 |
| 앤서(answer.global) | GEO 컨설팅 특화, 리브랜딩 진행 중 |
- HyperCLOVA X 등 한국어 LLM 브랜드 노출 추적 도구 없음
- 실제 도입 기업 사례 전무 — 모든 플랫폼이 랜딩 페이지 수준
- 네이버 블로그 AI 봇 크롤 여부 미검증
- 네이버 큐:(CUE:) 현황 불명확
직접 구축 시 최소 구조
쿼리 풀 정의 (20~30개)
→ LLM API 호출
(GPT-4o, Claude, Gemini, Perplexity)
→ 응답 파싱
브랜드 멘션 여부 + 순서 + 맥락
→ 시계열 DB 적재
→ 대시보드
노출률 / 경쟁사 순위 / 쿼리별 추이
서버 액세스 로그 수집 → 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-render | sitemap에서 URL 수집 → 배치 처리 → 캐시 저장. 정적 파일처럼 즉시 서빙 |
| GEO 도입 | GEO 개념·도입 4단계 흐름·Score 구조·주입 항목·배포 아키텍처. 기획/영업 온보딩용 |
| 기술지식 | Akamai·Cloudflare 봇 차단 원리, TLS 지문, _abck 쿠키, LLM 봇 화이트리스트 구조 |
| 매뉴얼 | 운영 레퍼런스 — 프록시 vs Pre-render 비교, GEO 슬라이스 흐름, API 엔드포인트 |
| 실시간 프록시 | Pre-render (배치) | |
|---|---|---|
| 처리 시점 | 요청마다 실시간 | 야간 배치로 사전 생성 |
| 서버 부하 | 모든 트래픽 통과 | 배치 시점만 |
| LLM 응답 속도 | fetch + 분석 시간 포함 | 정적 파일 즉시 |
| 신선도 | 실시간 | TTL 주기 (기본 24h) |
| Chrome 모드 비용 | 요청마다 Chrome 기동 | 배치 일괄 처리, 효율적 |
| 커버리지 | 요청된 URL만 | sitemap 기반 사전 정의 |
하이브리드 권장 패턴
[서빙] LLM 크롤러 요청
├→ 캐시 HIT → 정적 GEO HTML 즉시 반환
└→ 캐시 MISS → 실시간 프록시 폴백 → 결과 캐시에 추가
캐시 확인 방법
응답 헤더 X-GEO-Cache: HIT / MISS로 캐시 적중 여부를 확인할 수 있습니다. Pre-render 탭의 캐시 현황에서 TTL 잔여 시간도 볼 수 있습니다.
단순 메타 주입을 넘어, Chrome으로 완전 렌더링 후 노이즈를 제거하고 의미 있는 콘텐츠만 추출해 LLM이 읽기 최적화된 별도 문서를 생성합니다.
처리 흐름
↓
노이즈 제거: 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에 DevTools Protocol로 연결합니다. Headless 탐지 차단 사이트(Akamai, _abck 쿠키 등)에 유효합니다.
방법 A — 기존 Chrome 종료 후 재실행
기존에 실행 중인 Chrome을 완전히 종료한 다음, 아래 명령으로 실행합니다.
--remote-debugging-port 플래그가 무시됩니다. 반드시 기존 Chrome을 먼저 종료하세요.
방법 B — 기존 Chrome 유지, 별도 프로파일로 실행 (권장)
--user-data-dir을 별도 경로로 지정하면 기존 Chrome을 종료하지 않고도 독립 인스턴스를 띄울 수 있습니다.
연결 확인
브라우저에서 http://localhost:9222/json/version을 열어 JSON이 반환되면 성공입니다.
분석 탭의 Chrome 엔진 선택 바에서 CDP 배지가 연결됨으로 바뀌면 사용 가능합니다.
| 방법 | 기존 Chrome | 신선한 쿠키 | 추천 상황 |
|---|---|---|---|
| 방법 A | 종료 필요 | 없음 | 완전 신규 세션이 필요할 때 |
| 방법 B | 유지 | 없음 (새 프로파일) | 일반적인 CDP 테스트 |
puppeteer.connect({ browserURL: 'http://localhost:9222' })로 접속합니다. 분석이 끝나도 Chrome은 닫히지 않습니다 (browser.disconnect()만 호출).
| 엔드포인트 | 파라미터 | 설명 |
|---|---|---|
GET /analyze | url, engine | GEO 분석 JSON 반환. score, breakdown, issues, improvements 포함 |
GET /passthrough | url, engine | 원본 HTML (X-Frame 제거). 캐시 HIT 시 pre-render 결과 반환 |
GET /proxy | url, engine | GEO 주입된 HTML. 캐시 HIT 시 pre-render 결과 반환 |
GET /prerender/sitemap | url | sitemap.xml 파싱 → URL 목록 반환 |
POST /prerender/batch | body: urls[], engine, ttlHours | 배치 시작. jobId 반환 |
GET /prerender/status/:id | — | 배치 진행 상황 (done/total/errors) |
GET /prerender/cache | — | 캐시 목록 (TTL 잔여 포함) |
DELETE /prerender/cache | — | 캐시 전체 삭제 |
GET /diff | url, engine | 원본 vs GEO 주입 delta JSON. 추가된 JSON-LD·meta·canonical·alt 개수 반환 |
GET /geo-slice | url, engine, mode | LLM 전용 최적화 문서. mode=json 시 stats+extractedItems만 반환 |
engine 파라미터
| 값 | 동작 | 속도 | 사용 시점 |
|---|---|---|---|
fetch (기본) | 서버사이드 HTTP 요청 | ~2초 | 일반 사이트 |
chrome | 로컬 Headless Chrome 실행 | ~5~15초 | Cloudflare 차단 / SPA |