콘텐츠로 이동

ADR-0035: Bouncer Paid-Tier Gating

Bouncer 기능(VPN/Proxy/Tor 차단, 국가 블랙리스트) 은 Free Plan 에서 제공하지 않는다. Pro Plan 이상에서만 활성화되며, 권한 체크는 Licensing 도메인의 Can(guild_id, feature_id) 단일 진입점으로 라우팅한다. Bouncer 가 Free 길드에서 호출되면 즉시 allow 를 반환(게이트 없음) 하고, 정책 UI 는 대시보드에서 Pro 업셀 배너로 대체된다.

Status

Proposed

  • Decided at — 2026-04-18
  • Decided by — Pablo

Context

ADR-0011(Hybrid License Model) 과 ADR-0026(Anti-Nuke MVP Inclusion) 은 "Free 는 미끼, Pro 부터 가치" 라는 플랜 구성 원칙을 수립했다.

  • Free Plan — 스냅샷·웹 조인·감사 로그 기본
  • Pro Plan — AntiNuke 감지+알림, 고급 기능
  • Enterprise — AntiNuke 자동 대응, Pro 모든 기능

새로 추가되는 Bouncer 는 다음 특징이 있다.

  • 방어형 부가 가치 — 없어도 서비스가 돌아가지만 있으면 raid / ban evasion 을 막는다
  • 외부 공급자 비용 존재 — ipquery.io 무료 한도 초과 시 유료, 향후 MaxMind GeoIP2 Anonymous IP 전환 가능성
  • 설정 UI 부담 — 대시보드에서 토글·국가 코드 관리가 필요한데 Free 는 대시보드 자체가 없다 (docs/domain/member.md 의 Permission model 참고)

두 가지 상반된 요구가 충돌한다.

  • "모든 길드를 보호하자" — Free 에서도 VPN 차단 등을 기본 제공하면 가입 품질 ↑, 제품 평판 ↑
  • "유료 전환 인센티브 유지" — Pro 의 가치가 분명해야 구독이 일어난다. Free 가 너무 좋으면 업그레이드 동기 약화

세 번째 고려는 비용 구조다. IP 인텔리전스는 길드가 아닌 방문자 단위 호출이라, Free 무제한 허용 시 인프라 비용이 제품 수익과 독립적으로 증가한다.

Decision

Bouncer 기능 전체를 Pro Plan 이상에서만 제공 한다.

게이팅 지점

  • Licensing 도메인Licensing.Can(ctx, guildID, "bouncer.evaluate") 이 단일 진입점
  • Bouncer 도메인 내부Evaluate(ctx, guildID, ip) 호출 시 가장 먼저 Licensing 조회. Free 면 Decision{Outcome: Allow, Reason: "free_plan_skip"} 즉시 반환 (판정 자체를 생략)
  • 대시보드(apps/web) — Bouncer 정책 페이지는 Free 길드에 노출되지 않음. Pro 업셀 CTA 로 대체

이로써 Free 길드는 Bouncer 를 인지조차 할 필요 없이 기존 웹 조인 동작이 유지된다.

Feature 식별자

bouncer.evaluate — 판정 기능 전체를 커버하는 단일 feature key. 하위 기능(VPN/Proxy/Tor 개별 토글·국가 블랙리스트) 은 Pro 이상에서 일괄 제공.

하위 분할(예: Pro 는 VPN만, Enterprise 는 Tor + 국가)은 의도적으로 하지 않는다. 이유:

  • 기능이 적어 세분화 가치 < 관리 비용
  • 대시보드 UX 복잡도 ↑
  • Pro/Enterprise 간 차별화는 AntiNuke 자동 대응(ADR-0026) 으로 이미 충분

Plan 별 Bouncer 동작

Plan Bouncer 판정 정책 UI 감사 로그
Free Skip (Allow) 노출 없음 (업셀 배너만) 기록 없음
Pro 활성 전체 토글·국가 편집 bouncer.decisions 기록
Enterprise 활성 (Pro 와 동일 + 향후 확장 여지) 동일 동일

Free 길드의 웹 조인

Bouncer 가 없어도 웹 조인은 기존과 동일하게 작동 (OAuth2 → guilds.join). Discord 자체의 verification level 과 Umbra 의 향후 기본 안전 장치는 별도 기능으로 논의.

정책 영속성

Pro → Free 다운그레이드 시:

  • bouncer.policies row 는 보존 한다 (재업그레이드 시 복원)
  • Bouncer 판정은 비활성 — Licensing gate 에서 skip
  • 다운그레이드 감사 로그에 "Bouncer policies preserved but inactive" 기록

이유: 플랜 변경은 일시적일 수 있고, 정책 재설정은 관리자 부담이 크다.

Consequences

Positive

  • 명확한 Pro 가치 차별화 — "가입 접근 통제" 는 AntiNuke 와 보완 관계의 명확한 Pro 기능
  • 비용 통제 — IP 인텔리전스 호출량이 Paid 길드 수에 비례. Free 무제한 노출 리스크 차단
  • 단일 게이트 — Licensing Can() 통과만 체크. 다른 도메인과 패턴 일치 (Recovery, Notification 도 같은 게이트 사용)
  • Free UX 변화 없음 — 기존 웹 조인 플로우 그대로. Free 사용자 혼란 0
  • 업셀 경로 확보 — Free 관리자가 raid 피해 경험 시 자연스러운 Pro 업그레이드 트리거

