frFrench ▾
deGerman
enEnglish
esSpanish
hiHindi
itItalian
jaJapanese
koKorean
noNorwegian
zhChinese
Accueil Nouveautés Actualités Tutoriels Consommation Culture Vidéo Buzz Divers

자바스크립트를 실행하는 방문자 수 조작 봇

Publié le 06 novembre 2026
파란 배경의 빛나는 연결점 네트워크를 향해 뻗은 흰색 로봇 손, 방문 봇을 상징하는 이미지

2026년 11월 4일 아침, VosPosts 방문자 수 카운터에는 놀라운 숫자가 표시됐습니다. 평소 하루 약 400회 방문하는 사이트에 하루 동안 '사람' 방문자 3,352명이 기록됐고, 새벽 1시 전까지 2,272명이 더 늘었습니다. 공유된 기사도, 입소문을 탄 링크도 없었습니다. 사실은 봇이었고, 카운터가 이들을 독자로 착각한 것입니다.

어떻게 알아냈는지, '자바스크립트가 실행되면 사람이다'라는 기존 방식이 왜 통하지 않는지, 서버 로그에서 가짜 방문자를 찾는 방법을 설명합니다.

함정: '자바스크립트가 실행됐으니 사람이다'

직접 만든 방문자 카운터 대부분은 간단한 원리에 의존하며 우리도 그랬습니다. 서버가 요청된 페이지를 기록하고, 브라우저에서 실행된 작은 스크립트가 방문을 '인증'하는 두 번째 요청을 보냅니다. 과거의 봇은 HTML만 다운로드하고 코드를 실행하지 않아 두 번째 요청이 없었고 통계에서 제외됐습니다.

이제 이 필터는 구멍투성이입니다. 오늘날 많은 봇이 실제 브라우저처럼 자바스크립트를 실행합니다.

  • 검색 엔진은 페이지를 이해하려고 렌더링합니다. Googlebot은 최신 Chromium을 사용하며 Baiduspider-render, Applebot, Bytespider(ByteDance), meta-webindexer도 있습니다.
  • AdSense 광고 봇(Mediapartners-Google)은 콘텐츠를 분석하려고 페이지를 방문합니다.
  • 최신 스크래퍼는 인터페이스 없는 실제 브라우저를 제어합니다. 헤드리스 Chrome, Puppeteer, Playwright, 자동화 및 AI 에이전트용 경량 엔진 Lightpanda 등이 있습니다.

스크립트 실행만 확인하는 카운터에서는 모두 독자와 구별되지 않습니다. 더 놀라운 사실은 공격 이전에도 문제가 있었다는 점입니다. 평범했던 11월 3일을 분석하니 사람으로 집계된 621회 중 446회가 실제로는 봇이었습니다. 10회 중 7회 이상입니다.

헤드리스 브라우저 스크래퍼의 징후

11월 4일의 급증에는 조직적인 스크래핑의 특징이 모두 나타났습니다. 각각의 단서는 결정적이지 않지만 종합하면 의심의 여지가 거의 없습니다.

Publicité

페이지마다 다른 IP 주소

각 페이지 요청이 전 세계에 흩어진 서로 다른 IP에서 들어왔습니다. 이는 주거용 프록시의 특징입니다. 일반 가정의 인터넷 연결을 통해 요청을 전달하는 네트워크로, 소유자가 모르는 경우도 많습니다. IP를 차단해도 소용이 적습니다. 주소가 수천 개이고 실제 가정에 속하기 때문입니다.

수년 전에 나온 오래된 브라우저

사용자 에이전트는 Chrome 118~120, Firefox 120·121, Edge 119·120이라는 짧은 목록을 반복했습니다. 모두 2023년 말 버전입니다. 하지만 Chrome과 Firefox는 약 4주마다 자동 업데이트되며 실제 독자들은 Chrome 148~156을 사용했습니다. 3년 된 브라우저를 쓰는 사람이 한 명 있을 수는 있지만 하룻밤에 수천 명이라면 스크래핑 도구에 고정된 사용자 에이전트 목록이 들어 있다는 뜻입니다.

그 목록에는 아무런 위장도 하지 않은 Lightpanda/1.0까지 나타났습니다.

너무 규칙적인 행동

  • 데스크톱 컴퓨터만 사용하고 모바일은 전혀 없었습니다. 실제 방문의 대부분은 휴대전화에서 발생합니다.
  • 유입 경로가 없었습니다. Google, 소셜 미디어, 다른 사이트에서 온 방문자가 없었습니다.
  • 최대한 많은 페이지를 수집하려고 사이트 내부 검색에서 서로 다른 검색어 2,340개를 실행했습니다.
  • 하루 동안 24,772건의 요청이 발생해 서버 전체 트래픽의 42%를 차지했습니다.

숨은 위험: 광고

헤드리스 브라우저는 광고 영역 로딩을 포함한 모든 작업을 수행합니다. 이날 봇은 광고 블록을 2,939회 로딩했습니다. AdSense 게시자에게는 심각한 문제입니다. 봇이 만든 노출은 무효 트래픽으로 간주되어 Google이 수익에서 차감하며 반복되면 계정에도 문제가 생길 수 있습니다. 부풀려진 카운터는 자존심만의 문제가 아닙니다.

