Field guide / robots-txt
robots.txt 작성법과 흔한 실수
크롤러 접근 제어 파일의 문법과 User-agent 그룹, Allow와 Disallow 우선순위 규칙, 사이트를 통째로 막아버리는 실수와 noindex와의 차이를 다룹니다.
- 작성
- 수정
- 작성자
- 검토
- 애드브랜치 편집팀
robots.txt란 무엇인가
robots.txt란 사이트 루트에 두는 텍스트 파일로, 크롤러가 어떤 경로를 요청해도 되는지 알려 주는 접근 제어 파일입니다. 위치는 반드시 https://example.com/robots.txt처럼 도메인 루트여야 하고, 하위 디렉터리에 두면 무시됩니다. 여기서 크롤러란 웹 페이지를 자동으로 수집하는 프로그램을 말합니다. 중요한 전제가 하나 있습니다. robots.txt는 강제 차단 장치가 아니라 협조적인 크롤러가 따르는 규약입니다.
잘못 쓰면 생기는 일
가장 큰 사고는 사이트 전체가 검색에서 사라지는 것입니다. 개발 서버에서 쓰던 두 줄이 운영에 그대로 배포되는 경우가 대표적입니다.
User-agent: *
Disallow: /
이 두 줄이 배포되면 협조적 크롤러는 사이트의 모든 경로를 요청하지 않습니다. 애드브랜치 검사기의 robots-txt-path-allowed가 치명적으로 표시하는 상황입니다. 복구해도 검색결과가 정상으로 돌아오기까지 시간이 걸립니다.
두 번째 사고는 반대 방향입니다. 비공개로 두고 싶은 페이지를 Disallow로 막으면 크롤링은 막히지만 URL 자체는 다른 사이트의 링크를 통해 검색결과에 남을 수 있습니다. 크롤링을 막았기 때문에 그 페이지의 noindex도 읽지 못합니다. 결국 아무 설명 없는 URL이 검색결과에 남습니다.
기본 문법
파일은 UTF-8 평문이고, 한 줄에 하나의 지시문을 씁니다. #으로 시작하는 줄은 주석입니다.
| 지시문 | 의미 |
|---|---|
User-agent | 아래 규칙이 적용될 크롤러 이름. *는 다른 그룹에 해당하지 않는 모든 크롤러 |
Disallow | 요청하지 않아야 할 경로 접두사 |
Allow | Disallow 안에서 예외로 허용할 경로 |
Sitemap | 사이트맵의 절대 URL. 그룹과 무관하게 파일 어디에나 쓸 수 있음 |
Disallow의 값이 비어 있으면 아무것도 막지 않는다는 뜻입니다. Disallow: /는 전부 막는다는 뜻입니다. 이 한 글자 차이가 사고의 원인이 됩니다.
바로 쓸 수 있는 예제
일반적인 콘텐츠 사이트라면 이 정도로 충분합니다.
# 모든 크롤러 공통 규칙
User-agent: *
Disallow: /admin/
Disallow: /cart
Disallow: /search
Allow: /search/guides
Disallow: /*?sessionid=
# 사이트맵은 그룹 밖에서 절대 URL로 선언합니다
Sitemap: https://example.com/sitemap.xml
특정 UA와 기본 그룹의 선택, 같은 UA 그룹의 병합
특정 UA 그룹은 User-agent: * 기본 그룹보다 우선하므로 둘을 합치지 않습니다. 그러나 같은 UA와 일치하는 전용 그룹이 여러 개라면 그 규칙은 합쳐야 합니다. RFC 9309 2.2.1과 Google robots.txt 사양이 이 동작을 명시합니다.
User-agent: Googlebot
Disallow: /tmp/
User-agent: *
Disallow: /private/
Disallow: /tmp/
위 파일에서 Googlebot에는 /tmp/만 차단되고, 기본 그룹의 /private/는 적용되지 않습니다. 반대로 다음처럼 분리된 두 Googlebot 그룹은 서로 병합되므로 /tmp/와 /private/가 모두 차단됩니다.
User-agent: Googlebot
Disallow: /tmp/
User-agent: Googlebot
Disallow: /private/
중요한 제품 한계가 있습니다. 현재 애드브랜치 robots 파서는 같은 UA의 분리된 그룹을 병합하지 않고 첫 일치 그룹만 사용합니다. 따라서 위 예시에서 /private/를 허용으로 잘못 표시할 수 있습니다. 구현이 별도로 수정되기 전에는 UA별 규칙을 한 그룹에 모으고, 위 공식 사양에 따라 대상 UA와 경로에 적용되는 전체 규칙을 대조하세요.
Allow와 Disallow 우선순위: 가장 긴 매칭이 이긴다
같은 그룹 안에서 한 URL이 Allow와 Disallow 모두에 걸리면, 경로 패턴이 더 긴 쪽이 이깁니다. 길이가 같으면 덜 제한적인 쪽, 즉 Allow가 적용됩니다. 순서는 상관없습니다.
| 규칙 | 검사 URL | 결과 |
|---|---|---|
Disallow: /guides/ 와 Allow: /guides/public/ | /guides/public/a | 허용 (긴 매칭이 Allow) |
Disallow: /guides/ 와 Allow: /guides/public/ | /guides/secret/a | 차단 |
Disallow: /p 와 Allow: /p | /page | 허용 (길이 동일) |
Disallow: /*.pdf$ | /files/report.pdf | 차단 |
와일드카드는 두 가지를 씁니다. *는 임의의 문자열, $는 URL의 끝을 뜻합니다. Disallow: /*?는 물음표가 들어간 모든 URL을, Disallow: /*.pdf$는 .pdf로 끝나는 URL을 막습니다.
잘못된 예와 수정된 예
1. 특정 폴더만 막으려다 전체를 막은 경우
잘못된 예입니다.
User-agent: *
Disallow: /
Disallow: /admin/
첫 번째 줄이 이미 전부를 막았습니다. 두 번째 줄은 의미가 없습니다.
수정된 예입니다.
User-agent: *
Disallow: /admin/
2. 상대 경로 사이트맵
잘못된 예입니다.
User-agent: *
Disallow: /admin/
Sitemap: /sitemap.xml
Sitemap은 절대 URL로 쓰는 것이 안전합니다. Sitemap은 그룹에 속하지 않으므로 위치 자체는 문제가 아닙니다. 상대 경로 형식은 애드브랜치의 robots-sitemap-absolute-url에서 warning으로 표시합니다. 실제 sitemap 발견은 가져온 응답과 URL 해석에도 좌우됩니다.
수정된 예입니다.
User-agent: *
Disallow: /admin/
Sitemap: https://example.com/sitemap.xml
3. robots.txt로 검색결과에서 빼려는 시도
잘못된 예입니다.
User-agent: *
Disallow: /old-event-page
크롤링을 막았기 때문에 그 페이지의 noindex를 읽을 수 없고, 외부 링크가 있으면 URL만 검색결과에 남을 수 있습니다.
수정된 예입니다. robots.txt에서는 경로를 열어 두고, 페이지 자체에 색인 제외 지시를 둡니다.
User-agent: *
Disallow: /admin/
<meta name="robots" content="noindex, follow" />
robots.txt와 noindex의 차이
| 구분 | robots.txt Disallow | noindex |
|---|---|---|
| 위치 | 도메인 루트의 텍스트 파일 | 페이지의 meta 태그 또는 X-Robots-Tag 헤더 |
| 지시 대상 | 요청하지 말 것(크롤링) | 검색결과에 넣지 말 것(색인) |
| URL이 결과에 남는가 | 남을 수 있음 | Google이 크롤링 후 검색결과에서 제외함 |
| 함께 쓰면 | 크롤링이 막혀 noindex를 읽지 못함 | 단독으로 써야 효과 |
핵심은 두 개를 같이 쓰면 안 된다는 점입니다. 색인에서 빼는 것이 목적이라면 크롤링은 허용해야 합니다.
애드브랜치 검사기와의 연결
이 가이드는 robots-txt-path-allowed(현재 경로가 차단되었는지), sitemap-discovery(robots.txt의 Sitemap 선언), ai-crawler-directive(GPTBot 등 AI 크롤러 그룹의 경로 허용), 그리고 페이지 쪽 지시인 meta-robots-indexability, x-robots-tag-indexability, meta-robots-directive-quality와 연결됩니다. 검사 결과에서 robots.txt 항목이 확인 불가로 나온다면 파일 요청 실패나 파싱 오류일 가능성이 큽니다.
주의점과 흔한 오해
robots.txt는 보안 장치가 아닙니다. 파일 자체가 공개되어 있어 누구나 읽을 수 있고, 규칙을 무시하는 수집기도 존재합니다. 민감한 경로는 인증으로 보호해야 합니다. 오히려 Disallow: /internal-admin-2024/처럼 쓰면 숨기고 싶은 경로를 광고하는 셈이 됩니다.
또 하나, 파일이 아예 없어도 문제는 아닙니다. robots.txt가 없으면 크롤러는 제한이 없다고 간주합니다. Google은 429를 제외한 4xx 응답을 robots.txt가 없는 것처럼 처리하므로 크롤링 제한이 없습니다. 다만 5xx 응답이 계속되면 크롤러가 사이트 전체를 임시로 크롤링하지 않을 수 있으니, 파일을 두려면 안정적으로 200을 반환하게 해야 합니다.
자주 묻는 질문
robots.txt를 수정하면 언제 반영되나요?
크롤러가 파일을 다시 가져간 시점부터입니다. 즉시 반영되지 않습니다. Google Search Console의 robots.txt 보고서에서 마지막으로 읽은 버전과 파싱 결과를 확인할 수 있습니다.
하위 도메인마다 따로 필요한가요?
필요합니다. blog.example.com은 example.com의 robots.txt를 따르지 않고 blog.example.com/robots.txt를 봅니다. 프로토콜과 포트도 별도로 취급됩니다.
AI 크롤러만 막을 수 있나요?
이름을 지정한 그룹을 추가하면 됩니다. 예를 들어 User-agent: GPTBot과 Disallow: / 조합을 쓸 수 있습니다. 다만 이는 협조적 크롤러의 접근 지시일 뿐이고, 실제 수집이나 학습 여부는 각 사업자의 정책과 시점에 따라 달라질 수 있습니다. AI 크롤러 접근 설정 가이드에서 학습·검색·사용자 요청형 UA의 차이와 제공사별 robots.txt 적용 방식을 확인하세요.
대소문자를 구분하나요?
User-agent 이름은 대소문자를 구분하지 않지만, 경로 값은 구분합니다. Disallow: /Guides/는 /guides/를 막지 않습니다. 지시문 이름 자체의 표기(Disallow, disallow)는 문제가 되지 않습니다.
관련 가이드
변경 이력
- noindex와 4xx 응답 처리의 적용 범위를 Google 기준으로 바로잡았습니다.
Check the evidence
이 페이지를 지금 검사해보기
읽고 있는 페이지나 운영 중인 URL을 넣으면 이 가이드와 연결된 SEO·GEO 항목을 바로 확인할 수 있습니다.
Next reading
관련 가이드
SEO 기본 점검 체크리스트
페이지 하나를 검색엔진에 제대로 노출하기 위해 확인할 항목을 우선순위 순서로 정리하고, 항목마다 확인 방법과 고치는 코드까지 함께 다룹니다.
가이드 읽기
SEO와 GEO는 무엇이 다른가
검색엔진 최적화와 AI 검색 최적화의 목표, 평가 방식, 실제 작업 항목이 어떻게 다르고 어디까지 겹치는지 HTML 예제와 비교표로 정리합니다.
가이드 읽기
GEO 점검 체크리스트
AI 검색이 페이지의 주제와 답변을 이해하기 쉽게 만드는 구조를 두괄식 작성, 정의문, Q&A, 출처 표기 순서로 항목별 점검합니다.
가이드 읽기