본문 바로가기
Frontend2026년 9월 16일10분 읽기

AI 크롤러 제어하기 — robots.txt의 한계와 실제로 막는 방법

YS
김영삼
조회 92
AI 크롤러 제어하기 — robots.txt의 한계와 실제로 막는 방법

2026년 웹사이트의 트래픽 구성은 몇 년 전과 다르다. 사람, 검색 크롤러, 학습 데이터 수집기, 그리고 사용자 요청을 대신 수행하는 에이전트가 뒤섞여 있다. 이들을 같은 규칙으로 다루면 두 가지 문제가 생긴다. 서버 비용이 새고, 콘텐츠가 대가 없이 쓰인다.

먼저 명확히 해 둘 것이 있다. robots.txt는 요청이지 강제가 아니다. 준수는 자발적이며 법적 구속력도 없다. 실제로 막으려면 서버나 엣지에서 차단해야 한다.

나는 한동안 robots.txt만 걸어 두고 안심했다. 로그를 제대로 본 건 대역폭 청구서가 이상해진 뒤였다. 하루 요청의 상당수가 자동화 트래픽이었고, 그중 일부는 robots.txt를 아예 읽지 않았다. 그때부터 "요청하는 것"과 "강제하는 것"을 구분하기 시작했다.

봇의 종류와 대응 방향

유형목적대응 기본값
검색 크롤러색인 — 트래픽을 되돌려 준다허용 (막으면 유입 손실)
AI 학습 수집기모델 학습 데이터 확보정책에 따라 선택
AI 답변용 조회사용자 질문에 답하기 위한 실시간 조회출처 표기 여부로 판단
에이전트 실행사용자 대신 사이트를 조작·조회인증 경로로 유도
스크래퍼·복제콘텐츠 무단 복제차단
취약점 스캐너공격 준비차단·차단 목록 등록
구분이 어렵다는 게 핵심 문제 User-Agent는 자기 신고일 뿐이라 위장이 쉽다. 그래서 신뢰할 만한 구분은 역방향 DNS 검증이나 공개된 IP 대역 확인처럼 위장하기 어려운 신호에 기반해야 한다. 나머지는 행동 패턴으로 판단한다.

1단계 — robots.txt로 의사 표시

구속력이 없어도 robots.txt는 필요하다. 준수하는 봇이 실제로 많고, 정책을 공개적으로 선언하는 의미도 있다.

# /robots.txt

# 검색 크롤러는 허용 (트래픽이 돌아온다)
User-agent: Googlebot
Allow: /

User-agent: Bingbot
Allow: /

# 학습 목적 수집기는 차단 (이름은 각 사업자 문서에서 확인)
User-agent: GPTBot
Disallow: /

User-agent: CCBot
Disallow: /

# 그 외 기본 정책
User-agent: *
Disallow: /admin/
Disallow: /api/
Crawl-delay: 5

Sitemap: https://example.com/sitemap.xml

봇 이름은 사업자마다 다르고 바뀐다. 주기적으로 각 사업자의 공개 문서를 확인해 갱신해야 한다. 이름을 모르는 새 봇은 어차피 이 파일로 막히지 않는다.

2단계 — 실제 차단은 엣지에서

차단 규칙은 애플리케이션이 아니라 앞단(CDN·리버스 프록시)에 두는 게 좋다. 애플리케이션까지 요청이 도달하면 이미 비용이 발생한 뒤다.

# nginx 예시: User-Agent 기반 기본 차단 + 레이트 리밋

# 1) 요청 속도 제한 (IP 단위)
limit_req_zone $binary_remote_addr zone=perip:10m rate=30r/m;

map $http_user_agent $blocked_ua {
    default                 0;
    "~*(SomeScraperBot)"    1;
    "~*(python-requests)"   1;   # 기본 UA 그대로 오는 스크립트
    ""                      1;   # UA 없는 요청
}

server {
    if ($blocked_ua) { return 403; }

    location / {
        limit_req zone=perip burst=20 nodelay;
        limit_req_status 429;
        ...
    }

    # 무거운 경로는 더 엄격하게
    location /search {
        limit_req zone=perip burst=5 nodelay;
        ...
    }
}
엣지 차단 설계 원칙
차단보다 속도 제한을 먼저 — 오탐 시 피해가 작다
429를 제대로 반환하고 Retry-After를 붙인다 (예의 있는 봇은 물러난다)
검색 크롤러는 예외 목록에 두되 역방향 DNS로 검증
차단 규칙은 단계적으로 — 로그로 영향 범위를 먼저 본다
정적 자산은 관대하게, 비싼 동적 경로는 엄격하게
오탐 신고 경로를 남긴다 (차단 페이지에 연락처)

3단계 — 행동 기반 판별

User-Agent를 신뢰할 수 없으므로, 실제 행동에서 신호를 얻어야 한다. 완벽하지는 않지만 유용한 지표들이 있다.

  • 요청 간격의 규칙성 — 사람은 불규칙하고 봇은 일정하다.
  • 정적 자산 요청 여부 — 사람의 브라우저는 CSS·이미지·폰트를 함께 요청한다. HTML만 연속으로 가져가면 봇일 가능성이 높다.
  • 순회 패턴 — 사이트맵 순서대로 또는 링크를 폭넓게 훑으면 크롤러다.
  • 세션 유지 — 쿠키를 보존하지 않고 매번 새로 요청하는 패턴.
  • Accept 헤더 — 브라우저가 보내는 일반적인 조합과 다른 경우.
