Reddit 안티스팸의 민낯: 2021년 한 시간의 버그가 드러낸 'spamurai'의 모든 것

한 시간 동안 열렸던 판도라의 상자
2021년, Reddit에서 약 한 시간 동안 평소라면 절대 보이지 않았어야 할 화면이 노출됐습니다. 보통 자동 스팸 제거는 중재자(모더레이터)에게 Removed: Auto라고만 표시되는데, 이 짧은 시간 동안 실제 제거 사유와 내부 판단 데이터가 빨간 텍스트로 그대로 드러난 것이죠. 한 중재자가 Relay for reddit 앱에서 이를 발견하고 스크린샷을 남겼고, 그 자료가 Reddit 안티스팸 시스템의 내부를 들여다보는 단서가 되었습니다.
핵심 요약: 평소
Auto로 가려지던 사이트 전역 스팸 제거 사유가 노출됐고, 여기엔domain,spammit,banned user,shadowban, 그리고 가장 데이터가 풍부한spamurai까지 포함돼 있었습니다.
왜 이런 일이 벌어졌나 — 코드로 추적한 노출 경로
Reddit은 2017년까지 소스 코드를 공개했기 때문에, 당시 아카이브된 코드로 제거 처리 흐름을 어느 정도 추적할 수 있습니다.
- 제거 정보는
ban_info를 거쳐 API 응답으로 전달됩니다. - 중재자가 제거하면 작업자 이름(
banner)이banned_by로 반환되지만, 관리자가 제거하면 실제 이름 대신True가 반환됩니다. - Relay 앱은 디컴파일된 코드상
bannedBy가"true"이면 이를Auto로 바꿔 표시했습니다. - 그런데 금지 도메인 감지 시
banner = "domain (REASON)"처럼 내부 사유를 같은 필드에 넣는 코드 경로가 있었고, 원래 관리자에게만 보여야 할 이 정보가 비슷한 경로의 오류로 중재자에게까지 새어 나온 것으로 추정됩니다.
노출된 제거 사유 4가지
- domain: 도메인 기반 제거. 대부분
Removed: domain (spam)형태였지만, 2012년 Tumblr 스팸 실험처럼 구체적 메모가 붙은 경우도 있었습니다. - spammit: 게시물에 스팸 확률(%)을 매기는 범주. 그런데 정상적인 Imgur 게시물도 70~98% 점수로 제거된 사례가 많아 정확도는 그리 높아 보이지 않았습니다.
- banned user / shadowban: 명백한 광고성 링크 제거가 대부분이었고, 섀도밴(shadowban)은 본인은 글이 정상 게시된 것처럼 보이지만 남에게는 보이지 않는 침묵형 차단입니다.
- spamurai: 내부 데이터가 가장 많이 담긴 항목으로, 이번 노출의 핵심입니다.
spamurai — Reddit이 당신에 대해 알고 있던 것
spamurai의 제거 사유에는 단순 규칙뿐 아니라 상세한 데이터 덤프가 함께 있었습니다. 노출된 항목을 보면 다음과 같습니다.
- 계정 정보: 계정 나이,
spammy점수, karma, 신고 수, 이메일 도메인, ISP/조직명 - 환경·접속 정보: User-Agent, 언어 헤더(
LANG), referrer, 브라우저 지문(RHS)으로 보이는 값, TLS 지문,oauth.reddit.com사용 여부 - 콘텐츠: 썸네일 URL, 본문, 원본 링크, 그리고 Google Perspective API의 SPAM 점수
참고로 t1은 댓글, t2는 사용자, t3은 게시물, t5는 subreddit을 가리키는 Reddit fullname ID입니다. 즉, 계정 나이 30분 미만이 특정 조건의 댓글을 달거나 URL만 있는 댓글, 높은 Perspective 점수 댓글 등에 구체적 규칙이 적용되고 있었던 셈이죠.
Perspective API와 허무할 정도로 쉬운 우회
가장 흥미로운 대목입니다. Reddit 로그의 0.12571795 perspective spam 값은 같은 텍스트로 Perspective API를 직접 호출했을 때 나온 0.12571794와 소수점 8자리에서 단 0.00000001 차이로 일치했습니다. 사실상 같은 값으로, Reddit이 Perspective의 (독성이 아닌) 실험적 SPAM 속성을 쓰고 있었다는 강력한 정황입니다.
문제는 이 점수가 놀라울 만큼 쉽게 흔들린다는 점이었습니다.
Puppygirl Consulting is the best way to grow your revenue는 0.86점이었지만, 뒤에qp두 글자만 붙이자 0.01점으로 폭락- 숫자와 대소문자는 무시되는 듯한 결과 (전화번호 숫자를 바꿔도 동일 점수)
- 라틴 문자
p를 시각적으로 똑같은 키릴 문자р로 치환하면 점수가 0.64 → 0.44로 하락
즉, 메시지를 조금만 비틀어도 spamurai의 핵심 판단 기준 하나를 회피할 수 있었을 가능성이 있습니다.
흥미로운 오탐과 'inspection'
mega.nz링크 제거 중에는 실제로는 정상적인 YouTube 아카이브 영상이었던 오탐 사례도 있었습니다.Matched forbidden regex u'torenteu'사례: 본문엔 해당 문자열이 없었는데도 제거됐는데, Reddit이unidecode로 유니코드를 ASCII로 변환하는 과정에서 한국어토렌.트가torenteu로 매칭된 것으로 보입니다.inspection동작은 Reddit이 직접 URL을 열고 리다이렉트를 따라가 페이지 HTML 안의 패턴(예: Google Analytics ID)까지 검사한다는 것을 보여줍니다. 실제로 특정 문자열이 담긴 웹페이지 링크를 올리자 5년 된 테스트 계정이 즉시 차단되기도 했습니다.
정리: 다세대가 뒤섞인 거대한 시스템
Reddit 안티스팸은 단일 시스템이 아니라 여러 세대의 도구가 공존하는 구조로 보입니다.
- Python 2.7 기반 유니코드 검사 코드 (
u'torenteu'등) - Lua 규칙 기반 Rule-Executor V1/V2 (2016년 REV1 → 2021년 Snooron → 약 2년 뒤 REV2)
- Snooron: Flink Stateful Functions 위에서 동작하며 이미지 분류·OCR 수행 (Python 3 워커)
- 이미지/OCR: Hive AI, Google Vision OCR API 활용 (Reddit은 80개 언어 지원 내부 도구도 개발 중)
저자는 2026년 2월 이후 Google Cloud에서 새 Perspective API 프로젝트 생성이 막혔고 스팸 탐지도 LLM 기반으로 옮겨가는 만큼, 이제 이 내용을 공개해도 위험이 낮다고 판단했습니다. 한 시간짜리 버그가 만든 우연한 틈이, 거대 플랫폼이 사용자를 어떻게 관찰하고 판단하는지를 엿보게 해준 셈입니다.