2026년 키워드 카니발리제이션 찾기 및 수정 방법: Codex 워크플로우

Search Console, 크롤 데이터, 순위 트래커에서 키워드 카니발리제이션을 찾아 통합·카노니컬·차별화·삭제로 트래픽을 잃지 않고 수정하는 90분 워크플로우. 바로 쓰는 Codex 감사 스킬 포함.

이 워크플로우가 주는 것

중요하게 여기는 키워드에서 한때 상위 10위 안에 들던 페이지가 어느새 34위로 밀려났다. 같은 검색어로 검색하면 내 사이트의 URL이 두 개나 나온다. 아니면 지난달 콘텐츠 팀이 새 글 40개를 올렸는데 그중 몇 개가 조용히 서로 싸우고 있을 것 같은 느낌이 든다.

이 워크플로우는 그런 의심을 확인된 목록과 수정 계획으로 바꾼다. 끝나면 세 가지가 손에 들어온다: 내 URL 두 개 이상이 같은 쿼리에서 경쟁하는 모든 쿼리, 각 클러스터에 대한 판정(통합·카노니컬·차별화·삭제 중 하나), 그리고 수정이 실제로 효과가 있었는지 알려 주는 4주 검증 계획.

  • 대상: 수백 페이지를 넘는 사이트의 SEO 담당자와 콘텐츠 팀, 그리고 빠르게 발행하는 모든 사람.
  • 시간: 중간 규모 사이트의 첫 감사에 약 90분. 루틴이 생기면 절반.
  • 전제 조건: Google Search Console 읽기 권한, 크롤 내보내기(Screaming Frog, Sitebulb 등), 구독 중이라면 순위 트래커.
  • 완료 기준: 목록의 모든 경쟁 클러스터에 위 4가지 판정 중 정확히 하나가 있고, 수정이 적용됐으며, 순위와 노출을 다시 확인할 날짜가 캘린더에 있다.

시작하기 전에 현실 점검 하나 — 고장나지 않은 것을 고치지 않으려는 것이다. 쿼리 하나에 URL이 여러 개 보이는 것은 정상이다. 카테고리 페이지, 블로그 글, 상품 페이지가 같은 검색어로 노출될 수 있다 — 서로 다른 의도(조사 중인 사람 vs. 구매 준비가 된 사람)에 응한다면 그것은 건강한 SERP이지 카니발리제이션이 아니다. 이 워크플로우에서 플래그가 붙는 것은 같은 단계에서 같은 역할을 두고 경쟁하는 페이지뿐이다.

이 문제가 5년 전보다 2026년에 더 중요한 이유는 하나다: AI 브리프와 AI 생성 초안이 사람이 수동으로 따라잡을 수 없는 속도로 닮은 페이지를 만들어 내므로, 카니발리제이션이 이제 규모로 발생한다. 그것은 Google 순위와 AI 검색 인용에 동시에 타격을 준다.

3분 증상 체크

데이터를 파기 전에 먼저 이것을 훑자. 아래 중 두 개 이상이 해당하면 전체 감사를 실행한다.

증상

어떤 모습인가

가장 유력한 원인

순위 정체

수개월 상위 10위를 지키던 페이지가 새 페이지 출시 후 25~50위로 하락

새 페이지가 같은 쿼리에서 경쟁

노출 분산

두 URL이 같은 쿼리 노출을 거의 50/50으로 나눠 가짐

어느 페이지도 명확한 관련성을 얻지 못함

제목 태그 쌍둥이

두 페이지의 H1과 타이틀이 같거나 거의 동일

작성자가 보완이 아닌 변형을 만들었음

순위 URL 변경

검색어에 대한 순위 URL이 내 페이지들 사이에서 주마다 바뀜

검색엔진이 권위 있는 페이지를 고르지 못함

AI 답변 요동

AI 어시스턴트가 같은 질문에 실행마다 다른 내 URL을 인용

같은 분산이 다른 표면에서 발생

시작 전에: 필요한 데이터