로그에서 봇을 찾아내는 방법

'combined' 형식의 Apache 또는 Nginx 액세스 로그에는 필요한 정보가 모두 있습니다. 몇 가지 명령만 실행하면 됩니다. 먼저 가장 흔한 사용자 에이전트를 확인합니다.

awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn | head -30

다음으로 Chrome 버전 분포를 확인합니다. 정상 사이트에서는 최근 4~5개 버전에 대부분 집중됩니다. 오래된 버전이 대량으로 나타나면 쉽게 눈에 띕니다.

grep -oE 'Chrome/[0-9]+' access.log | sort | uniq -c | sort -t/ -k2 -n

시간별 요청량을 보면 급증이 시작되고 끝난 시점을 정확히 알 수 있습니다.

awk '{print substr($4, 2, 14)}' access.log | sort | uniq -c

마지막으로 의심스러운 특징에 대해 요청 수와 서로 다른 IP 수를 비교합니다. 두 숫자가 거의 같다면 프록시 네트워크를 찾은 셈입니다.

grep -c 'Chrome/119.0.0.0' access.log
grep 'Chrome/119.0.0.0' access.log | awk '{print $1}' | sort -u | wc -l

참고로 2022년부터 Chrome은 주요 버전 번호 뒤에 .0.0.0을 붙여 전송합니다. 따라서 Chrome/119.0.0.0 형식 자체는 정상이며, 봇을 드러내는 것은 오래된 119라는 숫자입니다.

우리가 적용한 조치

차단하지 않고 집계에서 제외하기

첫 번째 단계에서는 서버에서 방문을 집계할지 결정합니다. 사용자 에이전트가 비어 있거나 봇이라고 표시하거나(bot, spider, crawler, curl·Python 같은 HTTP 도구, 헤드리스 브라우저), 2년 반 이상 오래된 Chrome 또는 Firefox 버전을 사용한다고 하면 사람으로 집계하지 않습니다. 기준 버전은 날짜에 따라 자동 계산하므로 수동 수정이 필요 없습니다.

$jours = (time() - mktime(0, 0, 0, 12, 5, 2023)) / 86400; // Chrome 120, décembre 2023
$version_actuelle = 120 + (int)floor($jours / 28);           // une version toutes les 4 semaines
if (preg_match('/Chrome/(d+)./', $ua, $m) && (int)$m[1] < $version_actuelle - 32) {
    return true; // navigateur trop ancien pour être un lecteur réel
}

중요한 예외가 있습니다. 로그인한 사용자는 브라우저에 관계없이 항상 집계합니다. 필터는 오래된 컴퓨터를 업데이트하지 않은 충성 회원이 아니라 신원 미상의 방문자를 대상으로 합니다.

스크래퍼는 거부하고 검색 엔진은 허용하기

두 번째 단계는 더 적극적입니다. 서버는 스크래퍼의 특징에 403 오류로 응답하되 정상적인 크롤러는 명시적으로 제외합니다. Apache에서는 몇 줄이면 됩니다.

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (Lightpanda|HeadlessChrome) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Chrome/1(18|19|20).0.0.0 [OR]
RewriteCond %{HTTP_USER_AGENT} Firefox/12[01].
RewriteCond %{HTTP_USER_AGENT} !(bot|spider|crawl|google|bing|facebook) [NC]
RewriteRule ^ - [F]

처음 세 조건은 [OR]로 연결되고 마지막 조건은 암묵적인 AND로 추가됩니다. 의심스러운 특징 중 하나에 해당하면 차단하지만 검색 엔진이나 소셜 네트워크라고 주장하는 사용자 에이전트는 제외합니다. 적용 후 스크래퍼에는 403이 반환되고 최신 Chrome, iPhone, Googlebot, Bingbot, AdSense 봇에는 페이지가 정상 제공되는지 확인했습니다.

실수로 Googlebot을 차단하면 부풀려진 방문자 수보다 훨씬 큰 손실을 입을 수 있습니다. 운영 환경에 적용하기 전에 검색 엔진 사용자 에이전트로 모든 규칙을 테스트하세요.

기억해야 할 한계

사용자 에이전트는 코드 한 줄로 위조할 수 있습니다. 이 스크래퍼가 Chrome 155라고 주장하면 지금 규칙으로는 탐지할 수 없습니다. 영구적인 방어책이 아니라 기본적인 관리 조치입니다. 다수를 차지하는 단순한 봇을 걸러내고 통계를 다시 읽을 수 있게 해 줍니다. 더 나아가려면 유입 경로 없음, IP당 한 페이지, 마우스 움직임이나 스크롤 없음 등 여러 신호를 결합하거나 전문 봇 탐지 서비스를 사용해야 합니다.

진짜 교훈은 따로 있습니다. 일 년에 한 번 극적인 급증 때 거짓말하는 카운터라면 다른 날에도 조용히 거짓말하고 있을 가능성이 높습니다. 액세스 로그를 한 번도 확인하지 않았다면 평범한 하루를 골라 위 명령을 10분만 실행해 보세요. 결과에 놀랄 수도 있습니다.

Tags
방문자 수
봇
스크래핑
헤드리스 브라우저
Apache 로그
사용자 에이전트
Envoyer à un ami
Signaler cet article
A propos de l'auteur