# Reddit 안티스팸 내부를 엿보다

> Clean Markdown view of GeekNews topic #30899. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=30899](https://news.hada.io/topic?id=30899)
- GeekNews Markdown: [https://news.hada.io/topic/30899.md](https://news.hada.io/topic/30899.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-06-28T09:15:07+09:00
- Updated: 2026-06-28T09:15:07+09:00
- Original source: [lyra.horse](https://lyra.horse/blog/2026/06/reddit-spam-internals/)
- Points: 5
- Comments: 1

## Topic Body

- 2021년 Reddit의 일시적 오류로 보이는 현상 때문에, Relay for reddit에서 평소 `Removed: Auto`로 숨겨지던 **사이트 전체 스팸 제거 사유**와 내부 판단 데이터가 노출됨
- 공개 아카이브 코드상 제거 정보는 `ban_info.banner`를 거쳐 전달되며, Relay는 API의 `banned_by=true`를 **Auto**로 바꿔 표시했지만 같은 필드에 내부 사유가 들어가면서 문제가 생긴 것으로 보임
- 노출된 사유에는 `domain`, `spammit`, `banned user`, `shadowban`, **spamurai** 등이 있었고, spamurai는 계정 나이, karma, 신고 수, ISP, 이메일 도메인, User-Agent, 언어 헤더, TLS 지문, referrer, Perspective API 점수까지 포함함
- Google **Perspective API**의 SPAM 점수와 Reddit 제거 로그 값이 거의 일치했으며, 짧은 문자 추가·키릴 문자 치환·대소문자와 숫자 무시 같은 특성 때문에 점수가 크게 흔들리는 사례가 확인됨
- Reddit 안티스팸은 Python 2.7 기반 검사, Lua 규칙 기반 REV1/REV2, Snooron, OCR·이미지 분류 도구가 섞인 다세대 시스템으로 보이며, 2026년에는 Perspective API 종료와 LLM 기반 스팸 변화로 공개 위험이 낮아졌다고 판단함

---

### 2021년에 드러난 제거 사유
- Reddit 중재자였던 사용자는 2021년 Relay for reddit 앱에서 제거된 스팸 알림을 받던 중, 평소 보이지 않아야 할 **안티스팸 내부 메시지**를 확인함
- 일반적인 중재자 화면에서는 자동 스팸 제거가 `Removed: Auto`처럼 표시되지만, 당시에는 실제 제거 사유와 내부 데이터가 빨간 텍스트로 나타남
- 이 현상은 약 한 시간 뒤 정상으로 돌아왔고, 남은 자료는 당시 찍은 스크린샷뿐임

### Reddit 중재와 `Auto` 표시 방식
- Reddit의 하위 커뮤니티인 subreddit에서는 커뮤니티 중재자가 게시물 제거, 사용자 차단, modmail 관리 등을 맡음
- 중재자는 게시물이나 댓글이 누구에 의해 제거됐는지 볼 수 있음
  - 일반 중재자 제거는 중재자 이름으로 표시됨
  - AutoModerator 제거는 `AutoModerator`로 표시됨
  - Reddit의 사이트 전체 스팸 필터나 관리자 제거는 `Auto`로 표시될 수 있음
- 중재 로그에서는 사이트 전체 제거가 `reddit` 또는 `Anti-Evil Operations`로 나타남

### 공개 아카이브 코드로 본 노출 경로
- Reddit은 2017년까지 [소스 코드](https://github.com/reddit-archive/reddit/)를 공개했으며, 해당 아카이브 코드로 제거 처리 흐름 일부를 추적할 수 있음
- 중재자 제거 함수인 [`POST_remove`](https://github.com/reddit-archive/reddit/blob/753b17407e9a9dca09558526805922de24133d53/r2/r2/controllers/api.py#L3037-L3090)는 `admintools.spam`을 호출함
  - `moderator_banned`는 제거 주체가 중재자인지 관리자인지 구분함
  - `banner`는 제거 작업을 수행한 사용자 이름을 기록함
- [`get_mod_attributes`](https://github.com/reddit-archive/reddit/blob/753b17407e9a9dca09558526805922de24133d53/r2/r2/lib/jsontemplates.py#L618-L639)는 제거된 항목의 `ban_info`를 API 응답으로 내보냄
  - 중재자가 제거한 경우 `banner` 값을 `banned_by`로 반환함
  - 관리자가 제거한 경우 실제 이름 대신 `True`를 반환함
- Relay for reddit은 디컴파일된 코드상 `bannedBy`가 `"true"`이면 이를 **`Auto`** 문자열로 바꿔 표시함
- Reddit에는 링크 제출 시 금지 도메인을 감지하면 `banner = "domain (REASON)"`처럼 내부 사유를 `banner` 필드에 넣는 코드 경로도 있었음
- 내부 제거 사유가 들어간 `banner` 필드는 원래 사이트 전체 관리자에게만 보여야 했으나, 비슷한 코드 경로의 오류로 중재자에게 노출된 것으로 추정됨

### 노출된 제거 사유 범주
- ## `domain`
  - 도메인 기반 제거는 공개 코드에서도 확인 가능한 범주임
  - 대부분은 `Removed: domain (spam)` 형태였지만, 구체적인 메모가 붙은 경우도 있었음
  - Tumblr 관련 스팸 실험을 위해 2012년에 특정 도메인을 제거한 사례가 있었음
  - `le sexxxxy sex spam` 같은 문구도 제거 사유로 나타남
- ## `spammit`
  - `spammit`은 게시물을 분석해 **스팸 확률 퍼센트**를 붙이는 범주로 보임
  - 확인된 제거 사례의 점수는 낮게는 **39.71%**, 높게는 **98.19%** 였음
  - 해당 subreddit들에서는 정상적인 Imgur 게시물도 70~98% 스팸 점수로 제거된 사례가 많아 정확도가 높아 보이지 않았음
- ## 차단 사용자와 shadowban
  - `Removed: banned user` 또는 `Removed: Reddit (banall performed)` 형태의 제거가 있었음
  - 해당 사례들은 대부분 광고성 서비스 링크 등 명백한 스팸 게시물로 나타남
  - shadowban된 사용자의 게시물은 `Removed: Reddit (shadowban applied on 날짜)`처럼 표시됐음
  - shadowban은 사용자 본인은 계속 글을 쓸 수 있는 것처럼 보이지만, 다른 사람에게는 게시물과 댓글이 보이지 않는 침묵형 차단임

### spamurai가 드러낸 내부 판단 데이터
- **spamurai**는 노출된 범주 중 내부 데이터가 가장 많이 포함된 항목임
- 공개 발표 자료에는 Reddit이 “ML”에 Minsky, “Rules”에 Spamurai를 사용한다고 되어 있음
- spamurai 제거 사유에는 단순 규칙과 상세 데이터 덤프가 함께 있었음
  - `echelon`이라는 하위 시스템으로 보이는 이름이 특정 키워드 제거에 나타남
  - 30분 미만 계정이 스팸 조건에 맞는 댓글을 올렸을 때 제거한 사례가 있었음
  - 의심되는 셔츠 제휴 스팸, URL-only 댓글, 높은 Perspective 점수 댓글 등 구체적 규칙이 보였음
- ## spamurai 데이터 덤프의 항목
  - `link t3_...` 또는 `comment t1_...`는 Reddit의 **fullname ID**임
  - `t1`은 댓글
  - `t2`는 사용자
  - `t3`는 게시물
  - `t4`는 private message
  - `t5`는 subreddit
  - `perspective spam` 값은 Google **Perspective API**의 SPAM 점수로 확인됨
  - 계정 관련 데이터가 포함됨
    - 계정 나이
    - `spammy` 점수
    - karma
    - 신고 수
    - 이메일 도메인
    - ISP 또는 조직명
  - 접속·환경 데이터도 들어 있었음
    - `oauth.reddit.com` 사용 여부
    - User-Agent
    - 언어 헤더 `LANG`
    - referrer
    - 브라우저 지문으로 보이는 `RHS`
    - TLS 지문으로 보이는 값
    - 썸네일 URL
    - 게시물 또는 댓글 본문
    - 원본 Reddit 링크

### Perspective API와 우회 가능성
- Reddit 로그의 `0.12571795 perspective spam` 값은 [Perspective API](https://perspectiveapi.com/)의 SPAM 속성 호출 결과와 사실상 일치함
- 같은 텍스트로 Perspective API를 호출했을 때 `0.12571794`가 반환됐고, 차이는 **0.00000001**이라 반올림 오차로 볼 수 있음
- Perspective 문서의 예시 점수 형식과 Reddit CTO의 사례 인용도 Reddit이 Perspective를 사용했다는 정황으로 쓰임
- Perspective의 SPAM 속성은 독성 탐지가 아니라 스팸 탐지를 위한 experimental 속성이며, New York Times 댓글과 중재 데이터의 단일 데이터셋으로 학습됐다고 되어 있음
- 2026년 2월 이후 Google Cloud에서 새 Perspective API 프로젝트를 만들 수 없게 되어 새로 시험하기 어려워짐
- ## SPAM 점수의 민감한 변화
  - Perspective SPAM 점수는 몇 글자만 추가해도 크게 바뀌는 사례가 있었음
  - `Puppygirl Consulting is the best way to grow your revenue`는 **0.8638981**
  - 뒤에 `qp`를 붙이면 **0.010811162**로 떨어짐
  - 숫자와 대소문자는 무시되는 듯한 결과가 나옴
  - 전화번호 숫자와 대소문자를 바꿔도 같은 점수가 반환됨
  - 일부 다른 문자 체계도 같은 점수로 처리됨
  - 서로 다른 키릴 문자 문자열이 같은 **0.35077864** 점수를 받음
  - `Buy my product`에서 라틴 `p`를 키릴 `р`로 바꾸면 점수가 **0.6473346**에서 **0.4452748**로 내려감
  - 공개 API를 기준으로 메시지를 조금씩 바꾸면 spamurai의 주요 판단 기준 중 하나를 회피할 수 있었을 가능성이 있음

### 사용자 신고와 중재자 승인 반영
- spamurai는 사용자 신고도 제거 규칙에 반영하는 것으로 보임
- `REPORT: High spam perspective score on comment with hyperlink reported for spam` 사유는, 스팸으로 신고된 하이퍼링크 댓글의 Perspective 점수가 높아 제거됐고 중재자가 재승인할 수 있음을 나타냄
- 특정 제거 사유에는 “중재자가 이 콘텐츠를 승인하면 앞으로 제거가 줄어든다”는 문구가 포함됨
- Reddit 공개 코드의 `admintools.spam`에 있는 `train_spam` 인자는 중재자 액션을 안티스팸 학습에 사용할지 결정함
- subreddit에서 정상 게시물을 승인하면 false positive를 줄이는 데 영향을 줄 수 있다는 해석이 가능함

### 기타 제거 규칙과 URL 검사
- Pinterest redirect 링크, `mega.nz` 링크, 자유롭게 만들 수 있는 subdomain 관련 링크도 제거된 사례가 있었음
- `mega.nz` 링크 제거 중에는 실제로 YouTube 아카이브 영상 링크였던 정상 사례도 있어 오탐이 있었음
- `Matched forbidden regex u'torenteu'` 사례는 본문에 직접 `torenteu`가 없었지만 제거됨
  - Reddit은 [`unidecode`](https://github.com/reddit-archive/reddit/blob/753b17407e9a9dca09558526805922de24133d53/r2/r2/lib/utils/utils.py#L1261-L1264)를 사용해 유니코드 문자열을 ASCII로 변환함
  - 한국어 `토렌.트`가 변환과 추가 처리를 거쳐 `torenteu`와 매칭될 수 있었음
- `Failed inspection: Phrase(s) [u'UA-49307539-']` 사례는 댓글 본문이나 변환된 텍스트가 아니라, 링크가 리다이렉트된 페이지의 HTML 안 Google Analytics ID와 매칭된 것으로 나타남
- `inspection`은 Reddit이 URL을 열고 리다이렉트를 따라간 뒤 페이지에서 패턴을 찾는 동작으로 보임
- 테스트 계정에 해당 문자열을 둔 웹페이지 링크를 올리자 5년 된 계정이 즉시 차단되고 게시 이력이 삭제됨
  - 더 많은 활동 이력이 있는 친구 계정에서는 같은 재현이 되지 않았음
  - 해당 필터가 아직 활성인지, 계정 차단이 우연인지 확실하지 않아 실제 문자열은 바꿔 공개됨

### 과거·현재 Reddit 안티스팸 구성요소
- Reddit Engineering의 2023년 글 [Protecting Reddit Users in Real Time at Scale](https://www.reddit.com/r/RedditEng/comments/16m3t7m/protecting_reddit_users_in_real_time_at_scale/)에는 Rule-Executor-V1, REV2, Snooron이 등장함
- 이해한 타임라인은 다음과 같음
  - REV1은 2016년에 만들어짐
  - Snooron은 2021년에 REV1을 현대화하기 위해 개발됨
  - 이후 약 2년 뒤 REV2로 마이그레이션됨
- REV1과 REV2는 Lua 규칙으로 동작하며, `nil` 같은 문자열과 시점상 spamurai와 연결될 가능성이 있음
- `u'torenteu'`, `u'UA-49307539-'` 같은 Python 2.7 유니코드 문자열은 spamurai 외부의 Python 2.7 기반 검사 코드이거나 REV1이 호출하는 별도 URL 검사 코드일 수 있음
- Snooron은 [관련 발표](https://www.youtube.com/watch?v=lWCt4t1Dhvc)에 따르면 Flink Stateful Functions 위에서 동작하고, 이미지 분류와 OCR을 수행하며, worker에 Python 3를 사용함
- 2024년 기준 Reddit은 Australian eSafety 문서에서 OCR과 이미지·비디오 분류에 [Hive AI](https://thehive.ai/)와 [Google Vision OCR API](https://docs.cloud.google.com/vision/docs/ocr)를 사용한다고 밝힘
- Hive OCR은 12개 언어를 지원하고, Google OCR은 더 많은 언어 지원을 위해 함께 쓰이며, Reddit은 80개 언어를 지원하는 내부 도구도 작업 중이라고 되어 있음
- 2009년 ticket에서는 `crm114`라는 사용자가 중재자 학습이 가능한 스팸 필터라고 확인됐고, [CRM114](https://en.wikipedia.org/wiki/CRM114_%28program%29)는 오래된 오픈소스 스팸 분류 소프트웨어임

### 2026년에 공개한 이유
- 2021년에 이 정보를 공개했다면 Reddit의 스팸 문제에 치명적일 수 있었다고 판단함
- 2026년에는 [Perspective API is shutting down](https://web.archive.org/web/20260624230439/https://perspectiveapi.com/)이 연말 종료 예정이라 Reddit이 계속 쓰더라도 곧 마이그레이션해야 함
- LLM이 스팸 산업을 바꿨기 때문에 Reddit이 2026년에 맞춰 안티스팸 시스템을 많이 개편했을 것이라고 판단함
- 이런 이유로 2026년 현재는 해당 정보 공개의 위험이 낮다고 봄

## Comments



### Comment 60549

- Author: neo
- Created: 2026-06-28T09:15:08+09:00
- Points: 1

###### [Lobste.rs 의견들](https://lobste.rs/s/boap41/peek_into_reddit_s_anti_spam_internals) 
- 흥미로운 자료와 연구임. 결론에서도 말하듯 이런 **악용 방지 메커니즘**의 세부를 볼 기회가 드문데, 특히 눈에 띈 건 Lyra 특유의 능숙한 **CSS**였음  
  재구성한 Reddit UI의 검열 막대와 빨간 원이 처음엔 스크린샷처럼 보였는데, 실제로는 완전히 상호작용 가능한 모형이었음
  - 이 댓글을 읽기 전까지 이미지가 아니라는 걸 전혀 눈치 못 챘음

- 새 블로그 글이 올라올 때마다 늘 기대됨. 내용도 정말 흥미롭고, 다른 UI를 재현하는 솜씨도 훌륭함  
  지금까지 **이스터에그**를 적어도 하나는 찾았음
  - 고마움. 이번 글에는 그런 걸 꽤 많이 넣어뒀음 ;)

- 자기 계정으로 시험하려고 웹사이트에 `&lt;pre&gt;UA-49307539-2&lt;/pre&gt;` 문자열을 올리고 Reddit에 링크했더니, **5년 된 테스트 계정**이 즉시 정지되고 게시 기록도 전부 삭제됐다는 대목이 정말 거칠었음  
  그래서 실제 번호는 계정을 죽일 수 있는 텍스트를 공개하지 않으려고 `UA-49307539-`로 바꿨다는데, 그 계정이 진짜 테스트용이고 중요한 게 없었길 바람

- iPhone 16 Pro의 최신 iOS 개발자 베타에서 모바일 Safari로 열려고 하면 `&lt;url&gt;`에서 “a problem repeatedly occurred” 오류가 나서 볼 수 없음
  - 그게 왜 그런지 전혀 모르겠고, 지금은 iPhone도 곁에 없음  
    누가 HTML을 이분 탐색해서 **충돌 원인**을 찾아준다면 정말 고마울 것 같음

- 궁금한 사람들을 위해 말하면, 포함된 **Perspective API 키**는 유효하지 않음
  - `bans (2016 - present)`에서 스팸 예시로 검열된 컨설팅 회사가 `Puppygirl Consulting`인 걸 보면, 개발자 도구 중독자들은 검열된 부분들이 아마 가짜거나 **이스터에그**라는 힌트를 얻을 수 있음 :^)
