지금 /diagnose 제출은 4개의 약한 가드만 통과하면 즉시 사장님 폰으로 1만원이 발사됨. 영업원·디바이스·IP·OTP·잔액 preflight 어느 것도 박혀 있지 않다.
본 보고서는 OUTBOUND(영업원 매장방문) 컨텍스트에 맞는 3개 동시 게이트(영업원 이름+코드 / 사장님 폰 OTP / naver_place_id × phone 유일성) + 1개 비동기 가드(잔액·이상치) + dual-layer 사후 검수(영업원 30k 인센은 24h~3일 후 확정) 구조를 제안한다.
자동님은 이미 키퍼 플랫폼 admin 권한(ceo@bizdirect.co.kr, group=13 "키퍼 아웃바운드")을 보유 중이라, 사후 검수의 ②③룰을 한 번의 admin BFF 호출로 즉시 매핑 가능.
86Af9로 가입돼있음. 5자리 영숫자 mixed case가 키퍼 표준 → 우리 agent.code도 동일 형식.GET /v1/account/admin/users?role=OWNER&phone={leads.phone} → items.length>0 + subscribes.length>0 ⇒ 영업원 30k 인센 confirm. 별도 통합 API 필요 없음.호출 사슬:
// app/api/keeper-out/diagnose/route.ts (현재 production)
POST /api/keeper-out/diagnose
→ 필드 non-null (phone, current_security, ceo_name, marketing_consent)
→ sbInsert keeper_outbound_leads // 23505 → 409 "이미 진단 받으신 매장"
→ funnel_event "diagnose_submitted"
→ payouts 3건 INSERT // 사장님 10k + promoter 10k + HQ 10k
→ scheduled_sms_at = now() + 5min
→ ★ fire-and-forget sendNaverPayCoupon(phone, 10000)
→ bizapi.giftishow.com/bizApi/send api_code=0204
// 실패해도 200 OK, funnel_event "naver_pay_failed" 만 기록
| # | 위치 | 검증 | 우회 |
|---|---|---|---|
| G1 | route.ts:14-23 | 4개 필드 non-null | 아무 문자열 박으면 통과 |
| G2 | idx_leads_naver_place_unique (partial) | naver_place_id 동일 시 409 | naver_place_id 없이 제출하면 무력화 |
| G3 | RLS anon_insert_leads | (없음 — with check (true)) | 익명 키만 있으면 우회 |
| G4 | giftishow.ts:92-100 | 지원 금액 화이트리스트 | 우회 불가 (10k 외 NO_GOODS) |
| ID | Actor | 시나리오 | 현재 차단? | 손실 단가 |
|---|---|---|---|---|
| T1 | 외부 사례비 헌터 | 폰 N개로 무한 제출 | ❌ | 10k × N |
| T2 | 외부 봇/스크립트 | API 자동 POST | ❌ | 10k × ∞ |
| T3 | 영업원 본인 | 본인/지인 폰 5대로 5번 (본인 30k + 지인 10k) | ❌ | 40k × 5 |
| T4 | 영업원 단순 실수 | 자동완성 미수행 (G2 무력화) | ❌ | 10k × N |
| T5 | 매장 사장 어뷰징 | 본인+가족 폰 5대로 5번 | ❌ | 10k × 4 |
| T6 | 영업원 의도적 오발송 | 매장 안 갔는데 발송 (실적 부풀리기) | ❌ | 40k |
| T7 | 거짓 진단 데이터 | "모름"·랜덤값으로 통과 → 1만원 | ❌ | 10k |
| T9 | review-on cross-bleed | 같은 Giftishow 잔액 공유 | ❌ | 가변 |
| T10 | 사일런트 발송 실패 | 잔액 0 / 인증 만료 못 알아챔 | ❌ | UX 손실 |
고우선: T1·T2·T3·T7. 필수: T4·T5·T6. 운영 가시성: T9·T10.
| V | 이름 | 막는 위협 | OUTBOUND 마찰 | 티어 |
|---|---|---|---|---|
| V1 | 본인성 — SMS OTP | T1·T2·T3·T5 | 낮음 (사장님 옆 30초) | MUST |
| V2 | 현장성 #1 — GPS × place 거리 ≤200m | T2·T4·T6 | 미미 (이미 수집 중) | MUST |
| V3 | 현장성 #2 — 영업원 이름+5자리 코드 | T3·T6·T7 | 10초 입력 | MUST ★ 자동님 지시 |
| V4 | 유일성 — naver_place_id NOT NULL + phone unique lifetime | T5·T8·중복 | 없음 | MUST |
| V5 | 예산 — 잔액 preflight + cap | T2·T9·T10 | 없음 | MUST |
| V6 | 사진 EXIF 시간 검증 | T6·T7 | 약함 | SHOULD |
| V7 | 패턴 이상치 탐지 (cron) | T3·T7 누적 | 없음 (감사용) | SHOULD |
| V8 | 매장 실재성 외부 검증 | T6·T8 | 미미 | SHOULD |
| V9 | 디바이스/IP 핑거프린팅 | T2 | 부분적 | NICE (기록만) |
| V10 | CAPTCHA / Turnstile | T2 | 큼 (영업 흐름 깨짐) | OUT (인바운드만) |
| V11 | 사업자등록번호 NICE/홈택스 | T6 | 미미 | OUT (1만원 게이트) |
UX 정책: 사장님이 진단 끝까지 채우고 지원금 받기 버튼을 누른 그 시점에 영업원 이름+코드 입력 모달 등장. 진단 단계와 영업원 게이트 화면을 명확히 분리.
keeper-partner 모바일앱" 폐기.
키퍼메이트는 Puzl(퍼즐코퍼레이션)이 운영하는 Referio라는 별개 SaaS.
자동님 지메일에서 가입승인(2026-03-04, 추천코드 86Af9) 확인.
| 축 | A. 키퍼 플랫폼 | B. 키퍼메이트(Referio) |
|---|---|---|
| 운영 주체 | 한화비전 자체 | Puzl(puzl.co.kr), 한화비전이 클라이언트 |
| 도메인 | *.keeperplatform.com | referio.puzl.co.kr + 랜딩 keeper.ceo/keeper-mate |
| 사용자 | 본사·매장·설치·영업파트너(B2B) | 콘텐츠 작성자(블로그·SNS referrer) |
| 백엔드 | 10 마이크로서비스 | Supabase (eqdnirtgmevhobmycxzn) |
| 본인인증 | Danal/PASS + 카카오 OAuth | 없음 (사후 본사 수동 승인) |
| 단계 | 보상 | 검증 |
|---|---|---|
| 유효 리드 | 1.5만원 | ① 연락 가능 ② 사업자 확인 ③ 도입 의향 |
| 계약 성사 | +2만원 | 키퍼 서비스 계약 체결 |
| 합계 | 건당 3.5만원 | + 4티어 활동비 (Authorized/Silver/Gold/Platinum: 0/5/10/30만/월) |
"허위/과장 광고, 검색 광고 집행, 스팸성 홍보, 자기 추천(셀프 가입) 등은 금지됩니다. 위반 시 키퍼 메이트 자격이 해지될 수 있습니다."
"자기 추천 금지"는 우리 위협 T3(영업원 본인/지인 폰)과 정확히 같은 시나리오 — 정책 차용 + 자동 검출 둘 다 박는다.
{userId:5398, accountId:5702, role:"ADMIN", group:13}/_not-found)api-account.keeperplatform.com // 계정/사용자 (v1/account/*)
api-notification.keeperplatform.com // 알림/SSE/푸시
admin.keeperplatform.com/api/my/* // BFF — same-origin 프록시
admin.keeperplatform.com/api/keeper-auth // 인증 어댑터
CORS: api-account는 Access-Control-Allow-Origin: * + Bearer JWT cookie 자동 첨부. BFF: /api/my/group, /api/my/method-permission?method=get&rootPath={X}.
interface User {
id: number; // 6245 (auto-increment)
name: string; // 실명
loginInfo: {
socialProvider: null | string; // "kakao" 등
email: string;
id: string | null; // login id (qbflel/khw491)
};
email: string;
mobile: string; // "010-3111-1165" (대시 포함) ★ 매칭 키
memo: string | null;
createdAt: string;
shopName: string; // 대표 매장명
shopAddress: string;
shops: any[]; // 다매장 점주
subscribes: any[]; // ★ 비면 가입만 / 있으면 계약 성사
}
// 회원번호: KP{YY}{MM}{DD}{HH}{MM}{ID4} (예: KP26050518592567)
// 역할 enum: OWNER (자영업자) / PARTNERS (영업파트너=대리점)
260505170227426 (yymmddHHMMSS + 3자 random)₩396,000/대) / 실외용 카메라 / IoT 센서키퍼메이트는 단일 검수 후 발송이라 dual-layer 불필요. 우리는 사장님 1만원 즉시 발송이라 영업원 30k 인센은 별도 회수 윈도우 필수.
// [24h cron — TM 통화 후]
GET /v1/account/admin/users?role=OWNER&phone={leads.phone}
→ items.length === 0
// 사장님이 키퍼 가입 안 함 = ②③룰 미달
payouts.lead_30k status = 'invalid'
영업원 invalid률 누적
→ items.length > 0
// 가입 확인 = ②룰 통과
→ user.subscribes.length > 0
→ ③룰 통과 = 30k 인센 'confirmed'
→ user.subscribes.length === 0
→ 7일 추가 대기 (가입했지만 미구독)
// [7일 cron]
GET /v1/order/admin/purchase?keyword={leads.store_name}
→ 설치 완료 주문 hit
→ 인센 'confirmed' + install 50k 인센 자동 트리거
// [30일]
미확정 = 영업원 30k 'invalidated_final'
86Af9 차용)https://keeper.ceo/keeper-out?ref={code} 채택 (Referio ?ref= 동일)| # | 항목 | 옵션 |
|---|---|---|
| 1 | OTP 발송 채널 | balerion SMS proxy 그대로 / KISA / NICE / NHN Cloud |
| 2 | 영업원 우회로 | 관리자 PIN 백도어 두기 / 코드 없는 진단 거부 |
| 3 | review-on과 잔액 격리 | Giftishow 키 별도 가입 / 모니터링만 분리 |
| 4 | agent.code 발급 운영 | 본사 admin 수동 / 자율 가입 후 본사 승인 / Referio 매핑 |
| 5 | 05-policy.md 어뷰징 정책 명문화 별도 문서 | 예 / 아니오 |
자동님 본인 referio 대시보드 진입(가입돼있음, 코드 86Af9) → 어필리에이트 데이터 모델·attribution·정산 API 트레이스. 키퍼메이트 어뷰징 게이트 실제 구현 확인이 우리 V3·V7·정책 문서화에 가장 직접 reference.
예상 시간: 1시간 (referio.puzl.co.kr/login → 자동님 직접 로그인 → 본인 대시보드 RE → 데이터 모델 추출)
같은 Giftishow 키, 같은 자동님 코드 패턴. balerion.cloud SSH 진입(call-center.pem) → review-on의 어뷰징 가드 차원 매핑.
예상 시간: 1시간 (B 진행 후 부족한 차원 보강용으로 적합)
① naver_place_id NOT NULL 격상 ② phone unique lifetime ③ Giftishow checkBalance preflight ④ 일일 송금 카운터. 모든 계획 끝나면 자동님 지시 후 박을 즉시 효과 큰 4건.
자동님 명시 — "코드수정은 하지말고 문서화 먼저"