과잉 차단의 대가 행동 기반 판별은 오탐이 있다. 접근성 도구, 텍스트 브라우저, 저사양 기기, 프라이버시 브라우저 사용자가 봇으로 분류될 수 있다. 차단 전에 부드러운 단계(속도 제한 → 지연 → 챌린지 → 차단)를 두는 이유다.

4단계 — 열어 두되 조건을 붙이기

전면 차단이 늘 최선은 아니다. AI 답변에서 출처로 인용되며 유입이 생기는 경우도 있다. 그래서 요즘 자주 쓰는 절충은 이렇다.

1
요약본만 공개
전문 대신 도입부와 핵심 요약을 크롤 가능하게 두고, 전문은 로그인이나 지연 로딩 뒤에 둔다.
2
속도 제한 차등
정상 크롤러에는 넉넉히, 미확인 자동화에는 엄격하게.
3
API 경로 제공
대량 수집이 필요한 쪽에는 인증된 API를 안내한다. 통제 가능한 창구를 만드는 편이 낫다.
4
라이선스 명시
이용 약관과 메타데이터에 학습 이용 정책을 명시해 둔다.

SEO를 해치지 않으려면

봇 차단에서 가장 흔한 사고는 검색 크롤러를 함께 막는 것이다. 트래픽이 며칠 뒤부터 조용히 줄고, 원인을 찾는 데 몇 주가 걸린다.

# 검색 크롤러 검증 (구글봇 예)
# 1) 역방향 DNS
host 66.249.66.1
#  → crawl-66-249-66-1.googlebot.com

# 2) 정방향 확인 (역방향 결과를 다시 조회해 IP가 일치하는지)
host crawl-66-249-66-1.googlebot.com
#  → 66.249.66.1

# 두 방향이 일치해야 진짜다. UA 문자열만으로 판단하지 말 것.
배포 후 확인
서치 콘솔 등에서 크롤 오류·차단 보고가 늘지 않았는가
주요 페이지를 크롤러 UA로 직접 요청해 200이 나오는가
sitemap.xml과 robots.txt 자체가 차단되지 않았는가
404·403 비율이 급등하지 않았는가
정상 사용자 신고가 들어오지 않는가 (특히 모바일·해외 IP)

현실적인 결론

완전한 차단은 불가능하다. 결정한 만큼만 막을 수 있고, 막는 만큼 다른 비용을 치른다. 그래서 목표를 먼저 정해야 한다. 비용 통제가 목적인가, 콘텐츠 보호가 목적인가. 전자라면 속도 제한과 캐싱으로 충분한 경우가 많고, 후자라면 공개 범위 자체를 다시 설계해야 한다.

나는 대부분의 사이트에 이 순서를 권한다. 먼저 로그를 보고, 비싼 경로에 속도 제한을 걸고, robots.txt로 정책을 밝히고, 그래도 문제가 남으면 그때 차단을 검토한다. 첫 단계에서 끝나는 경우가 생각보다 많다.

자주 묻는 질문

robots.txt로 AI 크롤러를 막을 수 있나요?

준수하는 봇에게는 효과가 있지만 강제력은 없습니다. 무시하거나 이름을 바꿔 오는 경우가 있어, 실제 차단이 필요하면 서버나 엣지에서 규칙을 적용해야 합니다. 그래도 정책 선언 의미가 있으므로 함께 유지하는 것이 좋습니다.

검색 노출을 잃지 않으면서 학습 수집만 막을 수 있나요?

봇 이름 단위로 구분하면 어느 정도 가능합니다. 검색 크롤러는 허용하고 학습 목적 수집기는 차단하는 방식이며, 봇 이름은 각 사업자 문서에서 주기적으로 확인해 갱신해야 합니다. 다만 이름을 밝히지 않는 수집은 이 방법으로 걸러지지 않습니다.

User-Agent만으로 봇을 판별해도 되나요?

User-Agent는 자기 신고라 위장이 쉽습니다. 검색 크롤러 검증에는 역방향 DNS와 정방향 재확인을 함께 쓰고, 나머지는 요청 간격·정적 자산 동반 요청 여부·순회 패턴 같은 행동 신호로 판단하세요.

차단과 속도 제한 중 무엇을 먼저 적용해야 하나요?

속도 제한이 먼저입니다. 오탐이 발생해도 피해가 작고, 429와 Retry-After를 제대로 반환하면 예의 있는 자동화는 스스로 물러납니다. 차단은 반복적으로 규칙을 무시하는 대상에 한정하는 편이 안전합니다.

정상 사용자가 차단되는 문제는 어떻게 줄이나요?

속도 제한 → 지연 → 챌린지 → 차단으로 단계를 두고, 접근성 도구나 저사양 환경을 고려해 임계값을 여유 있게 잡으세요. 차단 페이지에 오탐 신고 경로를 남기고, 공유 IP 환경(회사 NAT, 모바일 캐리어)에서의 영향도 확인해야 합니다.

비용 절감이 목적이라면 무엇부터 해야 하나요?

캐싱과 속도 제한이 먼저입니다. 정적 자산과 자주 조회되는 동적 응답을 엣지에서 캐싱하면 원본 부하가 크게 줄고, 비싼 경로에만 엄격한 제한을 걸면 대부분의 비용 문제가 해결됩니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록