← 블로그 목록
작성일: 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 패턴

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

정상 브라우저만 추출

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

UA별 요청 수 집계

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

봇 트래픽의 행동 패턴

1. 요청 간격이 매우 짧음

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

IP별 평균 요청 간격:

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가 항상 없음

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

4. 같은 경로만 반복 요청

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 무시 봇 차단

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

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

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를 실행할 수 있습니다.

<script>
  document.cookie = "js_enabled=1; path=/";
  location.reload();
</script>

Nginx에서 쿠키 확인:

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

reCAPTCHA v3

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

<script src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script>

봇 트래픽 통계

전체 트래픽 중 봇 비율

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))%"

봇 트래픽 시간대 분포

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로 걸러내야 합니다.