robots.txt로 해결하려던 문제를 먼저 구분한다

개인 사이트를 운영하면서 robots.txt 설정과 검색 노출 상태를 여러 번 확인했다. 그 과정에서 특히 헷갈렸던 것은 ‘수집을 막기’와 ‘검색 결과에서 제외하기’, ‘방문자의 접근을 막기’였다. 세 가지는 같은 조치가 아니다.

목적 사용할 수단 확인할 결과
협조하는 검색 로봇의 특정 경로 수집 제한 robots.txt의 Disallow 해당 로봇에 적용되는 경로 규칙
공개 HTML 페이지의 검색 색인 제외 페이지의 noindex 크롤러가 읽을 수 있는 응답에 지시가 있는지
비공개 데이터 보호 서버 인증·권한 검사 권한 없는 요청에서 내용이 반환되지 않는지

robots.txt는 접근 비밀번호가 아니다. 제한된 URL도 다른 링크를 통해 알려질 수 있으며, 모든 클라이언트가 규칙을 지키는 것도 아니다. Google은 검색 제외를 위한 noindex를 읽으려면 해당 페이지에 접근할 수 있어야 한다고 안내한다. robots.txt의 역할, noindex 적용 안내

이 사이트가 실제로 반환하는 규칙

2026년 9월 코드 기준으로 src/blog/templates/robots.txt의 주요 내용은 다음과 같다.

User-agent: *
Allow: /
Disallow: /admin/
Disallow: /manager/
Disallow: /accounts/
Disallow: /search/
Disallow: /contact/
Sitemap: https://win-j.com/sitemap.xml

User-agent: *는 일반적인 로봇 그룹을 지정하고 /manager/ 같은 경로는 수집 제한 대상으로 적는다. Sitemap에는 전체 주소를 사용한다. /contact/가 적혀 있다는 사실만으로 현재 문의 화면의 주소도 같다고 추측하면 안 된다. 실제 메뉴의 문의 경로는 /inquiry/이며 페이지의 robots 메타도 별도로 확인한다.

공개 글 전체를 숨기기 위해 여기에 Disallow: /를 추가하지 않는다. 공개 noindex 글에 접근할 수 있어야 메타 지시를 읽을 수 있기 때문이다. 개발 서버 역시 이 파일만으로 외부 접근을 막지 않고 네트워크·인증 설정으로 보호한다.

Django에서는 템플릿을 텍스트로 반환한다

이 프로젝트의 실제 뷰는 환경 분기 없는 템플릿 렌더링 방식이다. 이전 글에서 제안했던 DEBUG 또는 별도 환경 변수에 따른 분기는 현재 구현과 구별해야 한다.

from django.http import HttpResponse
from django.template.loader import render_to_string

def robots_txt(request):
    content = render_to_string("robots.txt")
    return HttpResponse(content, content_type="text/plain")

프로젝트 URL은 robots.txt를 이 뷰에 연결한다. 템플릿 폴더에 파일을 만들기만 해서는 공개 주소가 생기지 않는다. Nginx가 같은 경로를 직접 처리하도록 설정했다면 실제 요청은 Django 뷰까지 도착하지 않을 수 있으므로 최종 응답을 기준으로 판단한다.

HEAD만 보지 말고 GET 본문까지 확인한다

아래는 공개 응답만 읽는 명령이다. Windows PowerShell에서는 별칭과 혼동하지 않도록 curl.exe를 사용할 수 있다.

curl -sS -D - https://win-j.com/robots.txt

확인할 항목은 상태 코드, Content-Type, 본문의 User-agent·Disallow·Sitemap이다. curl -I는 본문을 받지 않으므로 규칙 내용까지 검증하지 못한다. 리디렉션이 보이면 Location과 최종 주소를 먼저 확인하고, 모든 리디렉션을 무조건 오류로 단정하지 않는다.

HTML이 나오면 오류 페이지·로그인 전환·공통 URL 처리 여부를 조사한다. 로컬 파일과 공개 내용이 다르면 배포된 파일, 앞단 웹 서버의 경로 처리, 캐시 순으로 좁힌다. 기본 규칙을 바꾸기 전에 원문과 확인 시각을 남겨야 변경 전후를 비교할 수 있다.

noindex 페이지를 점검하는 별도 절차

공개 글에서 검색 제외를 의도했다면 해당 글의 소스에 <meta name="robots" content="noindex,follow">가 있는지 확인한다. 동시에 사이트맵에서 제외했는지 살펴본다. HTTP 헤더에 X-Robots-Tag가 있다면 함께 확인한다. 이 사이트의 본문 응답 조건은 사이트맵과 공개 상태 기록에 정리했다.

이 점검으로 알 수 있는 것은 현재 서버가 어떤 지시를 제공하는가다. 검색 결과 반영 여부는 검색엔진의 재수집 이후 별도로 확인해야 한다. robots.txt를 고쳤다는 이유로 애드센스의 콘텐츠 심사까지 해결됐다고 기록하지 않는다.