검색 엔진 최적화를 한다면서 robots.txt와 sitemap.xml의 차이를 정확히 모르고 설정하는 개발자들이 많다. 둘 다 SEO와 크롤링 제어에 필수적이지만, 역할이 완전히 다르다는 걸 모르는 경우가 대부분이다. 심하면 한쪽만 설정하거나, 둘의 설정이 충돌해서 중요한 페이지가 검색 결과에서 누락되는 사태까지 벌어진다. 이번에는 robots.txt와 sitemap.xml이 정확히 뭔지, 어떤 차이가 있는지, 언제 뭘 써야 하는지 완벽하게 정리해서 소개하겠다.
robots.txt 파일은 서버 루트 디렉토리(/robots.txt)에 놓이는 텍스트 파일이고, sitemap.xml은 보통 /sitemap.xml이나 특정 경로에 놓인다. 둘 다 검색 엔진이 웹사이트 접근 시 가장 먼저 확인하는 파일들이다.
| 항목 | robots.txt | sitemap.xml |
|---|---|---|
| 목적 | 크롤링 차단/제한 | 크롤링 유도/안내 |
| 역할 | 어떤 페이지를 "크롤링하지 말 것" | 어떤 페이지를 "꼭 크롤링할 것" |
| 형식 | 텍스트 파일 (규칙 기반) | XML 파일 (URL 나열) |
| 위치 | 도메인 루트(/robots.txt) | 일반적으로 루트 또는 /sitemap.xml |
| 검색 봇 필수여부 | 선택 (권장하지만 의무 아님) | 선택 (권장하지만 의무 아님) |
| 순위 영향 | 간접 영향 (크롤링 못한 페이지는 검색 불가) | 간접 영향 (발견하기 쉬운 페이지) |
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은 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)
수십 개의 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가 없거나 접근 불가능하면 검색 봇은 모든 페이지를 크롤링하려고 시도한다. 서버 부하가 증가할 수 있다.
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을 점검해보면, 검색 엔진에 훨씬 효율적으로 크롤링되는 사이트로 개선할 수 있을 것이다.