검색 엔진 최적화를 한다면서 robots.txt와 sitemap.xml의 차이를 정확히 모르고 설정하는 개발자들이 많다. 둘 다 SEO와 크롤링 제어에 필수적이지만, 역할이 완전히 다르다는 걸 모르는 경우가 대부분이다. 심하면 한쪽만 설정하거나, 둘의 설정이 충돌해서 중요한 페이지가 검색 결과에서 누락되는 사태까지 벌어진다. 이번에는 robots.txt와 sitemap.xml이 정확히 뭔지, 어떤 차이가 있는지, 언제 뭘 써야 하는지 완벽하게 정리해서 소개하겠다.

 

robots.txt와 sitemap.xml의 근본적인 차이
robots.txt는 검색 엔진 봇(크롤러)에게 "이 페이지는 크롤링하지 마" 라고 지시하는 파일이다. 반면 sitemap.xml은 "이 페이지들이 있으니까 꼭 방문해 줘" 라고 알려주는 지도 같은 파일이다. 즉, robots.txt는 '차단'이고 sitemap.xml은 '안내'다.

robots.txt 파일은 서버 루트 디렉토리(/robots.txt)에 놓이는 텍스트 파일이고, sitemap.xml은 보통 /sitemap.xml이나 특정 경로에 놓인다. 둘 다 검색 엔진이 웹사이트 접근 시 가장 먼저 확인하는 파일들이다.

 

두 파일의 용도 비교표
항목 robots.txt sitemap.xml
목적 크롤링 차단/제한 크롤링 유도/안내
역할 어떤 페이지를 "크롤링하지 말 것" 어떤 페이지를 "꼭 크롤링할 것"
형식 텍스트 파일 (규칙 기반) XML 파일 (URL 나열)
위치 도메인 루트(/robots.txt) 일반적으로 루트 또는 /sitemap.xml
검색 봇 필수여부 선택 (권장하지만 의무 아님) 선택 (권장하지만 의무 아님)
순위 영향 간접 영향 (크롤링 못한 페이지는 검색 불가) 간접 영향 (발견하기 쉬운 페이지)

 

robots.txt 작성법 - 정확히 뭘 차단하나

robots.txt는 단순한 텍스트 파일이지만, 규칙을 정확히 알아야 제대로 작동한다. 가장 기본적인 구조는 이렇다.

✗ 잘못된 예 - 전체 사이트 차단

User-agent: *
Disallow: /

이렇게 하면 모든 검색 봇이 웹사이트 전체를 크롤링할 수 없다. 개발 중인 임시 서버에나 써야 할 설정이다.

✓ 올바른 예 - 관리자 페이지와 임시 파일만 차단

