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.policiesrow 는 보존 한다 (재업그레이드 시 복원)- 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.go의Evaluate는 LicensingCan(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 내 사용량 한도 도입