다음 세 가지를 모은다:

  1. 최소 6개월 기록이 있는 Search Console. 90일로도 빠른 점검은 되지만, 기간이 길수록 순위가 페이지 출시와 맞물려 하락한 시점이 보인다.
  2. 타이틀과 H1이 추출된 새 크롤. Screaming Frog는 기본 제공한다. Sitebulb와 Botify도 마찬가지다. 아무것도 없다면 site: 검색과 CMS 페이지 목록으로 가장 명확한 사례는 커버할 수 있다.
  3. 순위 트래커 내보내기(Semrush, Ahrefs, Authority Labs). 이 단계는 선택 사항 — Search Console 패스만으로도 대부분의 사례를 찾는다.

시작 전에 Search Console에서 두 가지를 내보낸다: 쿼리 보고서(쿼리, 노출, 클릭, 순위)와 페이지 차원의 같은 보고서(URL). 둘 다 Performance의 전체 보고서에 있다.

Step 1: Search Console에서 경쟁 URL 찾기

이것은 무료이면서 신호가 가장 강한 패스다.

  1. Search Console을 열고 Performance → 전체 보고서로 이동.
  2. 쿼리 필터를 사용해 첫 우선 키워드를 입력.
  3. 차트 아래 URL 목록을 확인. 같은 기간에 내 페이지 두 개 이상이 노출을 받은 쿼리를 메모한다.

찾는 패턴은 두 가지다: 같은 기간에 노출을 거의 균등하게 나누는 페이지 조합, 그리고 한때 상위 10위였지만 20~50위에 머무는 페이지 — 특히 하락이 닮은 페이지 출시와 함께 시작된 경우다.

가치가 높은 키워드 10~15개로 시작한다. 절반에서 클러스터가 나오면 문제는 사이트 전체에 퍼진 것이므로, 지난 6개월간 예컨대 노출 50회 이상의 모든 쿼리를 싹 다 훑을 가치가 있다. 몇 개에서만 나타나면 문제는 국지적이다 — 그것들을 고치고 넘어간다.

예상 결과: 쿼리마다 내 URL 두 개 이상과 그 노출 분배 목록. 품질 확인: 페이지가 실제로 같은 쿼리에서 순위를 공유하는지. 소리만 비슷하면 이웃이지 경쟁자가 아니다 — 목록에서 뺀다. 복구: 아무것도 없다? 기간을 3개월로 넓히고 키워드의 롱테일 변형을 포함한다. 브랜드어/비브랜드어 분배도 확인한다 — 언어 쌍이나 도매·소비자 병행 같은 다중 버전 사이트에는 거기에 중복이 숨어 있다.

Step 2: 크롤 데이터에서 중복 타이틀과 H1 찾기

카니발리제이션은 흔히 콘텐츠 생산 사고에서 온다: 작성자가 "X에 대해 써 달라"는 요청을 받고 이미 존재하는 페이지를 확인하지 않은 채, 이미 순위를 가진 페이지와 같은 타이틀의 페이지를 만들어 버린다.

크롤 내보내기를 열고 타이틀 순, 다음으로 H1 순으로 정렬해 중복과 근사 중복에 플래그를 단다. "근사"도 포함된다 — 두 페이지가 경쟁하는 데 타이틀이 완전히 같을 필요는 없다. "Best CRM software"와 "Best CRM tools"가 같은 독자를 노린다면 후보다. "Best CRM for real estate"는 다른 페이지이므로 목록에 넣으면 안 된다.

크롤 데이터를 보는 동안 기술적 용의자도 확인한다: 페이지 자신이 아닌 곳을 가리키는 카노니컬 태그, 변형이 추가될 때 바뀐 meta robots noindex 규칙, 시작되거나 중단된 robots.txt 차단. 이 주제에 대한 Search Engine Journal 가이드의 표현대로: 크롤하고, 인덱싱하고, 무시하는 방식을 바꿀 때 카니발리제이션 문제가 만들어진다. 옛 상품의 카노니컬을 물려받은 상품 변형 페이지가 전형적인 예다.

