robots.txt는 무엇이고 왜 필요한가
웹사이트를 운영하다 보면 루트 주소에서 robots.txt라는 작은 텍스트 파일을 만나게 됩니다. 내용은 몇 줄뿐인데 검색엔진 최적화 점검표에는 거의 빠지지 않고 등장합니다.
이 파일은 검색 결과의 순위를 올리는 설정도, 비공개 페이지를 보호하는 보안 장치도 아닙니다. 검색로봇에게 어느 URL을 수집해도 되고 어느 URL은 방문하지 말아야 하는지 알려주는 안내문입니다.
검색로봇은 왜 안내문이 필요할까
검색엔진은 크롤러라는 자동화 프로그램으로 웹페이지의 링크를 따라다니며 콘텐츠를 발견합니다. 사이트 전체를 제한 없이 돌아다니게 두면 공개할 가치가 없는 URL까지 반복해서 방문할 수 있습니다.
예를 들면 다음과 같습니다.
- 로그인과 관리자 화면
- 검색 결과나 필터 조합으로 계속 생성되는 중복 URL
- API 엔드포인트
- 임시 페이지와 테스트 경로
- 같은 내용을 여러 형태로 보여주는 URL
불필요한 요청이 많아지면 서버 자원을 쓰고, 중요한 콘텐츠를 발견하는 속도에도 영향을 줄 수 있습니다. robots.txt는 크롤러의 방문 범위를 정리해 공개 콘텐츠에 집중하도록 돕습니다.
2022년에 공개된 IETF의 RFC 9309는 이 방식을 Robots Exclusion Protocol이라는 표준으로 정의합니다. 다만 크롤러가 규칙을 따르도록 요청하는 프로토콜이지 강제 접근 제어는 아닙니다.
파일은 어디에 있어야 할까
robots.txt는 반드시 사이트 루트에서 접근할 수 있어야 합니다.
https://example.com/robots.txthttps://example.com/files/robots.txt처럼 하위 폴더에 두면 해당 사이트의 로봇 규칙으로 인정되지 않습니다. 응답 형식은 일반 텍스트인 text/plain이 적합하고, 정상적인 2xx 상태로 반환해야 합니다.
규칙의 범위는 호스트와 프로토콜에 따라 나뉩니다. 다음 주소들은 각각 별도의 robots.txt를 가질 수 있습니다.
https://example.com/robots.txt
https://blog.example.com/robots.txt
http://example.com/robots.txt메인 홈페이지에 파일이 있다고 해서 블로그 서브도메인까지 자동으로 적용되는 것은 아닙니다.
가장 기본적인 문법
모든 검색로봇에게 공개 페이지를 허용하고 관리자와 API 경로만 제외하는 예입니다.
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /api/
Sitemap: https://example.com/sitemap.xml각 항목은 다음 의미를 가집니다.
User-agent
규칙을 적용할 크롤러를 지정합니다. *는 모든 크롤러를 뜻합니다. 특정 검색로봇에만 다른 규칙을 적용할 수도 있습니다.
User-agent: Yeti
Allow: /Yeti는 네이버 검색로봇의 사용자 에이전트 이름입니다.
Allow와 Disallow
Allow는 방문을 허용하고 Disallow는 방문하지 말아 달라는 뜻입니다. 경로가 겹치면 일반적으로 더 구체적이고 긴 규칙이 우선합니다.
User-agent: *
Disallow: /private/
Allow: /private/public-guide위 설정은 /private/ 아래를 막되 /private/public-guide는 허용합니다. 경로의 대소문자와 슬래시 위치를 실제 URL과 맞추는 것이 좋습니다.
Sitemap
사이트맵 위치를 검색로봇에게 알려줍니다. 사이트맵 제출 도구를 별도로 이용하더라도 함께 적어두면 크롤러가 위치를 발견하는 데 도움이 됩니다.
Sitemap: https://example.com/sitemap.xml크롤링, 색인, 접근 권한은 서로 다르다
robots.txt를 이해할 때 가장 중요한 부분입니다.
- 크롤링: 검색로봇이 URL에 방문해 내용을 가져가는 것
- 색인: 가져온 문서를 검색엔진 데이터베이스에 등록하는 것
- 접근 권한: 사용자가 실제 페이지를 열 수 있는지 서버가 판단하는 것
Disallow는 크롤링 요청을 제한할 뿐입니다. 다른 사이트에서 해당 URL을 링크하면 검색엔진이 내용 없이 주소만 검색 결과에 표시할 가능성도 있습니다. 검색 결과에서 빼려면 페이지를 크롤링할 수 있게 둔 상태에서 noindex 메타태그 또는 X-Robots-Tag를 사용해야 합니다.
더 중요한 점은 보안입니다. 악의적인 봇은 robots.txt를 무시할 수 있고, 누구나 파일을 열어 차단 경로를 볼 수 있습니다.
Disallow: /secret-admin-panel/이렇게 적는다고 관리자 화면이 보호되는 것은 아닙니다. 오히려 경로를 공개하는 효과가 생길 수 있습니다. 비공개 정보는 로그인, 권한 검사, 네트워크 정책 같은 실제 보안 수단으로 막아야 합니다.
파일이 없거나 서버 오류가 나면 어떻게 될까
검색로봇마다 세부 정책은 다를 수 있습니다. 네이버는 다음과 같이 안내합니다.
2xx: 파일의 규칙을 읽고 적용3xx: 리다이렉트를 최대 5회까지 추적4xx: 파일이 없는 것으로 보고 전체 수집 허용5xx: 일시적으로 전체 수집 비허용으로 해석할 수 있음
따라서 배포 직후 robots.txt가 HTML 오류 페이지를 반환하거나 서버 장애로 5xx가 나지 않는지 확인하는 것이 중요합니다.
Next.js에서는 실제 txt 파일이 없어도 된다
Next.js App Router에서는 두 가지 방식으로 제공할 수 있습니다.
정적인 파일을 그대로 제공하려면 다음 위치에 둡니다.
public/robots.txt코드로 관리하려면 src/app/robots.ts를 사용합니다.
import type { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
return {
rules: [
{
userAgent: "*",
allow: "/",
disallow: ["/admin", "/api"],
},
],
sitemap: "https://example.com/sitemap.xml",
};
}프로젝트 안에 물리적인 robots.txt가 보이지 않더라도 Next.js가 이 코드를 실행해 /robots.txt 주소로 일반 텍스트 응답을 만듭니다.
듀오랩스 BLOG의 실제 구성
듀오랩스 BLOG도 정적 파일 대신 src/app/robots.ts를 사용합니다.
import type { MetadataRoute } from "next";
import { SITE_URL } from "@/lib/site";
export default function robots(): MetadataRoute.Robots {
return {
rules: [{ userAgent: "*", allow: "/" }],
sitemap: `${SITE_URL}/sitemap.xml`,
};
}운영 주소에서는 실제 텍스트 파일처럼 응답합니다.
블로그 글은 모두 공개 콘텐츠이므로 전체 크롤링을 허용하고 사이트맵 위치만 안내합니다. 메인 홈페이지와 블로그는 호스트가 다르기 때문에 각각의 robots.txt를 따로 제공합니다.
배포 후 확인하는 방법
브라우저로 주소를 여는 것만으로 기본 확인은 가능하지만 응답 상태와 형식도 같이 보는 편이 좋습니다.
curl -I https://example.com/robots.txt
curl https://example.com/robots.txt확인할 항목은 다음과 같습니다.
- 상태 코드가
200인가 Content-Type이text/plain인가- 운영 도메인의 사이트맵 주소가 정확한가
- 공개할 CSS, 자바스크립트, 이미지 경로를 차단하지 않았는가
- 관리자 경로가 실제 인증과 권한 검사로도 보호되는가
네이버 서치어드바이저와 Google Search Console의 robots 검사 도구를 이용하면 특정 URL이 규칙에 의해 차단되는지도 확인할 수 있습니다.
자주 하는 실수
전체 사이트를 실수로 차단한다
User-agent: *
Disallow: /개발 환경에서 쓰던 설정을 운영에 그대로 배포하면 모든 정상 검색로봇의 방문을 막게 됩니다.
noindex와 같은 기능으로 생각한다
크롤링을 막으면 검색로봇이 페이지 안의 noindex를 읽을 수 없습니다. 검색 제외가 목적이라면 크롤링을 허용한 뒤 noindex를 전달해야 합니다.
민감한 경로를 보호하려고 사용한다
robots.txt는 공개 파일입니다. 인증과 접근 제어를 대신할 수 없습니다.
사이트맵 주소를 개발 도메인으로 남겨둔다
운영 배포 후에도 localhost나 스테이징 주소가 남아 있지 않은지 확인해야 합니다.
참고한 공식 문서
- IETF RFC 9309: Robots Exclusion Protocol
- 네이버 서치어드바이저: robots.txt 설정하기
- Next.js: Metadata Files
- Google Search Central: robots.txt 소개
- 네이버 서치어드바이저: 선호 URL 및 로봇 메타 태그
듀오랩스가 보는 관점
좋은 robots.txt는 복잡한 파일이 아닙니다. 공개 콘텐츠는 열어두고, 크롤링할 가치가 없는 경로만 최소한으로 제외하며, 사이트맵 위치를 정확히 알려주는 정도면 충분합니다.
규칙을 많이 적는 것보다 중요한 것은 역할을 혼동하지 않는 것입니다. 크롤링 제어는 robots.txt, 검색 제외는 noindex, 비공개 데이터 보호는 인증과 권한 검사로 나눠야 운영 중 실수를 줄일 수 있습니다.
함께 읽기
- 블로그를 서브도메인에서 하위 경로로 옮긴 이유, 그리고 CSP가 애드센스를 막고 있었습니다회사 사이트와 기술 블로그를 따로 운영하는 구성은 흔합니다. 회사는 duolabs.co.kr, 블로그는 blog.duolabs.co.kr.
- 네이버 서치어드바이저 등록부터 사이트맵 제출까지웹사이트를 만들었다고 네이버 검색 결과에 바로 나타나는 것은 아닙니다. 검색로봇이 사이트를 발견하고, 문서를 수집하고, 색인할 수 있어야 합니다. 네이버 서치어드바이저는 이 과정을 직접 보장하는 등록 창구라기보다 사이트 소유권을 확인하고 수집·색인 상태를 점검하는 운영 도구에 가깝습니다.
- 로컬에서는 정상인데 운영에서만 깨진 AI 스트리밍문서 AI 기능을 로컬에서 완성하고 운영에 배포했을 때, 답변 자체는 정상인데 화면의 느낌이 완전히 달라졌습니다. 스트리밍 답변은 한꺼번에 나타났고, 전체 화면 패널은 작은 섹션 안에 갇혔으며, 모달이 열리자마자 배경 스크롤 잠금이 풀렸습니다.
- 온프레미스 Next.js 서비스를 Vercel과 Supabase로 옮기기온프레미스에서 서비스를 운영하면 애플리케이션, 데이터베이스, Redis, WebSocket 서버와 백그라운드 워커를 한 네트워크 안에 둘 수 있습니다. 프로세스를 계속 띄워두기도 쉽습니다. setInterval로 10초마다 데이터베이스를 확인하는 코드도 일단은 잘 동작합니다.
- Vercel vs Cloudflare Pages vs Netlify vs 자체 서버: 배포 플랫폼 선택 가이드웹사이트를 만들 때 자주 듣는 이름으로 Vercel, Cloudflare Pages, Netlify가 있습니다. 여기에 AWS나 직접 관리하는 서버까지 더하면 선택지가 너무 많아 보입니다. 하지만 먼저 구분할 것이 있습니다. 이들은 완성된 홈페이지를 만들어 주는 서비스가 아니라, 개발자가 작성한 코드를 빌드하고 실행하는…