3 서비스 통합 세션 SDK
개요
crowny.org / tiomta.com / talk.crowny.org에서 단일 CRN-ID + 통합 지갑 세션을 공유하는 메커니즘을 구축했다. 한 번 로그인하면 세 사이트 어디서나 같은 사용자로 동작한다.
무엇을 했는지
신규 파일
/Users/ef/CrownyOS/apps/메신저/v3/crowny-session-sdk.js
window.CrownySession 전역 API
- localStorage(crowny_session_v1) + 쿠키(crowny_token) 이중 저장
- BroadcastChannel(crowny_session_bus) + postMessage 크로스탭/iframe 동기화
- CrownyAuth :9401 직접 로그인 + 메신저 /sso/login 경유 로그인
- bank.crowny.org :9400 + 메신저 HTTP :9766 경유 잔액 조회
- Firebase ↔ CrownyAuth 브릿지 (bridgeFirebase)
- 허용 오리진 화이트리스트 12개/Users/ef/CrownyOS/apps/메신저/v3/통합지갑위젯.js
window.CrownyWallet 전역 API
- 화면 우상단 고정 배지: [CRN-12345678] [1,250 FONE ▼]
- 클릭 시 미니 모달: FNC/CRN/CRM 잔액 + 송금 폼
- 30초 자동 갱신, balance_change 이벤트 구독
- 인라인 스타일 자동 주입 (외부 CSS 의존성 없음)/Users/ef/CrownyOS/apps/메신저/v3/통합세션.한선
허용오리진목록, 세션저장JS생성, 세션조회JS생성, 세션삭제JS생성,
브로드캐스트JS생성, 통합지갑위젯HTML생성, 통합지갑위젯JS생성,
Firebase브릿지JS생성, tiomta토큰주입JS생성, 임베드토큰수신JS생성, _자가검증
- 자가검증 8건수정된 파일
/Users/ef/CrownyOS/apps/메신저/v3/서버/ws-server-v3.js
/crowny-session-sdk.js, /통합지갑위젯.js 정적 라우트 추가
- SPA 서버(9752)에도 동일 라우트 추가 (메신저 자체 SPA 로드용)
- Access-Control-Allow-Origin: * 설정 (타 도메인에서 로드 가능)/Users/ef/crowny-org/index.html(2469번 줄 이후 추가)
<script src="http://localhost:9766/crowny-session-sdk.js"> 로드
- <script src="http://localhost:9766/통합지갑위젯.js"> 로드
- Firebase onAuthStateChanged → CrownySession.bridgeFirebase() 자동 연결
- Firebase 로그아웃 → CrownySession.logout() 연동/Users/ef/crowny-tiomta/public/index.html(670번 줄 이전 추가)
tiomta_token / tiomta_crn_id localStorage 키 → CrownySession.setToken() 주입/Users/ef/CrownyOS/apps/메신저/v3/웹v3/index.html(4403번 줄 이후 추가)
/crowny-session-sdk.js SPA 경로)
- ?embed=* 파라미터 감지 시 부모에게 세션 요청 (requestFromParent)
- 1.5초 대기 후 세션 없으면 로그인 화면 표시세션 흐름 요약
[로그인]
사용자 → crowny.org Firebase → CrownySession.bridgeFirebase()
→ CrownyAuth :9401 signup/login
→ localStorage + 쿠키 저장
→ BroadcastChannel broadcast
→ tiomta / 메신저 탭 자동 동기화
[지갑]
CrownySession.getBalance()
1차: HTTP :9766/wallet/:id/balance
2차: bank.crowny.org :9400/api/balance
→ CrownyWallet 위젯 자동 갱신 (30초)
관련 파일 경로
- SDK:
/Users/ef/CrownyOS/apps/메신저/v3/crowny-session-sdk.js - 위젯:
/Users/ef/CrownyOS/apps/메신저/v3/통합지갑위젯.js - 정본:
/Users/ef/CrownyOS/apps/메신저/v3/통합세션.한선 - 서버:
/Users/ef/CrownyOS/apps/메신저/v3/서버/ws-server-v3.js - crowny.org:
/Users/ef/crowny-org/index.html - tiomta:
/Users/ef/crowny-tiomta/public/index.html - 메신저:
/Users/ef/CrownyOS/apps/메신저/v3/웹v3/index.html
잔여 이슈
- Firebase ↔ CrownyAuth 매핑 복잡도: Firebase UID는 CRN-XXXXXXXX 형식이 아님.
bridgeFirebase()에서 UID 앞 8자리 16진을 CRN으로 변환하지만,
CrownyAuth가 /api/auth/signup을 지원하지 않으면 SSO-LOCAL 폴백으로만 동작.
CrownyAuth에 Firebase bridge 전용 엔드포인트 추가 필요.- tiomta_crn_id 키 미설정: tiomta
server.js가 CrownyAuth 토큰 발급 시
localStorage.setItem('tiomta_crn_id', user.id) 를 클라이언트에 전달해야 완전 연동.
현재는 폴링/postMessage 방식으로 감지.- 통합세션.한선 컴파일 검증: 터미널 접근 필요.
bash cd /Users/ef/CrownyOS/crownyc
./hanseonc_high /Users/ef/CrownyOS/apps/메신저/v3/통합세션.한선 > /dev/null 2>&1 && echo OK
- CORS + 도메인 쿠키: 프로덕션에서
.crowny.org쿠키가tiomta.com에는 적용 안 됨.
- 라이브 검증:
bash curl -s -o /dev/null -w "%{http_code}\n" http://localhost:9766/crowny-session-sdk.js
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:9752/crowny-session-sdk.js