예상 결과: 타이틀·H1이 중복되거나 경쟁하는 페이지 쌍과 기술적 플래그. 품질 확인: 쌍마다 질문 하나를 던진다 — 다른 페이지가 출시되기 전에 이 페이지가 존재하며 순위를 가졌는가? 그렇다면 기록한다. 그것이 진짜 문제의 가장 강한 신호다. 복구: CMS에서 내보내기가 고통스럽다면 이 글 끝의 Codex 스킬로 크롤 CSV에서 목록을 생성한다. 그 출력은 후보 목록이지 판정이 아니다.

Step 3: 순위 트래커로 확정하기

Search Console은 Google이 보고하는 것을 알려 주고, 순위 트래커는 내 URL이 시간에 따라 어디에 있는지 알려 준다. 정체된 페이지를 실제로 드러내는 것은 후자다.

각 후보 쿼리를 트래커에서 연다. 카니발리제이션을 확정하는 패턴: 키워드가 20위 중반~50위 중반에 정체해 있거나, X위를 지키는 URL이 내 페이지들 사이에서 계속 바뀐다. Semrush는 지난 1년간 어떤 내 페이지가 그 검색어에 나타났는지 보여 주고, Authority Labs는 키워드별 전체 URL을 나열한다. 1년 기록에 내 URL이 두 개 이상 나타나고 어느 것도 상위 10위에 닿지 않았다면 확정이다.

그 김에 방향도 읽는다. 원래 페이지가 새 페이지 출시까지는 잘 지내다가 둘 다 지금 아래쪽에 맴돈다면, 새로 온 페이지가 순위를 "훔친" 것이 아니다. 두 페이지가 서로를 희석시킨 것이다. 그것은 수정 방향을 바꾼다: 새 페이지를 원래 페이지에 통합하지, 그 반대로 하지 않는다.

예상 결과: 각 후보 클러스터의 확정 상태 — "확정" 또는 "미확정, 수동 검토". 품질 확인: 확정에는 독립 신호가 최소 두 개 필요하다. Search Console + 크롤이 둘로 치고, 순위 트래커만으로는 약한 단일 신호다. 복구: 트래커가 키워드당 URL을 하나만 보여 주면 이 단계는 건너뛴다. Search Console과 크롤 패스만으로도 전체 워크플로우를 돌릴 수 있다.

키워드 카니발리제이션 감사 워크플로우: 세 가지 감지 패스가 네 가지 판정 매트릭스로 흘러 들어가고, 수정과 4주 검증 루프로 이어진다.

감사 파이프라인: 감지 패스 3개, 판정 매트릭스 1개, 검증 루프 1개.

Step 4: 수정 방향 결정

확정된 각 클러스터에 대해 네 가지 판정 중 정확히 하나를 고른다. 이 표가 결정의 전부다:

판정

언제 쓰나

실행

통합

페이지가 같은 의도를 갖고 한쪽이 명백히 더 완성도 높음

약한 페이지의 고유 논점을 강한 페이지에 접고, 약한 URL을 삭제하거나 301

카노니컬

존재가 필수인 거의 동일한 변형(상품 변형, 파라미터, 캠페인 페이지)

공식 URL을 고르고 거기에 자기 참조 카노니컬을 두고, 변형들을 그쪽으로 카노니컬

차별화

같은 토픽이지만 유지하고 싶은 다른 의도(하우투 vs. 상품 페이지 등)

한 페이지를 명확히 다른 쿼리나 퍼널 단계에 응하도록 다시 쓰고 타이틀·H1이 겹치지 않게

삭제

페이지가 얇거나, 중복이거나, 이미 커버된 검색어를 위해 존재

고유 가치를 남는 페이지에 접은 뒤 삭제

카니발리제이션이 아니므로 건드리지 않는 두 경우: 같은 키워드를 퍼널의 다른 단계에서 노리는 하우투 가이드와 전환 페이지 — Google은 어느 페이지가 무슨 역할인지 이해한다 — 그리고 hreflang이 있는 같은 페이지의 언어별 버전.

판정을 확인하는 질문 하나: 이 변경 후, 그 검색어로 찾은 사용자가 한 페이지에 도착해 다른 페이지가 주던 것을 모두 얻을 수 있는가? 그렇다면 통합하거나 삭제한다. 아니라면 카노니컬하거나 차별화한다.