Negative

  • Free 길드 raid 취약성 유지 — VPN 기반 ban evasion 은 Free 에서 막지 못함. 제품 평판 리스크 일부
  • 정책 보존의 혼란 가능성 — 다운그레이드 후 "설정이 남아있는데 왜 안 막히지?" 문의 우려. 대시보드 표기 필요
  • Feature 세분화 여지 상실 — Pro/Enterprise 간 Bouncer 차등이 없어 Enterprise 추가 가치는 다른 도메인으로 확보해야 함 (AntiNuke 자동 대응 등)

Neutral

  • 하위 분할(VPN only / + Tor / + 국가) 은 운영 데이터 축적 후 재평가 가능
  • Free 에 일부 기능(예: Tor 만) 제공 여지는 Revisit trigger 로 열어둠

Alternatives considered

Alternative 1: Free 에서도 기본 제공 (Tor 차단만)

Pros

  • Free 길드 보호 ↑, 제품 평판 ↑
  • Tor list 는 무료 유지 비용 0
  • "Umbra 는 Free 도 안전하다" 는 마케팅 메시지

Cons

  • 대시보드 없이 토글 불가 → 전역 default on 강제 (일부 정상 Tor 사용자 차단 불가피)
  • Pro 업그레이드 인센티브 약화
  • 정책 관리 UI 가 Free 에도 필요해지는 압력 ↑

Why rejected — Pro 의 가치 차별화가 더 중요. Tor 차단 단독은 효과 제한적이라 Pro 의 "전체 통제" 메시지가 더 강하다. Revisit 가능.

Alternative 2: Pro 는 VPN/Proxy, Enterprise 는 +Tor/국가

Pros

  • Plan 간 명확한 기능 차등
  • Enterprise 추가 가치 부각

Cons

  • 기능 4개(VPN·Proxy·Tor·국가) 를 2개 계층에 쪼개는 건 경계가 자의적
  • 대시보드 UI 에 "이 토글은 Enterprise 에서만" 표기 혼란
  • 관리 비용이 가치에 비해 크다

Why rejected — 기능 세분화의 실익이 적다. Enterprise 차별화는 AntiNuke 자동 대응·우선 지원·SLA 등 다른 축으로 이미 충분.

Alternative 3: Usage-based billing (방문 건수 과금)

Pros

  • 소규모 길드는 저비용, 대규모는 비용에 비례

Cons

  • ADR-0011 의 고정 Plan 모델 위배
  • 예측 가능한 billing 을 선호하는 관리자에 불편
  • 구현 복잡도 ↑ (사용량 집계, 티어 초과 알림, 조정)

Why rejected — Umbra billing 은 고정 Plan 기반이 일관성 원칙. 단일 기능 때문에 모델 분기 불가.

Alternative 4: Free 에서 "감지만, 차단 안 함"

Pros

  • Free 도 "무언가 동작" 느낌. 업셀 메시지 강화 ("VPN 가입 N건 감지됨, Pro 로 차단하세요")

Cons

  • 판정 호출은 그대로 발생 → 비용은 Pro 와 동일, 수익은 0
  • 감지만으로는 가치 미미

Why rejected — 비용 구조가 성립하지 않는다. 업셀 메시지는 Pro 체험판·공개 사례로 대체.

Compliance

  • engine/bouncer/service.goEvaluate 는 Licensing Can(ctx, guildID, "bouncer.evaluate") 호출을 첫 단계로 수행 (bypass 불가)
  • 대시보드(apps/web) 의 Bouncer 정책 라우트는 Licensing 권한 없는 길드에 렌더링하지 않음 (TanStack Router guard)
  • bouncer.decisions 테이블에는 Pro/Enterprise 길드의 판정만 저장 (Free skip 은 기록 없음)
  • Plan 다운그레이드 시 bouncer.policies 는 보존되되 active=false 로 마킹 (스키마는 domain/bouncer.md 참조)

Revisit triggers

  • Free 길드에서 Tor 기반 raid 사례가 반복 보고되면 "Tor 차단만 Free 제공" 검토
  • 경쟁사가 접근 통제 기능을 전면 무료로 제공하여 이탈이 발생하면 플랜 재조정
  • Pro 구독자가 Bouncer 를 가장 많이 쓰는 기능으로 드러나면 Pro 요금 인상 또는 Enterprise 만의 하위 기능 추가 검토 (예: 커스텀 리스크 점수)
  • IP 인텔리전스 비용이 예측 범위를 초과하면 Plan 내 사용량 한도 도입

References

  • ADR-0011 — Hybrid License Model (Plan 기반 게이팅)
  • ADR-0012 — License / Subscription 분리
  • ADR-0026 — 같은 "Pro 이상" 차등 패턴
  • ADR-0033 — Bouncer 도메인 신설
  • ADR-0034 — IP 인텔리전스 공급자