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, 상태 코드를 함께 보면 봇인지 사용자인지 정확히 구분할 수 있다.