Step 5: 가시성을 잃지 않고 수정 적용하기

수정 A: 콘텐츠 통합(통합 판정). 남는 페이지를 기준으로 작업한다. 진 페이지의 고유 섹션을 전부 복사해 넣는다 — FAQ 답변, 사례, 인용되는 섹션, 그 페이지를 가리키던 내부 링크. 필요하면 재배치해 강한 콘텐츠가 위로 오게 한다. 진 페이지에 외부 백링크나 실제 순위가 있다면 404로 두지 말고 301로 남는 페이지에 연결한다. 둘 다 없다면 삭제로 충분하다. Search Engine Journal 가이드는 의도적으로 301을 피한다 — 콘텐츠를 접고 새 페이지를 삭제하는 것을 선호한다 — 301이 필요해지는 것은 삭제하는 URL이 자체 링크 자산을 가질 때뿐이다. 진 페이지의 앵커 텍스트를 쓰던 내부 링크는 남는 페이지를 가리키도록 업데이트한다.

콘텐츠 통합 전후: 노출을 나누던 경쟁 URL 두 개가 하나의 남는 페이지로 바뀌어 그 쿼리에서 승리한다.

경쟁 페이지 둘을 하나의 URL로 통합하면 50/50 노출 분산이 단일 승자로 바뀐다.

수정 B: 카노니컬(카노니컬 판정). 공식 페이지에 자기 참조 카노니컬을 두고 변형들을 그쪽으로 카노니컬한다. 이것은 존재가 필수인 중복형 페이지 — 상품 변형, 파라미터 URL, 캠페인 페이지 — 에 맞는 도구다. 통합의 대체재는 아니다. 두 페이지 모두 실질적 콘텐츠를 가진다면 카노니컬만으로는 둘 다 크롤에 남고 편집 초점도 갈라진다 — 콘텐츠 작업을 먼저 한 다음 카노니컬을 가리킨다.

수정 C: 프로그램 방식으로 인덱싱 차단(삭제에 인접한 판정). 중복이 구조적일 때 — 파라미터 페이지, 필터 조합, 인덱싱이 필요 없는 지역 변형 — 페이지별이 아니라 폴더나 템플릿 수준에서 noindex를 적용한다. 코드 한 줄이 수작업 200번을 이기는 경우다.

수정 D: 의도에 따라 내부 링크 수정(차별화 판정). 두 페이지가 정당하게 서로 다른 의도에 응한다면 내부 링크도 그렇게 말하게 한다. 원본 가이드의 규칙: "apples"라는 단어 주변 문장이 사과를 사는 이야기라면 전환 페이지로 링크하고, 사과가 어디서 나오는지의 이야기라면 정보 페이지로 링크한다. 모든 내부 링크는 투표다. 링크가 일관되게 이겨야 하는 페이지를 가리키게 하면, 검색엔진이 스스로(흔히 잘못된 방향으로) 해결하던 모호함이 사라진다.

Step 6: 수정이 유지되는지 검증

수정 후 2~4주를 기다렸다가 다시 확인한다.

  1. Search Console: 쿼리가 분산이 아닌 하나의 지배적 URL을 보여 주고, 남는 페이지의 노출이 올라야 한다. 클러스터 전체 노출은 재평가 중 1~2주간 빠질 수 있다 — 정상이며 실패가 아니다.
  2. 순위 트래커: 키워드가 URL 사이를 오가지 않아야 한다.
  3. AI 표면: 핵심 문구를 AI 어시스턴트나 AI 검색엔진에 물어 인용되는 것이 남는 URL인지 — 삭제한 쪽이 아닌지 — 확인한다. 분산된 페이지는 AI 인용도 분산시킨다. 통합은 Google 순위와 AI 검색 가시성을 동시에 돕는 몇 안 되는 수정 중 하나다.

4주 후에도 클러스터가 갈라진 채라면 페이지를 놓쳤거나(모르던 변형을 다시 확인) 페이지가 정말 다른 의도를 가져 차별화했어야 했다(통합이 아니었어야)는 뜻이다. 재검증하고 재판정한다.

재발 방지

