E-commerce 퍼싯 네비게이션(Faceted Navigation) 크롤 함정 해결
쇼핑몰의 필터, 정렬 기능이 생성하는 무한대의 조합 URL(퍼싯 네비게이션)이 유발하는 크롤 버짓 낭비와 중복 콘텐츠 문제를 해결하고, 노출이 필요한 필터 조합만 구글에 색인시키는 심화 기술을 다룹니다.
퍼싯 네비게이션이 만드는 SEO 크롤 함정
퍼싯 네비게이션(Faceted Navigation)이란 이커머스 사이트에서 사용자가 카테고리·색상·사이즈·가격·브랜드·리뷰 평점 등의 필터(Filter)를 적용하여 상품을 좁혀가는 UI 요소입니다. 사용자 경험(UX)에서는 필수이지만, SEO 관점에서는 수천~수십만 개의 URL을 자동 생성하여 심각한 기술적 문제를 일으킵니다.
퍼싯 네비게이션이 만드는 4가지 SEO 문제
| 문제 | 원인 | 영향 |
|---|---|---|
| 1. 중복 콘텐츠(Duplicate Content) | 색상=빨강&사이즈=L과 사이즈=L&색상=빨강이 다른 URL이지만 동일 결과 | 구글이 어느 URL이 정본인지 혼란, 순위 분산(Link Equity Dilution) |
| 2. 인덱스 비대화(Index Bloat) | 필터 조합 수가 기하급수적으로 증가 (10필터 × 5옵션 = 9,765,625 조합) | 저품질 페이지가 인덱스를 채우면 전체 사이트 품질 평가 하락 |
| 3. 크롤 버짓 낭비(Crawl Budget Waste) | 구글봇이 무의미한 필터 조합 URL을 계속 크롤 | 중요한 상품 페이지나 새 콘텐츠의 크롤·인덱싱이 지연됨 |
| 4. 링크 에퀴티 분산 | 하나의 카테고리에 대해 수백 개 URL이 존재 → 내부 링크·백링크 에퀴티 분산 | 카테고리 페이지의 순위 경쟁력 약화 |
실제 사례: 필터 조합 폭발
한 의류 쇼핑몰의 "여성 상의" 카테고리에 다음 필터가 있다고 가정합니다:
| 필터 | 옵션 수 |
|---|---|
| 색상 | 12개 |
| 사이즈 | 8개 |
| 가격대 | 5개 |
| 브랜드 | 20개 |
| 소재 | 6개 |
| 정렬 (가격순, 인기순 등) | 4개 |
가능한 URL 조합: 12 × 8 × 5 × 20 × 6 × 4 = 약 230,400개 — 단 하나의 카테고리에서! 사이트에 50개 카테고리가 있다면 1,150만 개의 URL이 생성될 수 있습니다.
퍼싯 URL 분류법: SEO 가치 기반 4단계
모든 필터 URL을 일괄적으로 차단하거나 허용하면 안 됩니다. SEO 가치(검색 수요)에 따라 4단계로 분류하고 각각 다른 전략을 적용합니다.
| 레벨 | 유형 | 예시 | 전략 | 검색 수요 |
|---|---|---|---|---|
| Level 1 | 카테고리 메인 | /women/tops | ✅ 인덱싱 + 크롤 허용 + 사이트맵 포함 | 높음 (월 10,000+) |
| Level 2 | 고가치 필터 | /women/tops/nike, /women/tops/black | ✅ 인덱싱 + 크롤 허용 + 정적 URL로 변환 | 중간~높음 (월 1,000+) |
| Level 3 | 저가치 필터 | /women/tops?color=red&size=L | 🔶 크롤만 허용 (noindex) 또는 canonical → Level 1 | 낮음 (월 100 이하) |
| Level 4 | 무가치 조합 | /women/tops?color=red&size=L&sort=price_asc&page=3 | ❌ 크롤 차단 (robots.txt 또는 AJAX) | 거의 없음 |
검색 수요 판별 방법
- 키워드 리서치: "나이키 여성 상의", "검정 여성 탑" 등 필터 조합에 해당하는 실제 검색 수요가 있는지 확인
- GSC 데이터: 현재 인덱싱된 필터 URL 중 실제 노출·클릭을 받는 페이지 식별
- 경쟁사 분석: Screaming Frog로 경쟁 사이트의 인덱싱된 필터 URL 패턴 분석
- 내부 검색 데이터: 사이트 내부 검색에서 자주 사용되는 필터 조합 = 외부 검색 수요 높을 가능성
해결 전략 ①: robots.txt와 크롤 차단
robots.txt를 이용한 파라미터 차단
# 정렬 파라미터 차단
User-agent: *
Disallow: /*?*sort=
Disallow: /*?*order=
# 가격 필터 차단 (저가치)
Disallow: /*?*price_min=
Disallow: /*?*price_max=
# 다중 필터 조합 차단
Disallow: /*?*color=*&size=*&brand=
# 페이지네이션 높은 페이지 차단 (선택적)
Disallow: /*?*page=[3-9]
Disallow: /*?*page=[1-9][0-9]
⚠️ robots.txt 한계
| 장점 | 한계 |
|---|---|
| 크롤 차단에 가장 효과적 — 크롤 버짓 직접 절약 | 인덱싱은 완전히 막지 못함 — 다른 페이지에서 링크되면 URL만으로 인덱싱 가능 (인덱스에는 표시되지만 콘텐츠 없이) |
| 구현이 간단, 서버 부하 없음 | 이미 인덱싱된 URL은 robots.txt로 차단해도 인덱스에서 즉시 제거되지 않음 |
| 패턴 기반 대량 차단 가능 | 너무 광범위하게 차단하면 가치 있는 URL도 함께 차단될 위험 |
Google Search Console URL 파라미터 도구
⚠️ 2022년 Google이 URL Parameter 도구를 비활성화했습니다. 현재는 robots.txt, canonical, noindex 등 다른 방법을 사용해야 합니다. Search Console에서 크롤 통계 리포트(설정 → 크롤 통계)로 구글이 크롤하는 URL 패턴을 모니터링하세요.
해결 전략 ②: Canonical 태그로 중복 통합
Canonical 태그 전략
필터 URL의 rel="canonical"을 해당 카테고리의 메인 URL로 설정하여 순위 시그널을 통합합니다.
<!-- 필터 적용된 페이지 -->
<!-- URL: /women/tops?color=red&size=L -->
<link rel="canonical" href="https://example.com/women/tops" />
Canonical 적용 가이드라인
| 시나리오 | Canonical 대상 | 이유 |
|---|---|---|
| 정렬만 변경 (?sort=price) | 정렬 없는 기본 URL | 동일 상품, 순서만 다름 → 완벽한 중복 |
| 색상 단일 필터 (?color=red) | 검색 수요 있으면 self-canonical, 없으면 카테고리 메인 | 검색 수요에 따라 Level 2 또는 Level 3 |
| 다중 필터 조합 (?color=red&size=L&brand=nike) | 카테고리 메인 또는 가장 관련성 높은 단일 필터 | 너무 구체적인 조합은 검색 수요 미비 |
| 페이지네이션 (?page=2) | self-canonical (Google 권장) | 각 페이지네이션은 고유 콘텐츠 (다른 상품 목록) |
| 동일 파라미터 순서 다름 (?a=1&b=2 vs ?b=2&a=1) | 파라미터 정렬된 표준 URL | 같은 결과를 보여주는 완벽한 중복 |
⚠️ Canonical 태그 주의사항
- Canonical은 "힌트(Hint)": 구글은 canonical 태그를 반드시 따르지 않을 수 있음. 페이지 콘텐츠가 크게 다르면 무시
- 모순되는 시그널 피하기: canonical을 설정한 URL을 sitemap에 포함하면 구글이 혼란 — canonical URL만 sitemap에 포함
- 체인 금지: A → B → C canonical 체인은 B에서 끊길 수 있음. 항상 최종 canonical URL을 직접 지정
- 교차 도메인 canonical: 같은 사이트 내에서만 사용. 다른 도메인으로의 canonical은 특수한 경우에만
해결 전략 ③: noindex와 AJAX 비크롤링
noindex 활용 전략
<meta name="robots" content="noindex, follow">를 사용하면 해당 페이지는 인덱싱되지 않지만, 페이지 내 링크는 따라감(Follow)으로써 상품 페이지로의 링크 에퀴티는 유지됩니다.
| 적합한 경우 | 부적합한 경우 |
|---|---|
| Level 3 필터(저가치) — 크롤은 허용하되 인덱싱 방지 | Level 4 필터(무가치) — 크롤 자체를 막아야 크롤 버짓 절약 |
| 필터 페이지에서 상품 페이지로의 내부 링크가 중요한 경우 | 수만 개의 URL — noindex여도 크롤 비용 발생 |
| 이미 인덱싱되어 제거가 필요한 경우 | robots.txt로 이미 차단된 URL (noindex를 발견 못함) |
핵심 원칙: noindex는 인덱싱을 막지만 크롤을 막지 않습니다. 구글봇이 페이지를 크롤해야 noindex 태그를 발견하므로, 수만 개의 필터 URL에 noindex만 적용하면 크롤 버짓 낭비가 여전합니다. 크롤 차단이 필요하면 robots.txt 또는 AJAX를 사용하세요.
AJAX/JavaScript 방식: 크롤 없는 필터링
가장 권장되는 접근법 중 하나는 SEO 가치가 없는 필터를 AJAX/JavaScript로 구현하여 URL을 생성하지 않는 것입니다.
| 구현 방식 | 설명 | 장단점 |
|---|---|---|
| Hash Fragment (#) | /women/tops#color=red — # 이후는 서버로 전송되지 않음 | ✅ 완벽한 크롤 차단 / ❌ 뒤로 가기, 공유 불편 |
| History API (pushState) | URL을 ?color=red로 바꾸되 <a> 태그를 생성하지 않음 | ✅ UX 유지 / ⚠️ 잘못 구현하면 JS 렌더링 시 크롤 가능 |
| 동적 폼 POST | 필터를 POST 요청으로 처리 — GET URL이 생성되지 않음 | ✅ URL 완전 방지 / ❌ 필터 상태 공유·북마크 불가 |
하이브리드 접근법 (추천)
- Level 1~2 필터: 서버사이드 렌더링 + 정적 URL +
<a>태그 → 크롤·인덱싱 허용 - Level 3~4 필터: AJAX/JavaScript로 처리 + URL 변경 없음 또는 Hash Fragment → 크롤 방지
해결 전략 ④: 정적 SEO 랜딩 페이지 생성
Level 2 필터(고가치, 검색 수요 있음)는 동적 파라미터 URL 대신 깨끗한 정적 URL로 변환하고, SEO 최적화된 고유 콘텐츠를 추가하여 별도의 랜딩 페이지로 만듭니다.
동적 vs 정적 URL 비교
| 동적 URL | 정적 URL |
|---|---|
| /women/tops?brand=nike&color=black | /women/black-nike-tops |
| /shoes?type=running&brand=adidas | /shoes/adidas-running |
| /electronics?category=laptop&price=under-1000000 | /laptops/budget-under-100만원 |
정적 랜딩 페이지에 필요한 고유 콘텐츠
| 요소 | 설명 | 예시 |
|---|---|---|
| 고유 Title | 해당 필터 조합에 맞는 키워드 포함 타이틀 | "나이키 블랙 여성 상의 | 2025 인기 제품 모음" |
| 고유 H1 | Title과 일관된 H1 태그 | "나이키 블랙 여성 상의 컬렉션" |
| 소개 텍스트 | 100~300단어의 해당 카테고리/필터에 대한 설명, 구매 가이드, 선택 팁 | "나이키 블랙 여성 상의는 트레이닝부터 캐주얼까지..." |
| 고유 Meta Description | 행동 유도 포함 설명 | "나이키 블랙 여성 상의 30종 비교. 무료 배송..." |
| 상품 목록 | 해당 필터에 맞는 상품들 | 자동으로 필터링된 상품 리스트 |
| FAQ | 해당 카테고리에 대한 자주 묻는 질문 | "나이키 사이즈는 정사이즈인가요?" |
⚠️ 주의: 대량 생성의 함정
- 검색 수요가 없는 필터 조합까지 정적 페이지를 만들면 → Thin Content + Doorway Page 리스크
- 소개 텍스트가 템플릿만 바꿔서 작성되면 → Google이 패턴을 감지하여 페널티 가능
- 반드시 검색 수요 데이터를 기반으로 생성할 필터 조합을 선별하세요
- Programmatic SEO의 원칙 적용: "페이지당 고유 가치"가 있어야 합니다
종합 구현 전략과 기술 스택별 가이드
전략 조합 매트릭스
| 필터 유형 | URL 생성 | Canonical | noindex | robots.txt | 사이트맵 |
|---|---|---|---|---|---|
| 카테고리 메인 | 정적 URL | self-canonical | - | ✅ 허용 | ✅ 포함 |
| 고가치 필터 (브랜드, 주요 색상) | 정적 URL | self-canonical | - | ✅ 허용 | ✅ 포함 |
| 저가치 필터 (사이즈+색상 조합) | 파라미터 URL | → 카테고리 메인 | noindex, follow | ✅ 허용 | ❌ 미포함 |
| 정렬 (가격순, 인기순) | 파라미터 URL | → 정렬 없는 URL | noindex | ❌ 차단 | ❌ 미포함 |
| 페이지네이션 (page=2, 3...) | 파라미터 URL | self-canonical | - | ✅ 허용 | ✅ 포함 (주요 페이지만) |
| 다중 필터 조합 | AJAX (URL 생성 X) | - | - | - | ❌ 미포함 |
기술 스택별 구현 팁
| 플랫폼 | 핵심 설정 |
|---|---|
| Shopify | 기본 필터가 ?variant= 파라미터 생성 → 별도 앱(Smart SEO, Boost Product Filter)으로 관리. Liquid 테마에서 canonical 태그 커스터마이징 |
| WooCommerce | 기본 ?pa_color= 파라미터 → Yoast SEO에서 파라미터 canonical 관리. WP All Import 등으로 정적 URL 페이지 대량 생성 가능 |
| Next.js (커스텀) | Server Component에서 SSR로 Level 1~2 랜딩 페이지 생성. 클라이언트 컴포넌트에서 Level 3~4 필터를 AJAX로 처리. generateMetadata()로 페이지별 고유 메타데이터 |
| Magento | 내장 Layered Navigation 모듈의 URL 재작성 설정. robots.txt에 Disallow: /*?* 후 허용할 패턴만 Allow: |
| 카페24/NHN고도 | 한국형 솔루션은 필터 URL 제어가 제한적 → robots.txt + meta canonical 조합이 현실적 대안 |
모니터링과 지속적 관리
- GSC 인덱스 현황: "유효" 페이지 수가 예상 범위 내인지 확인 (상품 수 + 카테고리 수 + Level 2 랜딩 페이지)
- GSC "크롤 통계": 크롤 요청의 URL 패턴 확인 — 필터 URL에 과도한 크롤이 있는지
- Screaming Frog 사이트 감사: 인덱싱 가능한 필터 URL 수량과 canonical 일관성 확인
- "Crawled - Not Indexed" 보고서: 구글이 크롤했지만 인덱싱하지 않은 URL → Level 4 후보
- site: 명령어:
site:example.com inurl:?color=로 인덱싱된 필터 URL 수 확인
자주 묻는 질문 (FAQ)
Q. "모든 필터 URL을 noindex 처리하면 되지 않나요?" — 가장 흔한 실수
noindex는 크롤을 막지 않습니다. 구글봇이 noindex 태그를 발견하려면 페이지를 크롤해야 하므로, 수만 개의 필터 URL에 전부 noindex를 적용해도 크롤 버짓은 여전히 낭비됩니다. (2) noindex, follow는 링크 에퀴티를 전달하지만, 장기적으로 구글은 noindex 페이지의 follow도 무시하는 경향이 있습니다. 최선의 방법은 robots.txt 또는 AJAX로 크롤 자체를 차단하되, SEO 가치 있는 Level 2 필터는 정적 URL로 별도 구축하는 것입니다.Q. robots.txt로 차단한 URL이 Google 인덱스에 여전히 나타납니다. 왜 그런가요?
<a> 태그 제거 (AJAX로 전환), (2) 이미 인덱싱된 URL은 GSC에서 일시적 삭제 요청, (3) robots.txt 차단을 해제하고 noindex를 사용하여 구글이 크롤 → noindex 발견하게 한 후 인덱스에서 제거 → 다시 robots.txt 차단 (고급 기법).Q. 페이지네이션에 rel="next"/"prev"를 사용해야 하나요?
<a> 링크 병행)을 추천합니다.Q. 파라미터 순서가 다른 URL(예: ?a=1&b=2 vs ?b=2&a=1)은 어떻게 처리하나요?
new URLSearchParams(sorted).toString().