← 블로그 목록
작성일: 2026-05-27 User-AgentSEO

봇 트래픽 vs 사람 트래픽 구분하는 로그 분석 기법

웹 서버 로그에는 사람의 요청과 봇의 요청이 섞여 있습니다. SEO 크롤러는 유익하지만, 스크래핑 봇, 스캐너, DDoS 봇은 차단해야 합니다. 로그 분석으로 봇 트래픽을 구분하고 대응하는 방법을 알아봅니다.


User-Agent 기반 봇 분류

유익한 봇 (SEO 크롤러)

`` Googlebot/2.1 (+http://www.google.com/bot.html) Bingbot/2.0 (+http://www.bing.com/bingbot.htm) facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) `

이들은 robots.txt를 준수하며 적정 속도로 크롤링합니다.

악의적 봇

` python-requests/2.28.0 curl/7.68.0 Scrapy/2.5.0 Nikto/2.1.6 (Vulnerability Scanner) sqlmap/1.5 (Security Testing) `


grep으로 봇 트래픽 추출

봇 User-Agent 패턴

`bash grep -iE "(bot|crawler|spider|scraper|curl|python-requests|scrapy)" /var/log/nginx/access.log | wc -l `

정상 브라우저만 추출

`bash grep -iE "(Mozilla|Chrome|Safari|Firefox|Edge)" /var/log/nginx/access.log \ | grep -viE "(bot|crawler|spider)" | wc -l `

UA별 요청 수 집계

`bash awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20 `


봇 트래픽의 행동 패턴

1. 요청 간격이 매우 짧음

사람: 페이지 로드 → 읽기 → 클릭 (수 초~수십 초) 봇: 요청 → 즉시 다음 요청 (수 밀리초)

IP별 평균 요청 간격:

`bash awk '{print $1, $4}' /var/log/nginx/access.log | sort | uniq -c `

2. 순차적 경로 접근

` GET /page?id=1 GET /page?id=2 GET /page?id=3 ... (숫자만 증가) `

3. Referer가 항상 없음

`bash awk -F'"' '$4 == "-" {print $1}' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn `

4. 같은 경로만 반복 요청

`bash awk '{print $1, $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20 `

출력 예시:

` 1234 192.0.2.100 /api/products 1122 198.51.100.7 /sitemap.xml `


Nginx에서 봇 차단

robots.txt 무시 봇 차단

`nginx if ($http_user_agent ~* (scrapy|curl|python-requests|sqlmap|nikto)) { return 403; } `

SEO 봇만 허용 (화이트리스트)

`nginx map $http_user_agent $is_bot { default 1; ~*(googlebot|bingbot|yandex|duckduckbot|facebookexternalhit) 0; ~(Mozilla.Chrome|Mozilla.Firefox|Mozilla.Safari) 0; }

server { if ($is_bot = 1) { return 403; } } `


고급 봇 탐지: 행동 분석

User-Agent만으로는 부족합니다. 헤더를 변조한 봇은 정상 브라우저처럼 위장합니다.

JavaScript Challenge

진짜 브라우저만 JavaScript를 실행할 수 있습니다.

`html `

Nginx에서 쿠키 확인:

`nginx if ($http_cookie !~* "js_enabled=1") { return 403; } `

reCAPTCHA v3

의심스러운 트래픽에만 CAPTCHA 표시:

`html `


봇 트래픽 통계

전체 트래픽 중 봇 비율

`bash TOTAL=$(wc -l < /var/log/nginx/access.log) BOTS=$(grep -icE "(bot|crawler|spider|curl|python)" /var/log/nginx/access.log) echo "Bots: $BOTS / Total: $TOTAL = $((100 * BOTS / TOTAL))%" `

봇 트래픽 시간대 분포

`bash grep -iE "(bot|crawler|spider)" /var/log/nginx/access.log \ | awk '{print $4}' | cut -d: -f2 | sort | uniq -c ``


유익한 봇 vs 악의적 봇 구분

특징유익한 봇악의적 봇
--------------------------
User-Agent공식 이름 명시변조 또는 일반 브라우저
robots.txt준수무시
요청 간격1~5초수백ms
접근 경로링크 구조 따름순차 증가 (id=1,2,3...)
Referer있음대부분 없음

정리

봇 트래픽은 User-Agent, 요청 간격, 경로 패턴, Referer 유무로 구분할 수 있습니다. SEO 크롤러는 허용하되, 스크래핑 봇과 스캐너는 Nginx에서 User-Agent 기반으로 차단하거나 JavaScript Challenge로 걸러내야 합니다.