감사가 쉬운 부분이다. 깨끗함을 유지하는 것은 발행 규칙의 문제다. 중요도 순으로 세 가지 습관:

  1. 콘텐츠 팀이 쓰기 전에 확인하는 토픽 목록을 유지한다. 카니발리제이션을 만드는 가장 빠른 길은 그 페이지가 이미 있다는 것을 모르는 작성자다.
  2. 겹침을 벽이 아닌 대화로 만든다. 토픽을 금지하는 대신 작성자가 보완적 앵글 — 하우투, 비교, 업종별 버전 — 을 찾도록 돕는다.
  3. AI 생성 파이프라인을 특히 주시한다. AI 생성 산출물은 가장 빠른 카니발리제이션 공장이다: 프롬프트 품질과 무관하게 서로 경쟁하는 반복적이고 얇은 페이지를 만든다. 생성되거나 AI 브리프를 거친 모든 페이지는 스케줄 전에 토픽 목록 점검을 통과해야 하며, 분기 감사에서 우선순위를 둔다.

전체 감사는 분기마다, 그리고 사이트의 같은 영역에 페이지를 여러 개 추가한 출시가 있을 때마다 실행한다.

감사 자동화: Codex 스킬

위 단계는 데이터의 의미를 이해하기 위해 수동으로 한다. 이해하고 나면 반복 가능한 부분을 AI 코딩 에이전트에 맡기자. 이것은 Codex용 완전한 스킬 파일이다: Search Console 내보내기를 읽고 경쟁 클러스터에 플래그를 세우고, 사이트를 건드리지 않고 판정 시트를 만든다.

markdown
---
name: keyword-cannibalization-audit
description: Find and classify keyword cannibalization clusters from Google Search Console, crawl, and rank-tracker exports. Use when a query shows multiple URLs, rankings dropped after a new page launch, or you need a cannibalization verdict sheet. Read-only: produces a report, never edits pages.
---

# Keyword Cannibalization Audit

## Inputs (required)
- `gsc-queries.csv` — Search Console query export (query, impressions, clicks, position)
- `gsc-pages.csv` — Search Console page export (page, impressions, clicks, position)
- `crawl-titles.csv` — crawl export with URL, title, H1, canonical
- `rank-history.csv` — optional rank tracker export with per-keyword URL history

## Procedure

1. Load the CSVs. Normalize URLs (lowercase host, strip trailing slash and tracking parameters).
2. Join `gsc-queries.csv` and `gsc-pages.csv` on query to build query-to-URL mappings.
3. Flag queries where 2+ URLs each received at least 10% of the query's impressions in the last 90 days.
4. Flag queries where a URL sits between positions 20-50 and a second URL for the same query was created later (compare crawl or tracker history).
5. From `crawl-titles.csv`, flag pairs whose titles or H1s are identical or share 80%+ of their significant tokens.
6. From `rank-history.csv`, flag queries whose ranking URL changed more than twice in 6 months.
7. Cross-check every flag. Keep only clusters confirmed by at least two signals (Search Console + crawl counts as two).
8. Classify each surviving cluster as MERGE, CANONICALIZE, DIFFERENTIATE, or REMOVE:
   - Same intent + one page clearly more complete → MERGE (fold unique sections into the survivor; note a 301 only if the removed URL has external backlinks)
   - Near-identical variants that must exist (parameters, variants) → CANONICALIZE
   - Same topic, genuinely different intent you want to keep → DIFFERENTIATE (rewrite one page, no title overlap)
   - Thin or fully duplicated page with no unique value → REMOVE
   - Complementary intent (how-to vs. product for the same keyword) → NOT CANNIBALIZATION, skip
9. Output `cannibalization-verdicts.md`: a table of query | competing URLs | signals found | verdict | action, ordered by query impressions. Include for each cluster the exact URLs, the evidence rows (dates, positions, impressions), and fix text ready to paste into a CMS task.

## Rules
- Read-only. Never edit pages, robots.txt, or canonicals. Output the report and a proposed action plan only.
- Never merge a URL into a survivor whose content is not equal to or better than the merged output.
- Do not classify locale variants (hreflang) or genuinely different intents as cannibalization.
- Clusters with fewer than two confirming signals get marked "unconfirmed — review manually," never dropped.
- When the rank tracker export is missing, run with Search Console + crawl only and say so in the report header.

