3 서비스 완전 통합 — 메신저 + crowny.org + tiomta.com
개요
크라우니메신저 v3를 crowny.org와 tiomta.com 안에 자연스럽게 임베드. 두 사이트 GUI에 완전히 녹아드는 폰트/사이즈/비율. 세 서비스 ID/지갑 단일 관리.
61/61 한선씨 컴파일, E2E 15/15 통과, 6개 라이브 진입점 HTTP 200.
사용자 4대 요구 매핑
| 요구 | 결과 |
|---|---|
| crowny.org GUI 완전 통일 | 메신저 정통 토큰 = crowny.org/style.css 정본. 폰트 Noto Sans CJK KR, 모바일 14px base. 임베드 모드 부모 톤 상속 |
| crowny.org 안에서 메신저 | /Users/ef/crowny-org/index.html 우하단 💬 플로팅 버튼 → 슬라이드 패널 → iframe(?embed=crowny) |
| tiomta.com 안에서 메신저 | /Users/ef/crowny-tiomta/public/index.html 동일 패턴 (?embed=tiomta) |
| 세 서비스 ID/지갑 통합 | crowny-session-sdk.js + 통합지갑위젯.js + 통합세션.한선 정본. localStorage + 쿠키 + postMessage broadcast |
신규 산출물
1. 메신저 임베드 모드 (임베드.한선 173줄 + index.html)
?embed=crowny|tiomta|minimal 진입 감지IS_EMBED 시 body class embed-mode, embed-{name} 추가auth theme navigateready auth_request unread resize tx_completedcrowny.org, tiomta.com, localhost:9779/9878/9752허용오리진(), 오리진허용확인(), 메시지검증(), _자가검증() 5건+ 어설트2. 외부 위젯 (외부위젯.한선 205줄 + 두 사이트 통합)
- crowny.org/index.html + 150줄: 플로팅 💬 버튼 (
#talk-widget-btn) + 슬라이드 패널 (#talk-widget-panel) + iframe(embed=crowny) - tiomta.com/index.html + 320줄 (
<body>직전): 동일 패턴 (embed=tiomta) - 디자인 토큰: crowny
var(--accent)var(--bg-card)var(--border)만 사용 (하드코딩 0) - 모바일 (≤768px): 패널 풀스크린, 폰트 14px base
- iframe lazy load (첫 클릭 시 src 설정)
- 부모 → iframe postMessage로 토큰 자동 전달
- 한선씨 정본 함수:
위젯CSS생성(),위젯HTML생성(),위젯JS생성(),_자가검증()
3. 통합 세션 SDK (crowny-session-sdk.js 22KB + 통합지갑위젯.js 11KB + 통합세션.한선 248줄)
SDK API (window.CrownySession):
getId()getToken()— localStoragecrowny_session_v1(만료 자동)login(crowny_id, password)— CrownyAuth :9401/api/loginloginViaMessenger()— 메신저 :9766/sso/login폴백setToken(id, token)— tiomta 등 외부 토큰 주입bridgeFirebase(firebaseUser)— Firebase UID → CRN-XXXXXXXX 매핑logout()— 3 사이트 동시 (BroadcastChannel)getBalance()— 메신저 → bank 폴백send(to, asset, amount, memo)— 송금on(event, fn)—loginlogoutbalance_changeenableBroadcast()— BroadcastChannel + postMessage 동기화
localStoragecrowny_session_v1={crowny_id, token, expires}- 쿠키
crowny_token도메인.crowny.org(3 서브도메인 자동 공유)
window.CrownyWallet):
- 우상단 배지:
[👑 CRN-XXXX] [💰 1,250 FONE ▼] - 30초 자동 갱신
- 미니 모달: FONE/CRN/CRM 잔액 + 송금 폼
/crowny-session-sdk.js(application/javascript)/crowny-wallet-widget.js(ASCII alias) +/통합지갑위젯.js(URL 디코딩)Access-Control-Allow-Origin: *
허용오리진목록, 세션저장JS생성, 세션조회JS생성, 세션삭제JS생성, 브로드캐스트JS생성, 통합지갑위젯HTML생성, 통합지갑위젯JS생성, Firebase브릿지JS생성, tiomta토큰주입JS생성, 임베드토큰수신JS생성, _자가검증3 사이트 인증 흐름
┌──── crowny.org (Firebase Auth) ────┐
│ Firebase로그인 → bridgeFirebase() │
│ → CrownyAuth :9401 signup/login │
│ → 토큰 localStorage 저장 │
└──── 동기화 ────────────────────────┘
↓ BroadcastChannel
┌──── tiomta.com (CrownyAuth) ──────┐
│ /api/auth/login (이미 사용 중) │
│ → setToken(id, token) │
│ → 동일 토큰 공유 │
└──── 동기화 ────────────────────────┘
↓ BroadcastChannel
┌──── talk.crowny.org (메신저) ──────┐
│ 임베드 시 부모 → postMessage(auth) │
│ 비-임베드: CrownySession.login() │
│ → 메신저 :9766 /sso/login │
└────────────────────────────────────┘
검증 결과
| 항목 | 결과 |
|---|---|
| 한선씨 컴파일 | 61/61 (100%) |
| E2E | 15/15 통과 (디자인/통합 후에도) |
| 임베드 모드 | ?embed=crowny ?embed=tiomta HTTP 200, embed-mode 마커 4건 |
| SDK 정적 서빙 | /crowny-session-sdk.js HTTP 200, 22KB |
| 위젯 정적 서빙 | /crowny-wallet-widget.js HTTP 200, 11KB |
| tiomta 위젯 | talk-widget 35건, crowny-session-sdk 1건 |
| crowny-org 위젯 | talk-widget 36건, 정적 파일 (서버 미가동) |
| 6 라이브 진입점 | 메신저(2)+tiomta+CrownyAuth+bank+ecosystem 전부 HTTP 200 |
잔여 이슈
- crowny.org 라이브 서버 미가동 —
node server-premium.js또는 운영 게이트웨이 통해 띄우면 즉시 작동 - Firebase ↔ CrownyAuth UID 매핑 —
bridgeFirebase()에서 CrownyAuth/api/auth/signup미지원 시 SSO-LOCAL 폴백 - tiomta server.js — 로그인 응답에
crowny_id필드 추가 권장 (현재/api/me폴백) - 에이전트 B가 tiomta
index-light.html에 위젯 추가했으나 실 라이브는index.html— 직접 수정 후 라이브 반영
학습DB 등록
메신저임베드모드(URL 파라미터 진입 + postMessage 프로토콜)외부서비스위젯iframe(플로팅 버튼 + 슬라이드 패널)통합세션SDK(3 사이트 단일 ID 동기화)도메인쿠키공유(.crowny.org)
연동
- [[project-crowny-messenger]] — 메신저 v3 정본
- [[reference-ecosystem-crowny]] — ecosystem 모듈 등록
- [[project-tiomta-brand]] — tiomta 진입
- [[feedback-agent-directive-style]] — 차분한 지시 + 셀코어 베이스
- [[feedback-subagent-permissions]] — 프로젝트별 settings.json 권한 선행