봇 트래픽에 무너진 방문자 분석, 교차 확인으로 실제 사용자 8% 잡아낸 백엔드 이야기
봇 트래픽 때문에 방문자 분석이 엉망이었던 경험, 교차 확인 기능으로 실제 사용자 8%를 잡아낸 백엔드 이야기.
봇 트래픽 때문에 방문자 분석이 엉망진창이었던 경험을 공유하려고 한다. 기존 시스템은 실제 사용자인지 봇인지 구분하는 데 한계가 있었고, 덕분에 분석 결과가 왜곡되는 일이 잦았다. 이 글에서 어떻게 이 문제를 해결했는지 이야기해보겠다.
시도와 함정
처음에는 간단하게 생각했다. 기존 분석 시스템에서 원시/참고 섹션을 제거하고 '실방문자' 기준으로만 통일하면 봇 트래픽을 걸러낼 수 있을 줄 알았다. 하지만 결과는 예상과 달랐다. 봇들은 여전히 시스템을 통과했고, 분석 결과는 여전히 부정확했다.
'dwell' 시간, 즉 사용자가 페이지에 머무는 시간만으로는 봇을 완벽하게 탐지하기 어렵다는 것을 깨달았다. 봇들도 일정 시간 동안 페이지에 머무르는 것처럼 보이게 만들 수 있었기 때문이다. 이 부분에서 3시간 정도를 삽질했던 것 같다.
# 기존 분석 로직 (가상)
def is_real_user(session_data):
if session_data['bot_score'] > 0.8:
return False
if session_data['dwell_time'] < 10: # 10초 미만은 봇으로 간주
return False
return True
위와 같은 단순한 로직으로는 봇을 걸러내기 역부족이었다. 봇들은 dwell_time을 조작하거나, 의도적으로 10초 이상 머무르는 것처럼 보이게 할 수 있었다.
원인
결국 문제는 봇 트래픽을 탐지하는 로직이 너무 단일 지표에 의존하고 있었다는 점이었다. 'dwell' 시간만으로는 봇의 행동 패턴을 충분히 파악할 수 없었다. 봇은 실제 사용자와는 다른 방식으로 웹사이트를 탐색하기 때문이다.
해결
이 문제를 해결하기 위해 '교차 확인 방문자'라는 새로운 기능을 신설했다. 이 기능은 단순히 'dwell' 시간뿐만 아니라, 사용자가 한 세션 동안 얼마나 많은 페이지를 보는지(page_views)도 함께 분석에 반영한다. 'dwell' 시간과 page_views 간의 매칭률을 계산하여 봇 트래픽을 더 정교하게 탐지하도록 로직을 개선했다.
# 개선된 분석 로직 def is_real_user_enhanced(session_data): dwell_time = session_data['dwell_time'] page_views = session_data['page_views'] bot_score = session_data['bot_score'] # 기존 봇 스코어# 봇 스코어가 높으면 일단 제외 if bot_score > 0.7: return False # dwell 시간과 page_views 간의 매칭률 계산 # 예: 10초당 1페이지 뷰 정도가 일반적이라고 가정 expected_page_views = dwell_time / 10 match_ratio = 1 - abs(page_views - expected_page_views) / max(1, expected_page_views) # 매칭률이 일정 수준 이하이면 봇으로 간주 if match_ratio < 0.5: # 50% 이하 매칭률은 봇으로 의심 return False return True
이 새로운 로직을 적용한 결과, 실제 사용자 비율이 분석에 반영되는 비율이 8% 증가했다. 이는 봇 트래픽 탐지 로직이 훨씬 강화되었음을 의미한다.
결과
- 봇 트래픽 탐지 정확도가 향상되었습니다.
- 실제 사용자 방문자 수치가 8% 증가했습니다.
- 분석 결과의 신뢰도가 높아졌습니다.
정리 — 같은 함정 안 빠지려면
- [ ] 방문자 분석 시 'dwell' 시간만으로 봇을 판단하지 말 것.
- [ ] 'dwell' 시간과 페이지 뷰 수 간의 상관관계를 분석에 포함시킬 것.
- [ ] 봇 트래픽 탐지 로직은 여러 지표를 교차 검증하는 방식으로 설계할 것.
- [ ] 새로운 기능 추가 시, 기존 데이터와 비교하여 실제 효과를 검증할 것.
태그