왜 크롤 예산이 중요한가: 기술 SEO의 핵심을 짚고 가기
검색 엔진이 당신의 사이트를 모두 동일하게 크롤링하지는 않습니다. 크롤러는 매일 “얼마나, 무엇을, 언제” 크롤링할지 스스로 결정하며, 이 크롤 예산(crawl budget)을 효율적으로 사용하는가가 인덱싱 속도와 품질, 나아가 유기적 트래픽에 직접적인 영향을 미칩니다. 특히 대규모 사이트(이커머스, 미디어, 마켓플레이스), 빈번한 콘텐츠 업데이트 사이트, 파라미터/필터가 많은 사이트는 크롤 비효율이 쌓이면 새로운 페이지가 늦게 발견되거나, 중요하지 않은 URL에 크롤이 낭비되는 문제가 커집니다.
이 글에서는 XML 사이트맵과 robots.txt를 전략적으로 최적화하여 크롤 예산을 절약하고 중요한 URL에 크롤을 재배분하는 실전 방법을 자세히 다룹니다. 실제 설정 예시, 체크리스트, 모니터링 지표까지 바로 적용할 수 있는 내용으로 구성했습니다.
크롤 예산 이해하기: 크롤 속도와 수요의 합
- 크롤 속도 제한(Crawl rate limit): 서버가 감당할 수 있는 수준에서 크롤러가 얼마나 빠르게 요청을 보낼지 결정합니다. 서버 응답이 느리거나 5xx 오류가 많으면 속도를 자동으로 낮춥니다.
- 크롤 수요(Crawl demand): 새로움·인기·링크 신호 등으로 특정 URL을 얼마나 자주 크롤해야 하는지의 필요입니다. 자주 업데이트되거나 링크가 많은 페이지는 더 자주 크롤됩니다.
크롤 예산을 낭비하는 대표 원인:
- 중복/얕은(facets, sort, filter) URL 폭증
- 3xx 체인, 4xx/5xx 비율 증가
- 내부 검색 결과, 장바구니, 로그인 등 가치 낮은 섹션 크롤
- 자바스크립트 렌더링 장애로 인한 재시도 다발
해결의 핵심은 간단합니다. “중요하고 인덱스 가능한 URL만 빠르게, 자주, 안정적으로” 크롤되도록 길을 열어주고, 나머지는 정중히 비켜달라고 말하는 것. 이를 수행하는 도구가 바로 XML 사이트맵과 robots.txt입니다.
XML 사이트맵 vs robots.txt: 역할과 한계
- XML 사이트맵: “이게 내 핵심 URL 목록이야. 최근 업데이트 시각은 이거야.”라고 알려주는 포지티브 신호. 인덱스 가능하고 200 OK이며 정규 URL(canonical)만 담아야 합니다. 강제는 아니지만 강력한 힌트입니다.
- robots.txt: “여긴 크롤하지 마.”라고 말하는 네거티브 신호. 크롤을 차단하지만, 인덱싱을 직접 차단하지는 않습니다. 즉, robots.txt로 막힌 URL은 메타 태그를 읽히지 않아 noindex 전달이 되지 않습니다.
중요한 사실:
- Google은 robots.txt의 noindex 지시어를 지원하지 않습니다. noindex는 페이지가 크롤되어야만 메타 로봇 태그나 X-Robots-Tag로 인식됩니다.
- CSS/JS/이미지 등 렌더링 필수 리소스를 막으면 품질 평가가 악화될 수 있습니다.
- sitemap의 changefreq/priority는 Google에서 거의 무시됩니다. lastmod가 상대적으로 유용합니다.
현황 진단: 지금 어디서 크롤을 낭비하고 있나
빠르게 진단하는 체크리스트:
- Google Search Console(GSC)
- 색인 상태/페이지 인덱싱: “제출됨이나 인덱스되지 않음”, “크롤됨이나 인덱스되지 않음”, “robots.txt에 의해 차단됨” 확인
- 사이트맵 보고서: 제출한 URL 수 대비 색인된 URL 수, 오류 확인
- 크롤 통계 보고서: 응답 코드 분포(200/3xx/4xx/5xx), 파일 유형별 요청, 호스트 로드
- 서버 로그 분석(필수): 실제 Googlebot/Bingbot 요청을 필터링하여
- 200 OK 대비 3xx/4xx/5xx 비율
- 파라미터/필터 URL 비중
- 렌더링 리소스 차단 여부
- 크롤 낭비 비율(중요도 낮은 URL의 요청 비중)
- 크롤러(예: Screaming Frog, Sitebulb): 정규화(canonical), hreflang, 메타 로봇, 상태 코드, 내부 링크 구조 점검
- 대형 사이트: faceted navigation 설계, 내부 검색 결과 노출 여부, 무한 스크롤 대안(서버 렌더링/페이지네이션) 점검
XML 사이트맵 최적화: “이 URL부터 봐주세요”
기본 원칙
- 인덱스 가능 페이지만 포함
- 200 OK, 정규 URL, noindex 아님, robots.txt로 차단되지 않음
- 오류/리다이렉트 금지: 3xx/4xx/5xx, canonical이 다른 URL은 제외
- 크기 제한 준수: 파일당 50,000 URL 또는 50MB(압축 전). 많으면 분할 + 인덱스 사이트맵 사용
- GZIP 압축, 캐시 헤더 설정 권장
- 자동 생성/배포 파이프라인 구축: 컨텐츠 변경 시 lastmod 자동 업데이트
lastmod 활용법
- 실제 콘텐츠 수정 시각으로 정확히 유지
- 템플릿/UI 사소한 변경으로 lastmod를 업데이트하지 않기
- 대형 사이트: “최근 변경” 사이트맵과 “고정/레거시” 사이트맵 분리하여 리소스를 집중
예시(사이트맵 인덱스 + 페이지 사이트맵):
# sitemap_index.xml
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://www.example.com/sitemaps/sitemap-pages-1.xml.gz</loc>
<lastmod>2025-10-01T10:14:00+00:00</lastmod>
</sitemap>
<sitemap>
<loc>https://www.example.com/sitemaps/sitemap-products-2025-10-01.xml.gz</loc>
<lastmod>2025-10-01T10:14:00+00:00</lastmod>
</sitemap>
</sitemapindex>
# sitemap-pages-1.xml
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.example.com/</loc>
<lastmod>2025-09-30T08:00:00+00:00</lastmod>
</url>
<url>
<loc>https://www.example.com/about</loc>
<lastmod>2025-09-15T12:30:00+00:00</lastmod>
</url>
</urlset>
타입별 분리: 크롤 집중력 높이기
- pages, products, categories, blog, faq 등 섹션별 사이트맵 분리
- 이미지/비디오/뉴스는 별도 확장 네임스페이스 사용
- 대형 이커머스: “신규/재입고/가격변경” 전용 사이트맵을 일 단위로 생성
이미지/비디오 사이트맵 예시:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url>
<loc>https://www.example.com/product/widget-123</loc>
<image:image>
<image:loc>https://cdn.example.com/images/widget-123-main.jpg</image:loc>
<image:title>위젯 123 메인 이미지</image:title>
</image:image>
<video:video>
<video:content_loc>https://cdn.example.com/videos/widget-123.mp4</video:content_loc>
<video:title>위젯 123 사용법</video:title>
<video:description>빠른 시작 가이드</video:description>
<video:thumbnail_loc>https://cdn.example.com/thumbnails/widget-123.jpg</video:thumbnail_loc>
</video:video>
</url>
</urlset>
뉴스 사이트맵 팁:
- 최근 48시간 내 기사만 포함(언론사/뉴스 승인 전제)
- 중복 URL 금지, 기사 제목은 짧고 명확하게
국제화와 hreflang: 사이트맵으로 깔끔하게 관리
사이트맵 내 hreflang 선언은 다국어/다지역 신호를 일관되게 유지하는 데 효과적입니다. 기본 네임스페이스에 xhtml 추가:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://www.example.com/ko/product/widget-123</loc>
<xhtml:link rel="alternate" hreflang="ko" href="https://www.example.com/ko/product/widget-123" />
<xhtml:link rel="alternate" hreflang="en" href="https://www.example.com/en/product/widget-123" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://www.example.com/product/widget-123" />
<lastmod>2025-09-30</lastmod>
</url>
</urlset>
주의:
- 상호참조 일치(ko에서 en을 가리키면 en에서도 ko를 가리켜야 함)
- 대소문자/슬래시 통일, 정규 URL만 사용
파라미터·페이지네이션·무한 스크롤
- 파라미터 URL(?sort=, &color=)은 사이트맵에 포함하지 않습니다. 정규 URL만 포함.
- page=2, page=3 등 페이지네이션은 각 페이지가 정규 URL이고 인덱스 대상이면 포함 가능합니다. 단, 중복/얕은 콘텐츠라면 첫 페이지만 포함하는 전략 고려.
- 무한 스크롤은 서버 렌더링 혹은 접근 가능한 페이지네이션 URL을 제공하고, 그 URL을 사이트맵에 포함하세요.
배포와 참조
- robots.txt에 사이트맵 위치 명시(여러 개 가능)
- 각 서브도메인/프로토콜(https)별로 해당 호스트의 robots.txt에서 참조
- Google 핑 엔드포인트는 더 이상 필요/권장되지 않습니다(제출은 GSC 또는 robots 참조로 충분). Bing은 여전히 ping 및 IndexNow를 활용할 수 있음.
robots.txt 내 참조 예시:
Sitemap: https://www.example.com/sitemap_index.xml
Sitemap: https://blog.example.com/sitemap.xml
robots.txt 최적화: “여긴 건너뛰세요”
기본 문법과 우선순위
- User-agent: 봇 지정(예: Googlebot, Bingbot, *)
- Allow/Disallow: 경로 패턴 허용/차단
- 와일드카드: * (임의 문자열), $ (문자열 끝)
- Google은 crawl-delay를 지원하지 않습니다. Bing 등 일부 엔진만 제한적으로 사용
상태 코드 중요:
- 200 OK: 정상
- 4xx(404 포함): 대부분의 봇은 제한 없이 크롤(규칙 없음으로 간주)
- 5xx: Google은 안전을 위해 크롤을 줄일 수 있음 → 절대 5xx 되지 않게 안정적 서빙
흔한 차단 대상과 패턴
- 내부 검색 결과: /search, ?q=
- 장바구니/체크아웃/계정: /cart, /checkout, /my-account
- 필터·정렬 파라미터: ?sort=, ?filter=, ?page_size=
- 프린트/프리뷰: /print/, ?view=amp(별도 정책에 따라), /preview
- 관리자 페이지: /admin, /wp-admin 등
예시(이커머스):
User-agent: *
# 인덱싱 가치 낮은 파라미터 차단
Disallow: /*?*sort=
Disallow: /*?*filter=
Disallow: /*?*color=
Disallow: /*?*size=
Disallow: /*?*utm_
Disallow: /*?*sessionid=
# 내부 검색
Disallow: /search
# 장바구니/체크아웃
Disallow: /cart
Disallow: /checkout
# 프린트/프리뷰
Disallow: /print/
Disallow: /*?*preview=
# 렌더링 필수 리소스는 허용
Allow: /static/css/
Allow: /static/js/
Sitemap: https://www.example.com/sitemap_index.xml
워드프레스 기반 예시:
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php
Disallow: /?s=
Disallow: /search/
Disallow: /*?*replytocom=
Disallow: /*?*utm_
Sitemap: https://www.example.com/sitemap_index.xml
주의해야 할 함정:
- noindex를 robots.txt로 전달하려 해서는 안 됩니다. noindex는 메타 태그나 X-Robots-Tag로 페이지가 크롤되어야 인식됩니다.
- 인덱싱하고 싶은 페이지나 필수 리소스를 차단하지 마세요.
- 너무 광범위한 패턴(예: Disallow: /*?)은 의도치 않게 중요한 페이지도 차단할 수 있습니다. 정규식처럼 과격하게 쓰지 말고 구체적으로.
봇별 제어와 한계
- 특정 봇(예: Googlebot-Image, Googlebot-News)에만 다른 규칙을 줄 수 있습니다.
- Google의 크롤 속도는 robots.txt로 제한할 수 없습니다. 서버가 과부하라면 503/429 일시 응답, 캐시/압축 최적화, CDN, 그리고 장기적 크롤 효율 개선으로 해결해야 합니다.
사이트맵과 robots.txt의 일관성: 모순을 제거하라
- 사이트맵에 있는 URL이 robots.txt로 차단되면 GSC에 “제출됨이나 robots.txt에 의해 차단됨” 경고가 뜹니다. 즉시 수정하세요.
- canonical이 다른 URL은 사이트맵 제외. 사이트맵에는 “최종 정규 URL”만 담기.
- noindex 처리 플로우:
- 1단계: robots 허용 상태에서 meta robots noindex 또는 X-Robots-Tag: noindex 적용
- 2단계: 색인 제거 확인 후(커버리지 리포트) 사이트맵에서 제거
- 3단계(선택): 오래된 페이지 크롤 절약이 필요하면 robots로 차단
로그와 GSC로 측정하는 크롤 예산 성과
핵심 KPI:
- 크롤 효율 비율: 크롤된 URL 중 “인덱스 가능한 200 OK HTML” 비중 상승
- 크롤 낭비율: 파라미터/중복/가치 낮은 URL에 대한 요청 비중 하락
- 신규 URL 발견→색인까지 평균 소요 시간 단축
- 3xx 체인 감소, 4xx/5xx 비율 하락
- 평균 응답 시간 개선(서버 부하 완화)
- GSC 색인 커버리지 경고/오류 감소
- 신규 콘텐츠의 노출/클릭 증가
실전 모니터링 루틴:
- 주간: GSC 크롤 통계(응답 코드, 파일 유형, 목적) 확인
- 주간: 로그에서 Googlebot 요청 상위 50개 URL 패턴 점검(필터 URL이 상위에 오르면 즉각 대응)
- 월간: 사이트맵 “제출 대비 색인” 비율 트렌드
- 수시: “제출됨이나 인덱스되지 않음” URL 샘플링하여 원인 파악(품질, 중복, 렌더링, 내부 링크)
대규모 사이트를 위한 운영 전략
- 증분 사이트맵: 일자별/주차별로 “최근 변경”만 포함한 사이트맵 생성. 인덱스 사이트맵에서 참조.
- 304 Not Modified 적극 활용: ETag/Last-Modified 설정으로 변경 없는 자원에 대한 304 응답을 제공해 대역폭 절감.
- 재고·가격 변동 빠른 이커머스:
- 품절 시 404가 아닌 200 유지 + 대체상품 추천 or 410 명확 제거 정책 일관성 유지
- 410은 크롤낭비 줄이는 데 도움(더 이상 재크롤 필요 낮음)
- 자바스크립트 렌더링:
- SSR/하이브리드 렌더링으로 초기 HTML에 핵심 콘텐츠/링크 포함
- JS 렌더링이 필요한 URL일수록 사이트맵로 “발견”을 보조
- 국제 사이트:
- 지역별 하위폴더/서브도메인 각각에 robots.txt와 사이트맵 제공
- hreflang 상호참조 검증 자동화(빌드 파이프라인에서 검증 스텝 추가)
- IndexNow/Bing:
- 대량 업데이트 사이트는 IndexNow 키 설정 후 변경 URL을 즉시 푸시(Bing, Seznam 등 지원). Google에는 영향 없지만 Bing 발견 가속에 유리.
구현 체크리스트: 4주 실행 플랜
1주차 — 진단
- GSC 크롤/커버리지/사이트맵 리포트 수집
- 서버 로그 30일치 추출, Googlebot/Bingbot 필터링
- 파라미터/필터 URL 패턴 목록화, 렌더링 리소스 차단 여부 확인
2주차 — XML 사이트맵 리빌드
- 정규 200 OK URL만 포함하도록 생성 로직 수정
- 섹션별 분리, 이미지/비디오/국제화 지원 반영
- lastmod 정확화(콘텐츠 DB mtime 연동)
- 대형 사이트: 증분 사이트맵 설계(일 단위 파일 + 인덱스 사이트맵)
- 배포: GZIP, Cache-Control: max-age=3600 설정
3주차 — robots.txt 정교화
- 내부 검색, 장바구니, 필터 파라미터, 프리뷰 등 차단
- 렌더링 필수 리소스는 Allow 보장
- 서브도메인별 별도 robots.txt 구성
- 스테이징/프리프로덕션 환경은 전체 Disallow + Basic Auth로 보호
4주차 — 검증/튜닝
- GSC 경고(제출됨이나 robots에 의해 차단) 해소
- 로그에서 필터 URL 크롤 비중 변화 체크
- 인덱싱 지연 URL 샘플링, 내부 링크/콘텐츠 품질 튜닝
- 필요한 경우 추가 패턴 세분화 또는 완화
서버/헤더 레벨 베스트 프랙티스
Nginx로 sitemap/robots 캐시와 압축:
location = /robots.txt {
root /var/www/site;
add_header Cache-Control "max-age=86400, public";
}
location ~* /sitemaps/.*\.xml(\.gz)?$ {
root /var/www/site;
gzip_static on; # sitemap.xml.gz 서빙
add_header Cache-Control "max-age=3600, public";
types { application/xml xml; }
}
PDF 등 비HTML 파일 noindex(응답 헤더):
add_header X-Robots-Tag "noindex, noarchive, nosnippet";
조건부 요청(304) 응답을 위한 헤더:
- Last-Modified와 ETag를 정적 파일/페이지에 설정
- 애플리케이션 서버에서 If-Modified-Since/If-None-Match 처리
문제 해결 가이드: 자주 겪는 이슈와 해법
- GSC “제출됨이나 robots.txt에 의해 차단됨”
- 사이트맵에서 해당 URL 제거하거나 robots 규칙 수정(둘 중 하나 선택)
- 사이트맵에 404/301 다수 포함
- 생성 로직에서 URL 유효성 검사 추가(200 OK만 통과)
- 카탈로그 삭제/재고 정책 변경 시 사이트맵 즉시 업데이트
- lastmod가 무의미하게 매일 변경
- 템플릿 빌드 시간 대신 콘텐츠 수정 시각만 반영하도록 데이터 소스 수정
- 파라미터 URL 폭발
- 내부 링크에서 파라미터 사용 최소화
- 정렬/필터는 canonical을 기본 카테고리로 지정
- robots.txt로 대표적인 파라미터 차단(세분화)
- 자주 쓰지 않는 필터는 nofollow 링크? 주의: nofollow는 힌트일 뿐. 근본 해결은 링크 구조와 robots 제어
- 무한 스크롤로 깊은 콘텐츠 미발견
- 페이지네이션 URL 제공(예: /category?page=2) 및 내부 링크 삽입
- 해당 페이지들을 사이트맵에 포함
- 렌더링 깨짐
- robots.txt에서 /static/js, /static/css, 폰트, 이미지 경로 Allow
- CSP/쿠키/지역 차단으로 봇 렌더링 방해하지 않기
실전 예시: 중형 이커머스의 개선 시나리오
배경:
- 제품 20만 SKU, 카테고리/브랜드/색상/가격 필터, 내부 검색 비중 높음
- 로그 분석 결과: 봇 요청의 42%가 ?sort=, ?color= 등의 파라미터 URL로 낭비
- GSC에서 “제출됨이나 인덱스되지 않음” 증가
조치:
- 사이트맵: products, categories, blog로 분리. 신규/가격변경 제품만 모은 daily-incremental sitemap 추가. lastmod 정확화.
- robots.txt: sort/color/size/price 파라미터, 내부 검색, 프린트, 장바구니 차단. 렌더링 리소스 Allow.
- 내부 링크: 필터 링크에 rel=“nofollow”는 최소화하고, 기본 카테고리 canonical 유지.
- 서버: sitemap.xml.gz 캐시/압축, 정적 리소스 캐시 최적화.
결과(6주):
- 로그 기준 크롤 낭비율 42% → 18%로 감소
- 신규 상품의 색인까지 평균 3.2일 → 1.1일
- 3xx 체인 정리 후 GSC 크롤 응답 시간 24% 개선
- “제출됨이나 인덱스되지 않음” 경고 37% 감소
고급 팁: 더 미세하게 크롤 최적화하기
- 계절/캠페인 페이지 우선순위: 캠페인 기간에 해당 URL들을 별도 “priority sitemap”에 묶어 lastmod를 최신으로 유지(강제는 아니지만 수요 신호 강화)
- 오래된 저품질 페이지 정리: noindex → 제거 → 내부 링크 제거 → 필요 시 robots 차단 순으로 단계적 정리
- 파라미터 화이트리스트: 정말 필요한 파라미터만 링크 노출. 나머지는 JS 상태 관리로 처리
- 리디렉션 관리: 301 체인을 1홉으로 줄이고, 사이트맵에는 최종 목적지 URL만 포함
- 이미지 CDN: robots에서 CDN 도메인의 리소스를 차단하지 않았는지 확인. 이미지 검색 트래픽이 중요하다면 image sitemap 병행
실행을 돕는 미니 체크리스트
-
사이트맵
- 200 OK, 정규 URL만 포함
- lastmod 정확, 섹션별/증분 분리
- 이미지/비디오/hreflang 필요 시 포함
- GZIP + Cache-Control 설정
- robots.txt와 일관성
-
robots.txt
- 내부 검색/장바구니/프리뷰 등 차단
- 파라미터 차단 패턴 점검(과도 차단 주의)
- 렌더링 리소스 Allow
- 서브도메인/프로토콜별 개별 파일
- 200 OK 안정적 서빙
-
모니터링
- GSC 크롤 통계/커버리지 주간 점검
- 서버 로그로 크롤 낭비율/오류율 추적
- 인덱싱 지연 URL 샘플링 원인 분석
- KPI 개선 추세 기록
마치며: “정확한 지도를 건네고, 막을 문은 확실히 닫아라”
XML 사이트맵은 봇에게 가장 중요한 길부터 먼저 알려주는 지도입니다. robots.txt는 들어오지 말아야 할 문을 닫는 경비입니다. 이 둘을 함께 정교하게 다루면, 크롤러는 적은 비용으로 핵심 콘텐츠를 더 자주, 더 빠르게 파악할 수 있습니다. 그 결과는 인덱싱 품질 개선, 신속한 노출, 더 많은 유기 트래픽으로 돌아옵니다.
오늘 바로 다음을 실행하세요:
- GSC와 로그로 낭비 패턴 파악,
- 사이트맵을 “정규·200·최신” 원칙으로 재구성,
- robots.txt로 필터/내부 검색/비가치 구역 차단,
- 2주 간 모니터링 후 패턴을 세분화.
기술 SEO의 승부처는 “봇의 시간을 어디에 쓰게 만들 것인가”입니다. 당신의 XML 사이트맵과 robots.txt가 그 답을 만듭니다.