AI 요약은 "사기가 아니다"라고 말했다. 그 도약판은 바로 당신 사이트의 검색창이었다
요약
사이트 검색창의 쿼리 파라미터를 악용하여 신뢰할 수 있는 도메인에 허위 정보를 인덱싱시키는 '사이트 검색 스팸' 공격을 분석합니다. 공격자가 조작된 URL을 통해 합법적인 사이트가 사기 관련 허위 정보를 포함하도록 유도하고, 이것이 AI 요약(AI Overviews)에 반영되는 메커니즘을 다룹니다.
핵심 포인트
- 사이트 검색창의 쿼리 파라미터가 허위 정보 인덱싱의 공격 표면이 됨
- 공격자는 URL 조작만으로 신뢰할 수 있는 도메인의 권위를 악용 가능
- AI 요약(RAG)은 인덱싱된 허위 정보를 사실로 인용하여 피해 확산
- noindex, X-Robots-Tag, 404 반환 등을 통한 방어책 적용 필요
지난 8월, 크루즈 여행을 계획하던 한 남성이 Royal Caribbean의 고객 서비스 번호를 구글(Google)에 검색했습니다. 구글의 AI Overview(AI 개요)는 검색 결과 상단에 전화번호 하나를 제공했습니다. 그는 그 번호로 전화를 걸어 카드 정보를 건네주었지만, 그 번호는 사기꾼들의 것이었습니다. Southwest Airlines 검색에서도 유사한 사례가 발생했습니다. AI 요약이 정보를 가져갈 수 있는 위치에 가짜 지원 번호를 심어두는 이 변종 공격 방식은 많은 언론의 보도를 받았습니다.
지난주, 일본 경시청(Metropolitan Police)은 개발자들이 더 주목해야 할, 조금 더 조용한 변종을 발표했습니다. 공격 표면(attack surface)이 합법적인 사이트에 위치하기 때문입니다. 바로 검색창(search box)입니다. 아마 당신의 사이트에 있는 그것 말입니다.
경찰이 설명한 상황은 다음과 같습니다: 누군가가 소셜 미디어에서 투자 그룹에 초대받습니다. 돈을 보내기 전, 그들은 현명하게도 해당 그룹의 이름을 검색합니다. 검색 결과에는 "XX는 사기가 아니다"와 "XX로 돈을 벌었다"라는 내용이 나타납니다. 페이지 상단의 AI 요약 또한 "XX는 사기가 아니다"라며 동조합니다. 안심한 피해자는 돈을 송금합니다.
피해자의 검증 습관인 "믿기 전에 검색해 보자"라는 행동이 함정의 일부로 편입된 것입니다.
이 보고서를 읽었을 때 저의 첫 번째 질문은 "어떻게?"였습니다. 저는 매일 LLMO(AI 검색에 의해 인용되도록 사이트를 최적화하는 작업)를 수행하고 있기 때문에, SEO 업계에 떠도는 검색 오염(search-pollution) 기술 중 하나일 것이라고 의심했습니다. 추적 결과는 제가 예상했던 것보다 더 오래되고 단순한 것이었습니다. 바로 2023년 2월 일본의 SEO 기업 JADE가 기록한 사이트 검색 스팸(site-search spam)이었습니다.
이 포스트에서는 그 메커니즘과 왜 AI 요약이 거짓말을 반복하는지, 그리고 이번 주에 바로 적용할 수 있는 방어책(noindex, X-Robots-Tag, 검색 결과가 없을 때 404 반환)을 다룹니다.
메커니즘: 해킹 없는 3단계
검색창이 있는 대부분의 사이트는 /search?q=keyword와 같은 URL로 결과를 반환합니다. 일반적인 구현 방식의 두 가지 특성이 공격의 발판이 됩니다:
- 누구나 쿼리 파라미터(query parameter)에 임의의 문자열을 넣을 수 있습니다.
- 페이지가 해당 쿼리를
<title>또는<h1>에 반영합니다 ("'keyword'에 대한 검색 결과 | Acme Corp")
공격 방식:
- 공격자는 신뢰할 수 있는 도메인에서 검색 URL을 구성합니다:
acme.com/search?q=XX+is+not+a+scam. 검색창을 직접 건드릴 필요도 없습니다. URL 하나만으로 충분합니다. - 그들은 자신이 제어하는 사이트에서 해당 URL로 링크를 겁니다.
- Googlebot이 링크를 따라가 결과 페이지를 크롤링하고 인덱싱(indexing)합니다. 그 이후부터 웹 검색 결과에는 합법적인 도메인 아래에 "XX는 사기가 아닙니다 | Acme Corp"라는 문구가 표시될 수 있습니다.
피해를 입은 사이트는 침해당한 적이 없습니다. 악성코드도, 침입도, 도구도 없었습니다. 공격자는 URL을 만들고 링크를 배치했을 뿐입니다. 제가 처음 이 사실을 이해했을 때, 저도 모르게 "잠깐, 이게 끝이라고?"라고 소리 내어 말했습니다. 여기서 악용되는 것은 취약점(vulnerability)이 아닙니다. 그것은 사양(spec)입니다.
검색하는 사람에게는 Acme Corp의 웹사이트가 "사기가 아니다"라고 말하는 것처럼 보입니다. 도메인이 수년간 쌓아온 신뢰가 낯선 이의 문장에 전대(sublease)되는 것입니다.
AI 요약이 거짓말을 반복하는 이유
AI Overviews 및 유사한 기능들은 구조적으로 RAG(Retrieval-Augmented Generation, 검색 증강 생성)와 유사합니다. 검색 인덱스(search index)에서 쿼리와 관련된 페이지를 검색(retrieve)한 다음, 이를 바탕으로 답변을 구성합니다. 내부 동작 방식은 공개되지 않았지만, 의존성은 관찰 가능합니다. 즉, 요약은 인덱스의 하류(downstream)에서 구축됩니다.
AI는 이러한 설정(setup)을 감지할 방법이 없습니다. AI가 검색해온 것은, AI가 판단할 수 있는 한 신뢰할 수 있는 도메인의 텍스트입니다. AI는 주장의 진위 여부를 검증하지 않습니다. 대신 소스의 권위(authority)와 소스 간의 일치 여부를 따집니다. 따라서 공격자가 여러 평판 좋은 도메인의 검색 URL에 동일한 문장을 심어두면, AI는 여러 개의 독립적이고 권위 있는 소스들이 서로 동의하고 있다고 판단하게 됩니다.
이것이 추악한 부분입니다. AI가 권위 신호(authority signals)에 더 진지하게 가중치를 둘수록, 이 공격은 더 효과적으로 작동합니다. 성실한 AI일수록 가장 쉬운 타깃이 됩니다.
파이프라인은 단순합니다: 상류(upstream)에는 검색 인덱스가 있고, 하류(downstream)에는 AI 요약이 있습니다. 상류를 오염시키면 하류는 스스로 오염됩니다. AI 벤더들이 더 잘 필터링하기를 기다릴 수도 있겠지만(Google은 가짜 전화번호에 대해 "조치를 취했다"고 했지만, 새로운 번호들이 계속 나타났습니다), 여러분의 사이트에서 반사 표면(reflection surface)을 닫는 것이 더 빠르고 실제로 여러분이 통제할 수 있는 방법입니다.
5분 자가 점검
여러분의 사이트가 도약판(springboard)으로 이용될 수 있을까요? 세 가지 점검 사항입니다:
# 1. 검색 결과 페이지가 인덱싱(indexed)되어 있습니까? (Google 기준)
site:example.com inurl:search
site:example.com inurl:"?s="
...
# 3. 검색 결과 페이지에 noindex가 적용되어 있습니까?
curl -sI "https://example.com/search?q=test" | grep -i x-robots-tag
...
site: 쿼리는 빠른 스모크 테스트(smoke test)입니다. Google이 모든 결과를 완벽하게 보장하지는 않습니다. 확실한 답변을 얻으려면, Search Console을 열고 색인 생성(Indexing) > 페이지(Pages) 및 성능(Performance) > 페이지(Pages)에서 /search 또는 ?s=를 포함하는 URL을 확인하십시오.
또한 검색 결과 템플릿을 살펴보십시오. 검색어(query)가 <title>이나 <h1>에 반영(reflect)되고 있습니까? 반영(Reflection)과 색인 가능성(indexability)이 결합되면 여러분은 공격의 대상이 됩니다.
한 가지 안심할 만한 점은, 클라이언트 사이드 검색(client-side search, 정적 사이트에서 흔히 쓰이는 브라우저 내 JS 필터링)은 이러한 공격 표면(attack surface)을 전혀 갖지 않는다는 것입니다. 서버가 검색어마다 서로 다른 HTML을 반환하지 않기 때문입니다.
방어책 (Defenses)
JADE의 권장 사항에 기반한 두 가지 실행 가능한 전략입니다:
| 조치 사항 | 효과 | 주의 사항 |
|---|---|---|
<meta name="robots" content="noindex"> | 결과 페이지를 인덱스에서 확실하게 제외함 | robots.txt가 페이지를 차단하면 무력화됨 |
| ... |
선택은 간단합니다:
- 검색 결과 페이지에서 SEO 트래픽을 추구하지 않습니까? 그렇다면 모두
noindex처리하십시오. 가장 간단하고 신뢰할 수 있는 방법입니다. - 해당 트래픽을 유지하고 싶습니까? 검색 결과가 없는(zero-hit) 쿼리에 대해
noindex를 반환하십시오. "XX는 사기가 아니다"와 같은 스팸 문구는 거의 항상 검색 결과가 0건이므로, 이것만으로도 대부분의 공격을 차단할 수 있습니다.
반드시 숙지해야 할 함정이 하나 있습니다: noindex는 크롤러(crawler)가 페이지를 읽을 수 있을 때만 작동합니다. robots.txt에서 URL을 차단하면 크롤러가 noindex를 아예 볼 수 없게 되며, 이는 방어 체계 전체를 무력화합니다. Google의 문서에서도 이를 명시하고 있습니다: noindex가 효과를 발휘하려면 페이지가 robots.txt에 의해 차단되지 않아야 합니다. 동일한 URL에 이 두 가지를 절대 동시에 적용하지 마십시오.
구현 예시.
Yoast 또는 유사한 플러그인을 사용 중이라면 WordPress 검색 페이지(?s=)는 기본적으로 noindex 처리가 됩니다. 아무런 플러그인이 없는 순수 테마(bare theme)라면, wp_robots 필터(WordPress 5.7 이상, 코어 및 플러그인 출력과 잘 호환됨)를 사용하십시오:
// functions.php
add_filter('wp_robots', function ($robots) {
if (is_search()) {
...
Next.js (App Router):
// app/search/page.tsx
export const metadata = {
robots: { index: false, follow: true },
...
인프라 계층(infra layer)인 nginx의 경우입니다. 이 코드 스니펫에는 두 가지 주의사항이 있습니다. 이 방식은 쿼리 스타일(?s=)이 아닌 경로 스타일(/search) 검색 URL에 매칭된다는 점입니다. 쿼리 스타일의 경우 $arg_s를 기준으로 분기해야 합니다. 또한, nginx의 add_header에는 주의해야 할 상속 규칙이 있습니다. 특정 location 블록 내에 단 하나의 add_header가 있으면 상위 레벨에서 정의된 모든 헤더가 취소되므로, 보안 헤더 등을 그곳에 다시 선언해야 합니다.
location /search {
add_header X-Robots-Tag "noindex" always;
# 상위 레벨의 add_header 라인들(보안 헤더 등)을 여기서 다시 선언하십시오
...
사기(scam) 관점을 차치하더라도, 검색 결과 페이지를 noindex 처리하는 것은 표준적인 SEO 위생(SEO hygiene)입니다. 이는 중복 콘텐츠(duplicate-content)의 팽창과 크롤링 예산(crawl budget) 낭비를 방지합니다. 이는 마침내 이를 실행할 좋은 명분이 됩니다.
요약 (Wrap-up)
- 일본 경찰이 경고했던 "사기가 아니다"라는 방식의 포이즈닝(poisoning)은 사이트 검색 스팸(site-search spam)으로 설명됩니다. 악용되는 지점은 바로 스펙(spec)입니다. 즉, 쿼리를 반영(reflect)하고 인덱싱을 허용한다는 점입니다.
- AI 요약은 검색 인덱스에 대한 RAG (Retrieval-Augmented Generation)입니다. 상류(upstream)의 포이즌이 하류(downstream)의 답변이 됩니다. 여러분의 반영 표면(reflection surface)을 폐쇄하는 것이 AI 측의 필터를 기다리는 것보다 빠릅니다.
noindex는 근간입니다.noindex처리를 원하는 URL을robots.txt로 차단하지 마십시오. 검색 트래픽을 유지하고 싶다면 유지하되, 검색 결과가 없는 페이지에는noindex를 적용하십시오.
사이트를 운영 중이라면 오늘 바로 site:yourdomain inurl:search를 검색해 보십시오. 만약 결과가 나온다면, 위의 방어 섹션이 여러분의 오후 업무가 될 것입니다. 여러분의 검색창이 누군가의 "이것은 사기가 아니다"를 실어 나르고 있지는 않습니까?
참고 문헌 (References)
- 일본 경시청 (Metropolitan Police Department), 사이버 보안 대책과 (Cyber Security Countermeasures Division) 권고안, 2026년 7월 24일. 보도: ITmedia NEWS, 2026년 7월 27일 (일본어)
- Yusuke Murayama, Site-search spam abusing other companies' sites, JADE 블로그, 2023년 2월 8일 (일본어)
- Washington Post via Slashdot: Google의 AI Overview가 고객 서비스 번호를 안내했습니다. 그것은 사기였습니다. (2025년 8월)
- Google Search Central, noindex를 사용하여 검색 인덱싱 차단하기 (Block Search indexing with noindex)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기