User-agent: *
Disallow: /admin/
Disallow: /private/
Disallow: /temp/
Disallow: /*.pdf$

User-agent: AhrefsBot
Disallow: /

Sitemap: https://example.com/sitemap.xml

이 설정의 의미는:

  • /admin/, /private/, /temp/ 디렉토리는 모든 봇이 크롤링 금지
  • .pdf 파일도 크롤링 금지
  • AhrefsBot(특정 봇)은 전체 차단
  • sitemap.xml 파일 위치를 알려주기

실제 상황별 예제

# 검색 결과 중복 방지 - 페이지네이션 차단
User-agent: *
Disallow: /*?page=
Disallow: /*sort=

# 사용자 계정 페이지 차단
User-agent: *
Disallow: /user/profile/
Disallow: /user/settings/

# 특정 매개변수 차단
User-agent: *
Disallow: /*?utm_
Disallow: /*?ref=

Sitemap: https://example.com/sitemap.xml

 

sitemap.xml 작성법 - URL을 정확히 등록하기

sitemap.xml은 XML 형식으로 크롤링하길 원하는 모든 URL을 나열한다. 검색 엔진에 "이 페이지들을 놓치지 말고 크롤링해 줘" 라고 요청하는 것이다.

✗ 잘못된 예 - URL 누락이 많음

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com</loc>
  </url>
  <url>
    <loc>https://example.com/about</loc>
  </url>
</urlset>

블로그 포스트나 상품 페이지 같은 동적 콘텐츠가 완전히 빠져 있다. 이렇게 하면 검색 엔진이 중요한 페이지를 발견하지 못한다.

✓ 올바른 예 - 모든 중요 페이지 포함

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com</loc>
    <lastmod>2024-01-15</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://example.com/blog/article-1</loc>
    <lastmod>2024-01-10</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://example.com/blog/article-2</loc>
    <lastmod>2024-01-12</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
</urlset>

각 요소의 의미:

  • <loc>: 페이지의 절대 URL (필수)
  • <lastmod>: 마지막 수정 날짜 (YYYY-MM-DD 형식)
  • <changefreq>: 업데이트 빈도 (always, hourly, daily, weekly, monthly, yearly, never)
  • <priority>: 상대적 우선순위 (0.0~1.0, 기본값 0.5)

 

PHP로 동적 sitemap.xml 생성하기

수십 개의 URL이 있다면 수동으로 작성하는 건 비효율적이다. 데이터베이스에서 데이터를 가져와 자동으로 sitemap을 생성해야 한다.

<?php
// 데이터베이스 연결
$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'pass');

// 모든 블로그 포스트 가져오기
$stmt = $pdo->query('SELECT id, slug, updated_at FROM posts WHERE published = 1 ORDER BY updated_at DESC');
$posts = $stmt->fetchAll(PDO::FETCH_ASSOC);

// XML 헤더 설정
header('Content-Type: application/xml; charset=utf-8');

echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

// 홈페이지
echo '<url>';
echo '<loc>https://example.com</loc>';
echo '<priority>1.0</priority>';
echo '<changefreq>weekly</changefreq>';
echo '</url>';

// 고정 페이지들
$static_pages = ['about', 'contact', 'services'];
foreach ($static_pages as $page) {
    echo '<url>';
    echo '<loc>https://example.com/' . htmlspecialchars($page) . '</loc>';
    echo '<priority>0.7</priority>';
    echo '<changefreq>monthly</changefreq>';
    echo '</url>';
}

// 블로그 포스트들
foreach ($posts as $post) {
    echo '<url>';
    echo '<loc>https://example.com/blog/' . htmlspecialchars($post['slug']) . '</loc>';
    echo '<lastmod>' . date('Y-m-d', strtotime($post['updated_at'])) . '</lastmod>';
    echo '<priority>0.8</priority>';
    echo '<changefreq>monthly</changefreq>';
    echo '</url>';
}

echo '</urlset>';
?>

이 파일을 /sitemap.php로 저장한 후, .htaccess에서 /sitemap.xml 요청을 이 PHP 파일로 라우팅하면 된다.

.htaccess 설정

RewriteEngine On
RewriteRule ^sitemap.xml$ /sitemap.php [L]

 

두 파일이 충돌하는 경우 - 흔한 실수

실수 1: robots.txt에서 차단한 URL을 sitemap.xml에 등록

  • robots.txt: Disallow: /blog/
  • sitemap.xml: 모든 /blog/* URL을 등록

결과: 검색 엔진이 혼란스러워하고 /blog/ 페이지가 색인 되지 않을 수 있다. robots.txt는 robots.txt에서 차단하지 말아야 할 중요한 페이지들만 sitemap.xml에 등록해야 한다.

실수 2: sitemap.xml에 비공개 페이지나 중복 URL 등록

  • 회원가입 후에만 볼 수 있는 페이지
  • 카테고리/태그 페이지의 중복 URL
  • ?utm_source=google 같은 추적 파라미터가 붙은 URL

결과: 검색 엔진이 불필요한 페이지를 크롤링하느라 크롤 예산을 낭비한다.

실수 3: robots.txt를 공개 서버에 노출하지 않음

robots.txt가 없거나 접근 불가능하면 검색 봇은 모든 페이지를 크롤링하려고 시도한다. 서버 부하가 증가할 수 있다.

 

Google Search Console에서 검증하기

robots.txt와 sitemap.xml이 올바르게 설정되었는지 확인하려면 Google Search Console을 써야 한다.

  • robots.txt 테스트: Search Console → 크롤링 → robots.txt 테스터 → URL 입력 후 확인
  • sitemap 제출: Search Console → 사이트맵 → sitemap.xml URL 제출 → 상태 확인
  • 색인 상태: Search Console → 색인 생성 상태 → 색인 된 페이지 수 확인

 

정리: 언제 뭘 써야 할까

robots.txt와 sitemap.xml은 SEO 최적화의 두 축이다. 작은 최적화 하나가 모여서 검색 순위 상승이라는 큰 효과를 만든다는 점을 잊지 말자.

  • robots.txt: 크롤링하면 안 되는 페이지(관리자, 임시 파일, 중복 페이지)를 차단해서 서버 부하를 줄이고 크롤 예산을 절약한다.
  • sitemap.xml: 중요한 모든 페이지를 검색 엔진에 알려서 빠르게 색인 되도록 유도한다.

이 글의 PHP 동적 생성 코드와 robots.txt 작성 규칙을 참고해서, 오늘 바로 본인의 사이트 robots.txt와 sitemap.xml을 점검해보면, 검색 엔진에 훨씬 효율적으로 크롤링되는 사이트로 개선할 수 있을 것이다.