Googlebot을 차단하지 않으면서 AI 봇 감지하는 방법
요약
본 가이드는 합법적인 검색 엔진 크롤러(예: Googlebot)는 허용하면서 악의적이거나 원치 않는 AI 봇 및 스크래퍼를 감지하는 방법을 다룹니다. Node.js와 Express를 사용하여 사용자 에이전트 문자열을 인식하고, IP 인텔리전스를 활용하여 의심스러운 트래픽을 분류하는 봇 감지 도구 구축 과정을 안내합니다.
핵심 포인트
- Googlebot과 같은 합법적 크롤러는 차단하지 않으면서 AI 봇을 식별해야 합니다.
- User-Agent 헤더만으로는 충분치 않으며, '식별'과 '검증'의 개념 구분이 중요합니다.
- Node.js와 Express를 사용하여 기본적인 봇 감지 서버를 구축할 수 있습니다.
- IP 인텔리전스는 의심스러운 트래픽을 분류하는 데 도움을 줄 수 있습니다.
귀하의 웹사이트가 자동화된 요청을 받고 있습니다. 일부는 페이지를 색인하려는 검색 엔진에서 온 것입니다. 다른 것은 AI 크롤러, 모니터링 도구, 스크래퍼 또는 악성 스크립트에서 옵니다.
문제는 모든 자동화된 요청을 식별하는 것이 아닙니다. 어떤 봇은 허용되어야 하고 어떤 봇은 더 면밀한 검사가 필요한지 아는 것입니다.
모든 자동화된 것처럼 보이는 것을 차단하면 Googlebot이나 AI 검색 크롤러를 차단할 위험이 있습니다. Googlebot이라고 주장하는 모든 요청을 신뢰하면 누구나 기본적인 필터링 규칙을 우회할 수 있습니다.
그렇다면 합법적인 크롤러를 차단하지 않으면서 어떻게 AI 봇을 감지할까요?
본 가이드에서는 다양한 유형의 봇에 대해 다루고, Node.js를 사용하여 작동하는 봇 감지 도구를 구축하며, VS Code에서 이를 테스트하고, IP 인텔리전스가 의심스러운 트래픽을 분류하는 데 어떻게 도움이 될 수 있는지 탐구할 것입니다.
만들게 될 것: 봇의 사용자 에이전트(user-agent) 문자열을 인식하는 로컬 Express 서버와 샘플 데이터로 테스트할 수 있는 선택적 IP 보안 조회 스크립트입니다.
기본 프로젝트는 무료입니다. 첫 번째 부분을 완료하기 위해 유료 API 구독은 필요하지 않습니다.
1. 다양한 유형의 봇 이해하기
웹사이트를 방문하는 모든 봇이 문제를 일으키려고 하는 것은 아닙니다.
간단한 비교표가 있습니다.
| Bot | Purpose | Typical handling |
|---|---|---|
| Googlebot | Search engine indexing | Allow after verification |
| ... | ||
| OpenAI의 경우를 예로 들면, 서로 다른 목적으로 다른 크롤러를 운영합니다. |
OpenAI 공식 문서에 따르면, OAI-SearchBot은 ChatGPT 검색용으로 사용되며, GPTBot은 AI 모델 훈련에 사용될 수 있는 콘텐츠를 크롤링합니다.
ChatGPT-User는 또 다릅니다. 이는 사용자의 행동에 응답하여 웹 페이지를 검색할 수 있습니다.
이러한 구별은 중요합니다. 왜냐하면 모든 유형의 자동화된 크롤링을 허용하지 않으면서도 AI 검색에서 자신의 기사를 발견 가능하게 하고 싶을 수 있기 때문입니다.
2. 사용자 에이전트 감지만으로는 충분하지 않은 이유
봇을 인식하는 가장 쉬운 방법 중 하나는 HTTP User-Agent 헤더를 통해서입니다.
예를 들어, 요청에 다음과 같은 내용이 포함될 수 있습니다:
Googlebot/2.1
또는:
GPTBot/1.4
서버에서 해당 헤더를 검사하여 요청을 분류할 수 있습니다.
하지만 문제가 하나 있습니다.
누구나 Googlebot인 척하는 요청을 보낼 수 있다는 것입니다:
curl -A "Googlebot" https://example.com
-A 옵션은 curl에게 특정 사용자 에이전트(user-agent) 문자열을 보내도록 지시합니다.
하지만 이것이 요청이 Google에서 온 것임을 의미하지는 않습니다.
그렇기 때문에 우리는 두 가지 개념을 구별해야 합니다:
- 봇 식별 (Bot identification): 요청이 어떤 소프트웨어인 척 주장하는가?
- 봇 검증 (Bot verification): 출처가 실제로 주장된 운영자(operator)에게 속하는가?
식별부터 시작하겠습니다.
3. Node.js를 사용하여 기본적인 AI 봇 감지기 구축하기
이 섹션은 로컬에서 작동하며 IP 인텔리전스 API 키가 필요하지 않습니다.
Node.js, Express, VS Code를 사용할 것입니다.
단계 1: Node.js 설치 확인하기
설치되어 있지 않다면 nodejs.org에서 Node.js를 다운로드하세요.
VS Code를 열고 다음을 선택합니다:
터미널(Terminal) → 새 터미널(New Terminal)
다음 명령어를 실행합니다:
node -v
그런 다음:
npm -v
두 명령어 모두 버전 번호를 표시해야 합니다.
이 프로젝트에는 Node.js 20 이상을 사용하세요.
단계 2: 프로젝트 폴더 생성하기
VS Code 터미널에서 다음 명령어를 실행합니다:
mkdir bot-detection-demo
cd bot-detection-demo
프로젝트를 초기화합니다:
npm init -y
Express와 dotenv를 설치합니다:
npm install express dotenv
그런 다음 **파일(File) → 폴더 열기(Open Folder)**를 사용하여 프로젝트를 VS Code에서 열고 bot-detection-demo를 선택하세요.
단계 3: 메인 서버 파일 생성하기
VS Code 탐색기(Explorer)에서 프로젝트 폴더를 마우스 오른쪽 버튼으로 클릭하고 **새 파일(New File)**을 선택합니다.
이름을 지정합니다:
server.mjs
다음 코드를 붙여넣습니다:
import express from "express";
const app = express();
...
Ctrl + S를 사용하여 파일을 저장하세요.
이 코드는 수신된 요청을 일반적인 검색 및 AI 봇 이름 목록과 비교합니다.
다음 필드를 주목하세요:
verified: false
이것은 의도된 것입니다. 저희 코드는 주장되는 봇 이름을 식별할 뿐, 운영자 검증(operator verification)을 수행하지 않습니다.
단계 4: 서버 시작하기
터미널에서 다음 명령어를 실행하세요:
node server.mjs
다음과 같은 메시지가 표시되어야 합니다:
Server running on port 3000
로컬 서버가 이제 실행되었습니다.
VS Code 터미널 패널의 + 버튼을 사용하여 두 번째 VS Code 터미널을 여세요.
첫 번째 터미널은 계속 실행 상태로 두세요.
5단계: Googlebot 감지 테스트
두 번째 터미널에서 다음 명령어를 실행하세요:
curl -A "Googlebot" http://localhost:3000/check-bot
예상 응답:
{
"message": "Bot identification completed",
"botClaim": "Googlebot",
...
서버가 Googlebot이라고 주장하는 요청을 성공적으로 인식했습니다.
6단계: GPTBot 감지 테스트
다음 명령어를 실행하세요:
curl -A "GPTBot" http://localhost:3000/check-bot
응답에는 다음이 포함되어야 합니다:
{
"message": "Bot identification completed",
"botClaim": "GPTBot",
...
7단계: OAI-SearchBot 테스트
다음 명령어를 실행하세요:
curl -A "OAI-SearchBot" http://localhost:3000/check-bot
응답은 다음을 식별해야 합니다:
{
"message": "Bot identification completed",
"botClaim": "OAI-SearchBot",
...
8단계: 일반 요청 테스트
이제 다음 명령어를 실행하세요:
curl http://localhost:3000/check-bot
curl은 일반적으로 목록에 있는 봇 중 하나라고 주장하지 않기 때문에, 응답에는 다음이 포함되어야 합니다:
{
"message": "Bot identification completed",
"botClaim": null,
...
이상입니다.
사용자 에이전트 기반의 작동하는 봇 식별기를 구축하고 테스트했습니다.
하지만 이 방식은 생소한 사용자 에이전트를 가진 정교한 자동화는 감지하지 못하며, 인식된 이름이 진짜인지 여부도 검증하지 못합니다.
접근 방식을 개선해 봅시다.
4. 실제 Googlebot 트래픽 확인 방법
Google은 DNS 또는 게시된 크롤러 IP 범위를 사용하여 자체 크롤러를 확인할 것을 권장합니다.
DNS 확인 과정은 다음과 같이 작동합니다:
- 실제 클라이언트 IP 주소 추출.
- 역방향 DNS 조회(reverse DNS lookup) 수행.
- 해당 호스트 이름이 승인된 Google 크롤러 도메인으로 끝나는지 확인.
- 해당 호스트 이름에 대해 순방향 DNS 조회(forward DNS lookup) 수행.
- 원래 IP가 반환된 주소 목록 중 하나인지 확인.
예를 들어, Google의 문서에는 다음과 같은 크롤러 호스트 이름이 나와 있습니다:
googlebot.com
하지만 단순히 google이라는 단어를 포함한다고 해서 임의의 호스트 이름을 신뢰해서는 안 됩니다.
호스트 이름은 반드시 Google에서 문서화한 패턴과 일치해야 하며, 순방향 DNS가 원래 주소를 확인해 줘야 합니다.
Google은 또한 공식 크롤러 IP 범위도 게시합니다.
전체 절차는 Google 크롤러 검증 문서에서 확인할 수 있습니다.
OpenAI 크롤러는 어떨까요?
OpenAI은 다양한 크롤러에 대한 IP 범위를 게시합니다:
요청이 GPTBot이라고 주장하는 경우, 실제 소스 IP를 적절한 게시된 범위와 비교할 수 있습니다.
운영 시스템(production systems)의 경우, 이러한 목록을 정기적으로 새로 고치고 IPv4 및 IPv6 CIDR 범위를 올바르게 처리해야 합니다.
또한, 애플리케이션이 역방향 프록시(reverse proxy) 뒤에 위치하는 경우, 실제 신뢰할 수 있는 프록시 인프라를 위해 Express의 trust proxy 설정을 구성하세요. 들어오는 X-Forwarded-For 헤더를 맹신하지 마세요.
5. IP 인텔리전스를 사용한 미확인 봇 감지
Googlebot을 검증하는 것은 유용합니다. 왜냐하면 Google이 공식적인 검증 방법을 제공하기 때문입니다.
하지만 자신을 식별하지 않는 봇은 어떨까요?
알 수 없는 클라이언트가 귀하의 웹사이트에 수천 개의 요청을 보낸다고 상상해 보세요.
그것은 검색 크롤러라고 주장하지 않습니다. 사용자 에이전트(user-agent)는 평범해 보이고, 당신은 그 IP 주소를 알지 못합니다.
이런 상황에서는 IP 인텔리전스가 유용한 맥락을 제공할 수 있습니다.
예를 들어, IPGeolocation.io의 IP Security API는 특정 IP 주소가 다음 중 어느 것과 연관되었는지에 대한 정보를 제공합니다:
- 자동화된 봇 활동
- 알려진 합법적인 봇
- 무차별 대입 공격(Brute-force attacks)
- VPN 및 프록시 네트워크
- Tor exit 노드
- 클라우드 호스팅 제공업체
- 기타 보안 위험
이 API는 다음과 같은 필드를 반환할 수 있습니다:
| Field | Purpose |
|---|---|
is_bot | 해당 IP와 관련된 봇 활동을 식별합니다 |
| ... |
이러한 신호들은 인식된 크롤러와 의심스러운 자동화(suspicious automation)를 구별하는 데 도움이 됩니다.
중요하게도, IP 인텔리전스는 사용 가능한 정보를 기반으로 주소를 분류할 뿐입니다. 이 정보가 해당 주소에서 발생하는 모든 개별 요청이 동일한 소프트웨어에서 비롯되었다는 것을 증명하지는 않습니다.
IP Security API는 무료인가요?
IP Security Lookup 기능은 유료 구독을 요구합니다.
현재 문서에 따르면, 성공적인 보안 조회(security lookup) 한 건당 2개의 API 크레딧이 소모됩니다. 제공업체는 또한 고객 지원을 통해 체험판 액세스를 요청할 수 있는 옵션도 설명하고 있습니다.
유료 접근 권한 없이도 모의 보안 데이터(mock security data)를 사용하여 다음 예제를 진행할 수 있습니다.
6. VS Code에서 IP 봇 분류 테스트하기
이제 보안 정보를 검사하는 별도의 스크립트를 작성해 보겠습니다.
두 가지 테스트 방법을 지원합니다:
- Mock 모드: 로컬에서 예제 데이터를 사용하며 유료 구독이 필요하지 않습니다.
- Live 모드: 구독이 허용될 때 실제 IP Security API를 호출합니다.
1단계: 테스트 파일 생성하기
같은 프로젝트 내에 다음 파일을 만듭니다:
test-ip.mjs
다음 내용을 붙여넣습니다:
import
이는 외부 API 요청을 하지 않고도 분류 로직을 검증합니다.
데이터는 시뮬레이션된 것이므로 이 출력을 실제 IP 인텔리전스로 제시하지 마십시오.
### 3단계: 실시간 API 접근 설정
유료 Security API에 접근하거나 활성화된 체험판이 있는 경우, 다음 이름의 파일을 생성하십시오:
`.env`
다음 내용을 추가합니다:
IPGEOLOCATION_API_KEY=your_actual_api_key
플레이스홀더를 실제 API 키로 교체하십시오.
또한 `.gitignore` 파일을 생성하십시오:
.env
node_modules/
실제 API 키는 스크린샷, 코드 예시 또는 GitHub 저장소에 절대 게시하지 마십시오.
### 4단계: 실시간 조회 실행
계정에 Security API 접근 권한이 생기면 다음을 실행하십시오:
node test-ip.mjs live 4.227.36.0
이 IP는 IPGeolocation의 문서에 인식된 AI 크롤러와 관련된 예시로 나타납니다.
요청이 성공하면 실제 보안 필드와 스크립트가 제안하는 조치를 받게 됩니다.
현재 분류는 시간이 지남에 따라 IP 인텔리전스가 변경되므로 문서의 예시와 다를 수 있습니다.
### 5단계: API 접근 오류 이해하기
계정이 Security API를 지원하지 않는 경우, 다음과 유사한 오류를 받을 수 있습니다:
API returned 401:
IP Security Lookup is not supported
on your current subscription.
이는 Node.js 코드가 고장났다는 의미가 아닙니다.
이것은 API가 요청을 받았지만, 구독에서 이 기능을 허용하지 않는다는 의미입니다.
계속 학습하려면 다음을 실행하십시오:
node test-ip.mjs mock
또는 [IP Security API 문서](https://ipgeolocation.io/documentation/ip-security-api.html)에서 구독 및 체험판 정보를 확인하십시오.
## 7. 어떤 봇을 허용하거나 차단할지 결정하는 방법
[](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh1qo6yf07tf3he6muxrj.jpeg)
식별 및 위험 신호를 확보했다면, 정책이 필요합니다.
합리적인 시작점은 다음과 같습니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기