
며칠 전부터 내 홈페이지 방문자 통계에 기이한 일이 벌어졌다.
평소에는 파리만 날리던 곳에 갑자기 하루에 수십 명씩 손님이 몰려오기 시작한 것이다. 지난번에 밤새워 쓴 글을 해커뉴스에 올렸을 때도 고작 6명이 보고 끝났는데, 갑자기 무슨 바람이 불었나 싶었다. 드디어 누군가 내 진가를 알아보고 레딧이나 해외 개발자 커뮤니티에 링크라도 뿌려준 걸까? 설레는 마음으로 Vercel Analytics 대시보드를 열었다.
방문자 261명, 페이지뷰 493회, 이탈률 82%.
그런데 유입 경로를 찍어보고는 말문이 막혔다. 방문자 중 무려 170명이 aocr.org라는 곳에서 넘어왔다고 찍혀 있었기 때문이다.
처음 보는 도메인이었다. 무슨 새로 나온 오픈소스 재단인가 싶어서 들어가 봤더니, 세상에, '미국 정골의학 방사선과 전문의 학회(American Osteopathic College of Radiology)' 홈페이지였다.
나는 의사도 아니고 내 블로그는 의학과 눈곱만큼도 관련이 없다. 내가 쓰는 글이라고 해봤자 소프트웨어 아키텍처랑 가난한 청년의 인생 푸념 같은 골때리는 이야기뿐이다.\아무리 세상이 넓다지만 미국에서 엑스레이와 MRI를 판독하던 방사선과 전문의 170명이 단체로 내 블로그에 몰려와 소프트웨어 공학을 탐독할 리는 없지 않은가.
손님의 정체를 뜯어보다
로그를 조금 더 깊게 파보니 수상한 냄새가 확 올라왔다.
별도로 찍힌 세부 기록을 보니 aocr.org 달고 들어온 방문자 43명이 정확히 46번의 페이지뷰를 일으켰다. 국가는 전원 미국, 운영체제는 Windows, 브라우저는 Chrome, 기기는 데스크톱으로 판박이처럼 똑같았다.
더 웃긴 건 이 '방사선과 의사 선생님들'이 읽고 간 글 목록이었다. 「응집도와 결합도」, 「캐시 친화적 프로그래밍」, 「직렬통신의 포트와 보레이트」, 「함수형 프로그래밍」까지 주제를 가리지 않고 훑어봤다. 심지어 일반 독자는 누르지도 않는 위키 문서의 과거 수정 이력(Revision history) 페이지까지 알뜰하게 뒤져놓고선, 딱 한 페이지씩만 보고 미련 없이 창을 닫았다.
이건 사람이 아니다.반가운 독자가 170명 늘어난 게 아니라, 어디선가 날아온 크롤러가 내 홈페이지를 털어가고 있었던 것이다.
한국 AI봇들 회사에서도 내 자료를 털어가고 있는 걸 내버려두고 있는데, 이제는 미국에서도 내 자료를 털고 있다. 그나마 양심적인 건 한국 회사랑 다르게 Referer(레퍼러)라도 달고 있단거다. 한국 회사들은 그거조차 안하는데 말이지.
왜 하필 방사선과 학회 명찰을 달고 왔을까?
웹사이트 운영자가 손님이 어디서 왔는지 확인할 때는 보통 HTTP 요청에 담긴 Referer 정보나 브라우저의 document.referrer 값을 보는데,
문제는 이 출처 정보라는 게 위조하기가 숨 쉬는 것보다 쉽다는 점이다. HTTP 요청을 보낼 때 헤더 한 줄만 고치면 그만이다. 스크래핑 만들때 나도 자주 위조하는 거라 어렵진 않다.
GET /en-US/blog/Cohesion-and-Coupling HTTP/1.1
Host: makonea.com
Referer: https://www.aocr.org/
User-Agent: Mozilla/5.0 ...
이렇게 자기가 출발한 곳을 미국 의료단체 홈페이지라고 적어 보내면, 받는 쪽에서는 진짜 거기서 링크를 타고 넘어오는 걸로 안다.
게다가 내 블로그에 붙어 있는 Vercel Analytics가 이 기록을 잡았다는 건, 단순한 텍스트 요청이 아니라 자바스크립트까지 실행하는 헤드리스 브라우저(Playwright나 Puppeteer 같은 도구)를 띄워서 리퍼러 값을 강제로 주입했다는 뜻이다.
이른바 리퍼러 스푸핑(Referrer Spoofing), 혹은 통계 화면에 이상한 도메인을 찍어 운영자의 호기심을 유발하는 리퍼러 스팸(Referrer Spam)이다. 검색해 보니 나만 당한 게 아니었다. 전 세계의 수많은 사이트 운영자들이 난데없이 aocr.org에서 트래픽이 쏟아진다며 의아해하고 있었다.
물론 미국의 방사선과 의사들이 할 일이 없어서 남의 블로그를 긁는 봇을 돌릴 리는 없다. 누군가 LLM 학습용 데이터를 긁어모으거나 검색 인덱스를 만드는 봇넷을 돌리면서, 보안 장비의 빈 리퍼러(Empty Referer) 차단을 피하려고 아무 정상적인 사이트 주소나 고정값으로 박아 넣었을 가능성이 크다. 물론 로그만 보고 범인의 진짜 의도까지 단정 지을 수는 없다. 프로그래머가 로그를 읽을 때 가장 경계해야 할 짓이 내 머릿속의 가설을 팩트라고 착각하는 거니까.
인터넷에서 '누군가 내 글을 읽었다'는 것의 의미
로그 창을 닫고 나니 기분이 묘해졌다.
나는 매달 내 돈으로 Vercel과 AWS에 서버비를 갖다 바치며 이 홈페이지를 굴린다. 검색엔진에 잘 걸리게 하려고 메타태그를 손보고, 틈날 때마다 버그를 고치고, 글 하나를 쓰기 위해 며칠씩 옛날 논문을 뒤진다. 아무도 안 봐도 상관없다고 입으로는 말하지만, 솔직히 누군가는 내 글을 읽어주길 바라는 마음이 있으니까 하는 짓이다.
그런데 막상 방문자 숫자가 치솟으면, 그게 진짜 사람인지 기계인지부터 의심해야 하는 시대가 됐다.
내가 클라우드 플레어의 Analytics를 관두고 Vercel Analytics으로 옮긴 것은 기본적으로 JS를 동작시켜야만 인간으로 관측되기때문에 인간 관측을 위해서였다.
서버에 HTTP 요청이 도착하고 자바스크립트 비콘이 터졌다는 사실은 일반적으로 인간이 내 글을 읽었다는 반응이기에 기분 좋았지만, 최근 보면 거의 AI로 보인다.
내가 '독자'라고 믿었던 숫자는, 실은 특정 조건에 맞춰 트리거된 네트워크 이벤트의 합계였을 뿐이다.
어쩌면 내 글을 가장 성실하게, 과거 수정 이력까지 한 줄도 빼놓지 않고 읽어준 독자는 사람이 아니라 저 정체불명의 봇이었는지도 모르겠다. 아마 이 글도 스크래핑할텐데, 미안한데 Buy me coffee로 100달러만 기부해줘라. 나 돈이 급하다.
그리고 다음번에 또 올 거면 가짜 방사선과 의사 명찰은 좀 떼고 왔으면 좋겠다. 헛물켜고 설레는 건 한 번으로 족하니까.