요즘 작업하는 사이트에서 방문자 통계 내는 방식을 조금 바꿔보았다.

 

원래는 메인 페이지에 들어갔을때만 찍히게 되어 있었는데,

무언가 통계가 부정확하게 나온다는 이야기가 있어

이참에 주요 서비스를 중심으로 최초 접속이라고 판단될 때에만 카운터가 찍히게 만들었다.

폭주하는 접속자수

원래 페이지뷰가 많은 서비스이긴 했는데, 접속자 수 올라가는게 심상찮았다. 그래서 유저 에이전트와 세션 ID를 기록하도록 해보았더니 참으로 반가운(?) 놈들이 많이 보였다. 이를테면

 

 - Googlebot 이라거나

 - Yeti 라거나 (소위 말하는 네이버봇)

 - 별의별 잡다한 검색 봇들 하며 각종 SNS OpenGraph 봇들...

 

검색 유입이 중요한 사이트니까 딱히 막을 생각은 없지만 그래도 방문자 통계에 잡히는건 막아야 했다.

$pattern = "/(bot|yeti|twitter|facebook|kakao|spider|script|reader|crawl)/i";

if (preg_match($pattern, $_SERVER['HTTP_USER_AGENT'])) {
    return;
}

대개 봇들은 "나는 봇이오" 하면서 유저 에이전트에 티를 내기 마련이다. 주요 검색엔진들은 bot만 매칭해도 대부분 걸러지지만, 별의 별 잡 봇들은 저들마다 희한한 이름들을 내건다. reader라거나... script라거나... crawler라거나...

 

아무튼 이렇게만 해도 웬만한 봇들은 걸러지는데...

브라우저를 사칭하는 열마리의 새들

가장 문제는 자기가 브라우저인 마냥 꺼드럭거리는 크롤러들이 있다는 것이다. 봇들을 걸러낸 이후 계속 로그를 계속 살펴보는데, 한 아이피에서 쿠키를 갱신해가며 초당 4~5번씩 어마어마하게 접속을 시도하고 있었다.

 

하지만 유저 에이전트를 보니 봇은 아니다.  WHOIS 때려봐도 어느 회사에 속한것도 아니다.

 

결국 사제 크롤러라는 얘기인데, 딱히 걸러낼 방법도 없을 뿐더러, 트래픽을 낭비시키니 한 3시간 동안 403만 뱉도록 해서 물리쳐냈다. 이미 찍힌 카운터에서 날려보니, 2시간동안 대략 6000건이 잡혀있었다. 페이지 하나당 못해도 수십~수백킬로바이트 단위인데 DoS라고 봐도 무방하지 않을까.

 

혹시 모르지. Ctrl+F5 연타 공격일수도. 서버가 안 죽은게 다행이다.

근본적인 해결책

사실 쿠키 기반으로 카운터가 돌아가는 탓에 쿠키를 끄고 들어오는 사람들에 대해서는 매 접속시도가 방문자로 잡힐 수 밖에 없는 구조이다. 결국 동일 기기에서 접속한 것인지 체크하도록 하면 될텐데, 마땅히 좋은 생각이 나지 않는다.

 

IP 기반으로 걸러내자니 통신사 모바일 IP가 마음에 걸리고, 세션 ID랑 묶어서 걸러내는 방법이 확실해 보이겠지만 그나마도 쿠키를 끄거나 크롤러가 덤벼들면 속수무책인 것이다.

 

결국 IP랑 유저에이전트를 같이 묶어서 동일 접속인지 확인할 수 밖에 없을 것 같다.