notes
메타 robots 태그 — 정의·지시어·사용법
HTML head의 meta robots로 페이지 단위 색인·링크추적을 지시하는 방법. robots.txt·X-Robots-Tag와의 차이, 지시어 조합, 검증·함정.
한 줄: HTML<head>의meta name="robots"로 이 페이지를 색인할지·링크를 따라갈지를 페이지 단위로 지시한다. 사이트 전체 크롤 게이트인robots.txt와는 역할이 다르다.
관련: 땡큐캠핑 SEO · 블로그 SEO (Google 공식 기준)
웹페이지 HTML의 <head> 안에 넣는 meta name="robots" 한 줄이, 그 페이지를 검색엔진이 색인할지·링크를 따라갈지를 페이지 단위로 지시한다. 사이트 전체를 막는 robots.txt와 역할이 다르고, HTTP 응답 헤더의 X-Robots-Tag와도 겹치지만 적용 범위가 다르다. SEO에서 “이 URL은 검색 결과에 나오면 안 된다”는 요구가 생길 때 가장 직접적으로 쓰는 신호다.
이 글에서는 크롤링·색인·링크추적의 차이를 풀어 쓰고, 주요 지시어(directive)와 조합이 실제로 무엇을 하는지, robots.txt / meta / X-Robots-Tag를 언제 쓰는지, 검증 방법과 흔한 함정까지 정리한다.
이 도식이 말하는 것: 크롤러는 HTML을 받은 뒤 <head>의 meta robots를 읽고, 그 페이지를 색인할지·내부 링크를 따라갈지를 페이지 단위로 결정한다.
meta robots란
meta robots는 HTML 문서의 <head>에 넣는 메타 태그다. 형식은 대략 다음과 같다.
<meta name="robots" content="noindex, follow">
name="robots"— 대부분의 검색 크롤러를 대상으로 하는 일반 지시content— 쉼표로 구분한 지시어 목록 (index,noindex,follow,nofollow등)
페이지마다 다른 규칙을 줄 수 있다. 로그인 후 화면만 noindex로 두고, 공개 문서 페이지는 기본(색인 허용)으로 두는 식이다. 서버가 HTML을 내려주는 시점에 태그가 렌더링되어야 크롤러가 볼 수 있다. JS로만 늦게 삽입하는 방식은 봇·환경에 따라 놓칠 수 있으니, 가능한 한 초기 HTML(또는 SSR/SSG 결과)에 넣는 편이 안전하다.
크롤링 · 색인 · 링크추적 — 세 단어를 나눠 쓰기
검색엔진 이야기를 할 때 이 세 개념이 자주 섞인다. meta robots를 이해하려면 먼저 구분하는 게 좋다.
크롤링(crawl)
봇이 URL에 요청을 보내고 응답(HTML, 헤더 등)을 받아 오는 행위다. “방문해서 내용을 본다”에 가깝다. robots.txt로 Disallow 하면, 그 URL로의 크롤 자체를 막는 쪽이다(프로토콜상 요청하지 않기로 약속).
색인(index)
받아 온 내용을 검색 인덱스에 넣고, 검색 결과에 노출할 후보로 삼는 행위다. noindex는 “이 페이지는 인덱스에 넣지 마라”는 뜻이다. 크롤은 됐는데 색인은 안 되는 상태가 가능하다.
링크추적(follow)
그 페이지 HTML 안의 <a href> 등을 따라가며 다른 URL을 발견·크롤 큐에 넣는 행위다. nofollow는 “이 페이지의 링크는 추적(및 그 링크를 통한 신호 전달)하지 마라”는 쪽에 가깝다. 다만 검색엔진마다·시대마다 해석 세부사항은 달라져 왔고, Google은 링크를 힌트로 취급하는 방향으로 정리해 온 이력이 있다. 실무에서는 “이 페이지에서 나가는 링크를 통해 새 URL을 적극적으로 발견·평가하지 않게 한다” 정도로 이해하면 된다.
한 줄로 줄이면:
meta robots는 주로 이미 크롤된 페이지에 대해 색인·링크추적·스니펫·아카이브 등을 제어한다. “아예 오지 마라”는 robots.txt의 영역이다.
robots.txt vs meta robots vs X-Robots-Tag
세 장치는 겹쳐 보이지만 언제 적용되고, 무엇을 할 수 있는지가 다르다.
robots.txt
- 위치: 사이트 루트의
/robots.txt(예:https://example.com/robots.txt) - 역할: 크롤 허용/차단의 사이트·경로 단위 규칙
- 할 수 있는 것:
Disallow: /admin/처럼 특정 경로로의 크롤을 막는다 - 할 수 없는 것: “크롤은 하되 색인만 하지 마”를 보장하지 못한다. Disallow 된 URL은 봇이 HTML(과 그 안의 meta)을 못 볼 수 있다. 그런데도 외부에서 그 URL로 링크가 있으면, Google은 URL만 검색 결과에 올릴 수 있다(내용 없는 인용 형태). 색인을 확실히 빼려면 봇이 페이지에 접근해
noindex를 읽게 하는 쪽이 맞다.
meta robots
- 위치: 각 HTML 페이지의
<head> - 역할: 페이지 단위 색인·팔로우·스니펫 등
- 전제: 봇이 그 HTML을 받을 수 있어야 한다 (
robots.txt에 막히면 meta를 못 읽는다) - CSS·JS·이미지 같은 리소스에는 직접 적용되지 않는다(HTML 문서용)
X-Robots-Tag (HTTP 헤더)
- 위치: HTTP 응답 헤더
예:
X-Robots-Tag: noindex, nofollow - 역할: meta와 비슷한 지시어를 헤더로 전달
- 장점: PDF, 이미지, 비-HTML 응답에도 붙일 수 있다. CDN·리버스 프록시에서 HTML을 고치지 않고도 규칙을 넣을 수 있다
- HTML 페이지라면 meta와 헤더를 같이 쓸 수 있고, 충돌 시 검색엔진은 보통 더 제한적인 쪽을 따른다(구현·엔진별 차이는 있으나, 실무에서는 신호를 하나로 통일하는 게 낫다)
정리하면:
이 도식이 말하는 것: robots.txt는 “이 길로 들어오지 마”라는 사이트 단위 크롤 게이트이고, meta robots는 “들어왔으니 이 페이지는 색인/팔로우를 이렇게 해”라는 페이지 단위 제어다.
지시어(directives) 상세
content에 넣는 값들이다. 여러 개를 쉼표로 나열한다. 대소문자는 보통 구분하지 않는다.
index / noindex
index— 색인 허용(기본 동작에 가깝다. 생략해도 대개 동일)noindex— 검색 인덱스에 넣지 않음. 이미 색인된 URL이면, 봇이 다시 크롤해noindex를 확인한 뒤 인덱스에서 빠지는 식으로 동작하는 경우가 많다. 크롤이 막혀 있으면noindex를 못 읽으므로, “검색에서 빼기” 목적에는 robots.txt Disallow만으로는 부족할 수 있다.
follow / nofollow
follow— 이 페이지의 링크를 따라감(기본에 가깝다)nofollow— 이 페이지의 링크를 따라가지 않음(또는 링크를 통한 평가를 제한). Google은 개별 링크의rel="nofollow"와도 별개로, 페이지 전역 지시로 이해할 수 있다.
none
noindex, nofollow와 같다. 짧게 쓸 때 쓴다.
<meta name="robots" content="none">
all
index, follow와 같다. 명시적으로 “제한 없음”을 적을 때 쓰지만, 태그 자체를 생략하는 것과 실무상 큰 차이는 없다.
noarchive
캐시(저장된 페이지) 링크를 검색 결과에 보여 주지 말라는 지시. “캐시” 기능이 노출되는 엔진·시점에 의미가 있다.
nosnippet
검색 결과에서 텍스트 스니펫(및 일부 엔진에서는 비디오 미리보기 등)을 만들지 말라는 쪽에 가깝다. 민감 문구가 스니펫으로 나가면 안 될 때 검토한다. Google은 nosnippet과 max-snippet:0 등을 문서화해 두었다.
noimageindex
이 페이지에 있는 이미지를 이미지 검색 인덱스에 넣지 말라는 지시. 페이지 자체 웹 검색 색인과는 별개로, 이미지 쪽을 제한할 때 쓴다.
max-snippet:{number}
스니펫에 쓸 수 있는 텍스트 길이 상한(문자 수). 0이면 스니펫 텍스트를 사실상 막는다. -1은 상한 없음(엔진 문서 기준).
<meta name="robots" content="max-snippet:80">
max-image-preview:{setting}
이미지 미리보기 크기. 값 예: none, standard, large.
<meta name="robots" content="max-image-preview:large">
대형 이미지 미리보기·Discover 등에서 더 큰 썸네일을 허용할지 정할 때 쓴다.
max-video-preview:{number}
비디오 미리보기 초 단위 상한. 0이면 스틸만, -1이면 제한 없음 등으로 문서화되어 있다.
unavailable_after:{date/time}
지정 시각 이후에는 이 페이지를 인덱스에 두지 말라는 시한부 지시. 프로모션·기간 한정 페이지에 쓴다. 날짜 형식은 RFC 850 등 엔진이 명시한 형식을 따르는 것이 안전하다.
<meta name="robots" content="unavailable_after: Saturday, 01-Nov-2025 00:00:00 GMT">
시한 후에는 noindex와 비슷한 효과를 기대하는 용도다. 장기적으로는 그냥 noindex로 바꾸거나 URL을 제거하는 운영이 더 명확한 경우가 많다.
index × follow 조합 — Google이 실제로 하는 일
네 가지 기본 조합을 자주 이야기한다.
중요한 포인트:
noindex, follow여도 링크된 URL 발견은 가능하다.페이지 자체는 인덱스에서 빠지거나 빠질 수 있지만, 그 HTML 안의 링크는 따라갈 수 있다. “허브 페이지는 검색에 안 보이게 하면서도 크롤 경로는 남긴다”는 패턴이 이것이다.
noindex페이지는 크롤 후에야 인덱스에서 정리되는 경우가 많다.이미 노출 중이던 URL에
noindex를 넣었다고 즉시 사라지지 않을 수 있다. 재크롤·처리 지연을 감안한다. Search Console URL 검사로 상태를 확인한다.robots.txt로 막아 버리면 meta를 못 본다.“검색에서 빼고 싶은데 Disallow만 걸었다”는 전형적인 함정이다. 봇이 HTML에 닿지 못하면
noindex를 읽지 못하고, 외부 링크로 URL만 남는 상황이 생길 수 있다.- 충돌하는 신호
같은 페이지에
index와noindex가 섞이거나, meta와X-Robots-Tag가 다르면 엔진은 보수적으로(더 강한 제한으로) 해석하는 경향이 있다. 의도를 하나로 맞추는 편이 낫다.
이 도식이 말하는 것: index×follow 네 칸은 “이 페이지를 검색에 올릴지”와 “여기서 나가는 링크를 따라갈지”를 독립적으로 고르는 매트릭스다. noindex, follow는 페이지는 숨기고 링크 발견은 남기는 조합이다.
신호의 순서와 충돌 — robots.txt → 헤더 → meta
봇이 URL에 접근하는 흐름을 단순화하면 대략 이렇게 볼 수 있다.
- robots.txt
이 경로를 크롤해도 되는가? 여기서 막히면 HTML·meta에 도달하지 못할 수 있다.
- HTTP 응답
본문과 함께
X-Robots-Tag가 있으면 헤더 지시를 읽는다. - HTML
<head>의 meta robots문서 안 지시를 읽는다.
실무 규칙으로 기억할 것:
- 색인 제외가 목적이면 봇이 페이지(또는 헤더)에 접근 가능한 상태에서
noindex를 보여 준다. - 크롤 부하·민감 경로 차단이 목적이면
robots.txt를 쓴다. 단, 그 경로의 “검색 결과에서 URL 제거”까지 보장하지는 않는다. - PDF 등 비HTML은 meta를 못 넣으니
X-Robots-Tag가 맞다. - canonical과
noindex를 한 페이지에 동시에 걸면 신호가 헷갈린다. “대표 URL로 합치기”와 “인덱스에서 빼기”는 목적이 다르다. 중복이면 보통 canonical(또는 리다이렉트)로 통합하고, 아예 검색에 나오면 안 되면noindex(접근 가능 전제)로 간다.
이 도식이 말하는 것: 먼저 robots.txt가 크롤 문을 열고/닫고, 문이 열린 뒤에야 X-Robots-Tag와 meta robots가 색인·팔로우를 말한다. 문 앞에서 막으면 안의 안내문을 읽지 못한다.
Googlebot과 다른 봇 — name="googlebot"
name="robots"는 여러 크롤러를 향한 일반 지시로 쓰인다. Google만 다르게 주고 싶으면:
<meta name="robots" content="noindex">
<meta name="googlebot" content="index, follow">
처럼 더 구체적인 봇 이름이 일반 robots를 덮어쓰는 식으로 동작한다(Google 문서 기준: 봇별 메타가 있으면 그쪽이 해당 봇에 우선).
다른 엔진도 자체 토큰을 쓰는 경우가 있다(예: 일부 엔진의 전용 name). 다만 실무 대부분은 name="robots" 하나로 통일하고, Google만 예외가 필요할 때 googlebot을 추가한다.
참고:
- Googlebot이 JS를 렌더링하는 환경과, 단순 HTTP 클라이언트로 HTML만 보는 도구는 결과가 다를 수 있다. 초기 HTML에 meta가 있는지가 검증의 출발점이다.
Googlebot-Image,Googlebot-News등 세분된 크롤러에 대한 지시·robots.txt User-agent도 별도로 존재한다. 이미지 검색만 막을지, 웹 검색까지 막을지에 따라 선택지가 갈린다.
언제 쓰는가 — 페이지 유형별
의도가 “검색 결과에 나오면 안 되거나, 나와도 손해”인 페이지에 주로 쓴다.
로그인·계정 영역
세션 없이는 의미 없는 화면, 또는 개인화가 강한 화면. noindex (필요 시 nofollow). 다만 로그인 벽 뒤에만 noindex가 있고, 봇은 로그인 전 HTML만 본다면 봇은 noindex를 못 읽을 수 있다. 봇이 받는 응답에 태그가 있어야 한다.
장바구니·결제 중간·감사(thank-you) 페이지
전환 퍼널 URL이 검색으로 유입되면 이상하다. 감사 페이지가 색인되면 할인·트래픽 왜곡도 생긴다. 보통 noindex, follow 또는 none.
중복·파라미터 URL
정렬·필터·추적 파라미터가 붙는 URL. 가능하면 canonical·파라미터 처리로 정리하고, 정말 색인 가치가 없으면 noindex. canonical과 noindex를 동시에 남발하지 않는다.
스테이징·프리뷰·개발 환경
기본은 인증 + noindex + (가능하면) robots.txt 차단을 겹친다. 실수로 색인되면 프로덕션과 경쟁하거나 미완성 내용이 노출된다. 단, robots.txt만으로 “검색에서 URL 제거”를 기대하지 말 것.
개인정보·약관 중 일부, 내부 정책만의 페이지
공개할 의무와 검색 노출 필요는 별개다. 노출이 불필요하면 noindex.
얇은 검색 결과·빈 목록 페이지
사이트 내 검색 결과 URL이 무한히 생기고 내용이 얇으면 품질·중복 이슈가 난다. 목록에 결과 없을 때 noindex, 또는 검색 결과 섹션 자체를 noindex로 두는 패턴이 있다.
페이지네이션·면책·인쇄용 뷰
사이트 구조에 따라 다르지만, “대표 콘텐츠가 이미 다른 URL에 있다”면 canonical 우선, 그게 어렵고 검색 가치가 없으면 noindex.
HTML 예시와 레이아웃에 넣는 위치
기본 예시
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>주문 완료</title>
<meta name="robots" content="noindex, follow">
<!-- 그 외 description, canonical, og 등 -->
</head>
<body>...</body>
</html>
Google만 스니펫을 크게 허용하는 예:
<meta name="robots" content="max-image-preview:large, max-snippet:-1, max-video-preview:-1">
헤더로 동일 지시를 주는 예(서버·CDN 설정):
HTTP/1.1 200 OK
X-Robots-Tag: noindex, nofollow
Content-Type: text/html; charset=utf-8
Astro / 공통 BaseLayout에 두는 방식(개념)
프레임워크 이름은 Astro든 Next든 같다. 모든 페이지가 공유하는 <head> 슬롯에, 페이지 frontmatter·props로 robots 값을 넘긴다.
개념만 적으면:
---
// BaseLayout.astro (개념 예시 — 경로·API는 프로젝트마다 다름)
const { title, robots = "index, follow" } = Astro.props;
---
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8" />
<title>{title}</title>
<meta name="robots" content={robots} />
<slot name="head" />
</head>
<body>
<slot />
</body>
</html>
특정 페이지만:
---
import BaseLayout from "../layouts/BaseLayout.astro";
---
<BaseLayout title="장바구니" robots="noindex, nofollow">
<!-- 본문 -->
</BaseLayout>
스테이징이면 환경 변수로 기본값을 noindex로 고정하는 패턴도 흔하다. 프로덕션 빌드에서만 index를 허용한다.
중요한 건 “컴포넌트 트리 어딘가에서 클라이언트만으로 늦게 붙인다”가 아니라, 응답 HTML의 <head>에 처음부터 존재하는 것이다.
검증 방법
문서에 넣었다고 끝이 아니다. 봇·CDN·캐시가 다른 응답을 줄 수 있다.
1) 브라우저에서 소스 보기
페이지 우클릭 → 페이지 소스 보기(또는 개발자 도구 Elements가 아니라 view-source). <meta name="robots" ...>가 있는지, content 값이 의도한 값인지 확인한다. React/Vue SPA라면 “처음 받은 HTML”과 “렌더 후 DOM”이 다를 수 있으니, 최초 응답 HTML을 기준으로 본다.
2) curl로 헤더 확인
X-Robots-Tag는 소스에 안 보인다.
curl -sI "https://example.com/cart" | grep -i robots
-I는 HEAD 요청이다, 서버가 HEAD와 GET을 다르게 구현하면 GET으로도 한번 본다.
curl -sD - -o /dev/null "https://example.com/cart" | grep -i robots
HTML 본문의 meta까지 보려면:
curl -sL "https://example.com/thank-you" | grep -i 'name="robots"'
3) Google Search Console URL 검사
Search Console의 URL 검사로 실제 Googlebot 관점의 크롤·색인 가능 여부, 발견된 robots 지시 등을 확인한다. noindex를 넣었는데도 결과에 남아 있으면, 마지막 크롤 시점·차단 여부·다른 신호(예: robots.txt)를 의심한다.
배포 직후 CDN 캐시가 옛 HTML을 물고 있으면 검증이 어긋난다. 캐시 무효화 후 다시 본다.
이 도식이 말하는 것: 검증은 view-source로 meta를 보고, curl로 X-Robots-Tag 헤더를 보고, GSC URL 검사로 Google이 그 신호를 어떻게 읽는지 확인하는 세 갈래다.
흔한 함정
robots.txt에서 CSS·JS까지 막아 두기
예전에 “크롤 예산” 이야기로 정적 자산을 막던 습관이 남아 있으면, Google이 페이지를 제대로 렌더링하지 못해 내용·링크·때로 메타까지 잘못 해석할 수 있다. 렌더에 필요한 CSS/JS는 열어 두는 쪽이 맞다. 막아야 할 것은 보통 관리자·내부 API·완전 비공개 경로다.
로그인 뒤에만 noindex가 있는 경우
봇은 로그인하지 않은 응답을 받는다. 그 응답에 noindex가 없으면 색인될 수 있다. 비로그인 HTML에도 동일 지시를 넣거나, 애초에 검색에 노출될 URL을 만들지 않는다(인증·404·410·canonical 등 정책과 함께).
robots.txt Disallow로 “noindex 대신” 쓰기
접근을 막으면 meta를 못 읽는다. 외부 링크가 있으면 URL만 결과에 남을 수 있다. 검색 제외가 목적이면 크롤 가능한 상태에서 noindex(또는 X-Robots-Tag).
canonical과 noindex 동시 남발
“이 URL은 B가 대표”와 “이 URL은 인덱스에 넣지 마”가 한 문서에 있으면 엔진이 어느 쪽을 믿을지 애매해진다. 중복 통합은 canonical/리다이렉트, 완전 제외는 noindex로 역할을 나눈다.
메타는 noindex인데 내부 링크·사이트맵에는 버젓이 포함
발견 자체는 막지 않지만, 크롤 예산을 낭비하고 의도가 흐려진다. noindex URL은 사이트맵에서 빼고, 내부 링크도 최소화하는 편이 깔끔하다.
스테이징이 프로덕션과 같은 URL·인증 없음
noindex만 믿고 열어 두면, 잠깐의 설정 실수나 태그 누락으로 색인된다. 기본은 접근 제어(인증, IP 제한) + noindex + 검색엔진에 올리지 않는 도메인 정책이다.
지시 충돌
템플릿 기본값 index,follow에 페이지에서 noindex를 또 넣고, CDN이 X-Robots-Tag: index를 붙이는 식. 한곳의 진실 공급원(레이아웃 props 또는 헤더 중 하나)을 정한다.
unavailable_after만 넣고 방치
만료 후에도 URL·내부 링크가 남아 있으면 관리 비용만 남는다. 캠페인이 끝나면 noindex 고정이나 URL 제거·리다이렉트로 정리한다.
짧은 체크리스트 (정의 문서용)
페이지를 검색에서 빼고 싶다면:
- 봇이 그 URL의 HTML 또는
X-Robots-Tag를 읽을 수 있는가? (robots.txt에 막혀 있지 않은가?) <meta name="robots" content="noindex">또는 동등 헤더가 최초 응답에 있는가?- 사이트맵·내부 링크에서 불필요한 발견을 줄였는가?
- view-source /
curl/ GSC로 확인했는가?
페이지는 색인하되 스니펫·이미지 미리보기만 조정한다면 max-snippet, max-image-preview, nosnippet 등을 쓰고, 사이트 전체 크롤 차단이 필요하면 그때 robots.txt를 검토한다.
meta robots는 “검색엔진에게 이 HTML 페이지를 어떻게 다룰지”를 적는 페이지 단위 메모다. 사이트 입구의 경비원(robots.txt)과 혼동하지 않고, 색인을 빼려면 경비원을 우회할 게 아니라 문을 연 채로 안내문(noindex)을 읽게 하면 된다.