이것을 keyword-cannibalization-audit/SKILL.md로 Codex 스킬 폴더에 저장하고, CSV 네 개를 워크스페이스 폴더에 넣고 실행한다. 수천 페이지 규모의 전형적인 실행은 몇 분이 걸려 판정 시트를 돌려준다.

전체 스킬까지 필요 없는 경우를 위한 작은 프롬프트 두 개:

  • 내보내기 트리아지: "이것은 제 Search Console 쿼리 내보내기입니다. 제 URL 두 개 이상이 각각 노출의 10% 이상을 받은 모든 쿼리를 찾아 주세요. 쿼리, URL, 노출 분배, URL별 순위를 표로 출력하세요. 권장 사항은 만들지 마세요."
  • 클러스터 판정: "제 페이지 두 개가 모두 [쿼리]로 순위에 있습니다: [URL A]가 [X]위, [URL B]가 [Y]위입니다. [URL B]는 [날짜]에 출시됐습니다. 두 콘텐츠를 비교해 네 가지 판정 — 통합, 카노니컬, 차별화, 삭제 — 중 무엇이 해당하는지, 이유를 두 문장으로 알려 주세요."

FAQ

내 키워드에 여러 페이지가 순위를 잡습니다 — 자동으로 카니발리제이션인가요?

아닙니다. 페이지가 서로 다른 의도(조사 vs. 구매)나 다른 언어권에 응한다면 검색엔진이 잘 처리합니다. 같은 퍼널 단계에서 같은 역할을 두고 경쟁하는 페이지만 판정이 필요합니다.

카노니컬과 noindex — 무엇을 써야 하나요?

변형이 계속 접근 가능해야 하고(상품 변형, 파라미터) 그 신호가 공식 페이지로 흘러야 한다면 카노니컬. 사용자 니즈에 응하지 않는 순수 중복 페이지라면 프로그램 방식으로 적용하는 noindex. 중복 페이지가 실제 유용한 콘텐츠를 담고 있다면 둘 다 콘텐츠 통합을 대체하지 못합니다.

진 페이지를 301해야 하나요?

외부 백링크나 그 자체의 실질적 순위가 있을 때만입니다. 그렇지 않으면 고유 콘텐츠를 남는 페이지에 접고 삭제하세요. 진짜 대체가 아닌 페이지로의 301은 리다이렉트 자산을 낭비하고 사용자를 혼란스럽게 합니다.

통합 후 트래픽이 빠졌습니다 — 망가뜨린 건가요?

Google이 클러스터를 재평가하는 동안의 짧은 하락은 흔합니다. 4주 시점에 측정하세요: 남는 페이지가 그 쿼리에서 순위를 잡고 클러스터 노출이 회복됐다면 수정은 유지된 것입니다. 다른 페이지가 이기고 있다면 통합 방향이 틀린 것입니다. 문제를 키우기 전에 되돌리세요.

카니발리제이션이 AI 검색 인용에 영향을 주나요?

네. 내 URL 두 개가 경쟁하면 AI 답변은 그 사이에서 고르며, 실행에 따라 어느 쪽을 인용할지 — 아예 인용하지 않을지 — 바뀝니다. 통합은 희석된 두 개 대신 인용 준비된 강한 URL 하나를 만듭니다.

감사는 얼마나 자주 실행해야 하나요?

기준은 분기마다, 그리고 새 페이지 물결이 있을 때마다입니다. AI로 콘텐츠를 만드는 사이트는 감사를 주기적 잡일이 아니라 발행 파이프라인의 일부로 다뤄야 합니다.

저자: Clara Bennett — Auspia에서 10년차 콘텐츠 전략 실무자. 편집 시스템, 토픽 맵, 그리고 발행 프로그램이 서로 충돌하지 않도록 하는 반복 가능한 콘텐츠 운영에 대해 쓴다.

이 주제 더 보기

같은 성장 주제를 계속 살펴보세요