← 전체 글로 돌아가기

Next.js

access log로 봇과 실제 사용자를 구분하기

웹 서버 access log를 분석해서 봇 트래픽을 식별하고, 실제 사용자의 접속 패턴을 파악하는 방법을 정리했다.

웹 서버의 access log를 보면 실제 사용자뿐만 아니라 검색 엔진 크롤러, 모니터링 봇, 악의적인 스크래퍼 등 여러 종류의 요청이 섞여 있다. 이들을 구분하는 방법을 알면, 실제 사용자의 동작만 분석할 수 있다.

Access log의 기본

Nginx 기본 access log 형식:

192.168.1.100 - - [29/Jun/2026:10:30:45 +0000] "GET /blog/post HTTP/1.1" 200 1234 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"

주요 정보:

  • IP: 192.168.1.100
  • Timestamp: 29/Jun/2026:10:30:45
  • Request: GET /blog/post HTTP/1.1
  • Status: 200
  • Bytes: 1234
  • User-Agent: Mozilla/5.0...

User-Agent로 구분하기

가장 간단한 방법은 User-Agent 헤더를 본다.

# 구글 크롤러 식별
grep 'Googlebot' /var/log/nginx/access.log | wc -l

# 일반 브라우저만 필터
grep -v 'bot\|crawler\|spider\|scraper' /var/log/nginx/access.log | wc -l

흔한 봇들의 User-Agent

Googlebot
Bingbot
YandexBot
MojeekBot
SemrushBot
AhrefsBot
Curl/  (프로그래밍 도구)
Python-Requests/  (자동화 스크립트)
wget/  (다운로드 도구)

HTTP 메소드로 구분

정상적인 사용자는 GET과 POST만 사용하는데, 봇은 이상한 요청을 많이 한다.

# 모든 HTTP 메소드 통계
awk '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# 이상한 메소드 찾기 (HEAD, OPTIONS 등 과도한 요청)
grep -E ' (HEAD|OPTIONS|CONNECT|TRACE)' /var/log/nginx/access.log | wc -l

HEAD 요청이 많으면 헬스 체크나 모니터링 도구일 가능성이 높다.

IP 주소로 구분

같은 IP에서 비정상적으로 많은 요청이 오면 봇이다.

# 가장 많은 요청을 보낸 IP 상위 10개
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 특정 IP에서 1분 동안 몇 개의 요청을 했는가?
grep '192.168.1.100' /var/log/nginx/access.log | wc -l

응답 상태 코드로 구분

봇은 존재하지 않는 페이지도 요청하므로 404가 많다.

# 상태 코드별 통계
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# 특정 IP의 요청 중 404의 비율
grep '192.168.1.100' /var/log/nginx/access.log | awk '$9 ~ /404/ {count++} END {print count}'

실제 사용자 행동 분석

User-Agent, HTTP 메소드, 상태 코드를 함께 확인해서 실제 사용자만 필터링한다.

# 실제 사용자로 추정되는 GET 요청만
grep ' GET ' /var/log/nginx/access.log | \
  grep -v 'bot\|crawler\|spider\|scraper\|curl\|wget' | \
  grep ' 200 ' | \
  tail -20

Referer로 이동 경로 파악

실제 사용자는 일반적인 경로로 이동하지만, 봇은 무작위로 접속한다.

# Referer 추출 (Apache/Nginx 로그 형식에 따라 다름)
grep '192.168.1.100' /var/log/nginx/access.log | \
  awk -F'"' '{print $4}' | \
  sort | uniq

같은 페이지에서 자연스럽게 다른 페이지로 이동했는지 확인한다.

봇 차단

패턴을 파악했으면, robots.txt나 방화벽으로 차단할 수 있다.

# nginx에서 특정 User-Agent 차단
if ($http_user_agent ~* (bot|crawler|spider)) {
    return 403;
}

# 또는 특정 IP 차단
if ($remote_addr = 192.168.1.100) {
    return 403;
}

모니터링

# 실시간 access log 모니터링
tail -f /var/log/nginx/access.log | \
  grep -v 'bot\|crawler\|spider\|health_check'

결론

Access log는 단순히 요청 기록이 아니라, 트래픽의 성질을 이해하는 창이다. User-Agent, HTTP 메소드, IP, 상태 코드를 함께 보면 봇인지 사용자인지 정확히 구분할 수 있다.