RSS

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.txt

https://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-Typetext/plain인가
  • 운영 도메인의 사이트맵 주소가 정확한가
  • 공개할 CSS, 자바스크립트, 이미지 경로를 차단하지 않았는가
  • 관리자 경로가 실제 인증과 권한 검사로도 보호되는가

네이버 서치어드바이저와 Google Search Console의 robots 검사 도구를 이용하면 특정 URL이 규칙에 의해 차단되는지도 확인할 수 있습니다.

자주 하는 실수

전체 사이트를 실수로 차단한다

User-agent: *
Disallow: /

개발 환경에서 쓰던 설정을 운영에 그대로 배포하면 모든 정상 검색로봇의 방문을 막게 됩니다.

noindex와 같은 기능으로 생각한다

크롤링을 막으면 검색로봇이 페이지 안의 noindex를 읽을 수 없습니다. 검색 제외가 목적이라면 크롤링을 허용한 뒤 noindex를 전달해야 합니다.

민감한 경로를 보호하려고 사용한다

robots.txt는 공개 파일입니다. 인증과 접근 제어를 대신할 수 없습니다.

사이트맵 주소를 개발 도메인으로 남겨둔다

운영 배포 후에도 localhost나 스테이징 주소가 남아 있지 않은지 확인해야 합니다.

참고한 공식 문서

듀오랩스가 보는 관점

좋은 robots.txt는 복잡한 파일이 아닙니다. 공개 콘텐츠는 열어두고, 크롤링할 가치가 없는 경로만 최소한으로 제외하며, 사이트맵 위치를 정확히 알려주는 정도면 충분합니다.

규칙을 많이 적는 것보다 중요한 것은 역할을 혼동하지 않는 것입니다. 크롤링 제어는 robots.txt, 검색 제외는 noindex, 비공개 데이터 보호는 인증과 권한 검사로 나눠야 운영 중 실수를 줄일 수 있습니다.