SSO 미들웨어 실제 서비스 배포 (Node.js 9개 + TOAU 라이브러리)
개요
2026-04-15 통합 인프라 완성 이후, 각 서비스에 SSO 미들웨어를 실제로 삽입하고 LaunchAgent 재기동으로 라이브 배포. auth.crowny.org 를 LaunchAgent로 영구 구동 전환.
무엇을 했는지
1. auth.crowny.org LaunchAgent 승격
~/Library/LaunchAgents/org.crowny.auth.plist작성- KeepAlive + RunAtLoad → 재부팅/크래시 자동 복구
- PID 93689 확인 (org.crowny.auth)
2. SSO 미들웨어에 raw-http 헬퍼 추가
authenticate(req, serviceName)함수 —(req,res,next)미들웨어가 아닌 http.createServer 패턴 지원unauthorized(res, msg)편의 함수module.exports.verify/authenticate/unauthorized내보내기 순서 교정
3. 10개 Node.js 서비스 일괄 패치
자동 패치 스크립트patch_sso_into_services.sh 실행:| 서비스 | 포트 | LaunchAgent | 상태 |
|---|---|---|---|
| patent | 9732 | org.crowny.patent | ✅ 재기동 완료 |
| stock | 9731 | org.crowny.stock | ✅ |
| artist | 9734 | org.crowny.artist | ✅ |
| avl | 9737 | org.crowny.avl | ✅ |
| avls | 9736 | org.crowny.avls | ✅ |
| card | 9450 | — | ✅ |
| mind | 7750 | — | ✅ |
| trading | 7740 | — | ✅ |
| int | 9500 | — | ✅ |
| security | 9502 | 미등록 | ⚠️ |
패치 내용 (각 server.js에 2줄 삽입):
jsconst sso = require('/Users/ef/crowny-data/auth/sso-middleware.js'); // 상단
// createServer 핸들러 최상단:
req.ssoUser = await sso.authenticate(req, 'patent').catch(() => null);
비침해적 설계: req.ssoUser 만 주입. 기존 로직/인증 전혀 변경 없음. 토큰 있으면 자동 touch 발생.
4. TOAU 서비스용 한선씨 SSO 라이브러리
/Users/ef/CrownyOS/crownyc/libs/SSO인증.한선 (신규)토큰추출(요청텍스트) — Bearer 토큰 파싱쿠키토큰추출(요청텍스트) — crowny_token 쿠키토큰검증(토큰, 호스트, 포트) — auth 서버에 GET /api/verify 소켓 호출서비스접속기록(사용자, 서비스, 호스트, 포트) — POST /api/touch fire-and-forget요청인증(요청텍스트, 서비스명) — 올인원 편의 함수대상 서비스 (향후 실제 통합):
- crowny-dex (:9402) — crownyc 실행
- crowny-chain (:9729) — crownyc
- crowny-chat (:9403) — crownyc (크라우니메신저서버.한선)
검증
auth 회원: 176명 (prev 174 → +2 마이그레이션 재실행 여파)
총 서비스 링크: 16건
main: 13명
bank: 1명 (kps)
stock: 1명 (kps)
project: 1명 (ef)
패치 서비스 실제 구동 확인:
- patent:9732 HTTP 200 (api/dashboard 정상 응답)
- stock:9731 HTTP 200
- artist:9734 HTTP 200
- avl/avls/card/mind/trading/int HTTP 200
관련 파일 경로
인프라
/Users/ef/Library/LaunchAgents/org.crowny.auth.plist— 영구 구동/Users/ef/crowny-data/auth/auth-server.js— 서버 (:9401)
SSO
/Users/ef/crowny-data/auth/sso-middleware.js— Node.js 미들웨어 + authenticate 헬퍼/Users/ef/crowny-data/auth/sso-middleware.한선— 단순 동반본/Users/ef/CrownyOS/crownyc/libs/SSO인증.한선— TOAU 서비스용 완전 구현 (소켓 기반)
자동화
/Users/ef/crowny-data/auth/patch_sso_into_services.sh— 일괄 삽입 스크립트 (idempotent)/Users/ef/crowny-data/auth/sync_users_profiles.py— 정합 동기화/Users/ef/crowny-data/auth/migrate_patent.py/Users/ef/crowny-data/auth/migrate_project.py
백업
- 각 server.js에
.bak-<timestamp>로 원본 보존
잔여 이슈
✅ 완료: TOAU 3서비스 실제 통합 (2026-04-17)
- chat (크라우니메신저서버.한선): 가져오기 "SSO인증.한선" + 요청인증 + API전송 인증유저 우선
- chain (블록체인서버.한선): 가져오기 + 요청인증 fire-and-forget
- dex (크라우니거래소서버.한선): 가져오기 + 요청인증 fire-and-forget
- 3개 모두 컴파일 성공, /Users/ef/crowny-data/bin/ 배포, 재기동 완료
✅ 완료: church ES module 패치 (2026-04-17)
- createRequire로 sso-middleware.js 로드
- handler async 전환 + req.ssoUser 주입
- 9310 HTTP 200 정상
✅ 완료: 토큰 발급 UX (2026-04-17)
- auth.crowny.org/login — 로그인 폼, 쿠키 발급 (crowny_token, 7일), ?return= 리디렉트
- auth.crowny.org/register — 회원가입 폼, 자동 로그인+쿠키+리디렉트
- 각 서비스에서
auth.crowny.org/login?return=https://서비스.crowny.org로 연결 가능
잔여: 레거시 독자 인증 제거
- patent(8), church(21), market(6) — 3개만 자체 인증 보유
- 현재 SSO와 병행 운영 가능 (req.ssoUser + 기존 인증 둘 다 체크)
- 향후 전환: requireAdmin → req.ssoUser.role=='admin' 등으로 점진적 교체
✅ 완료: VM 맵꺼내 근본 수정 (2026-04-17)
- crownyc.c:5425 —
맵꺼내(없는키)반환값-2147483647→ 빈 문자열""로 교체 - 빌드:
cc -O2 -framework Security -framework CoreFoundation -o crownyc crownyc.c - 영향: 모든 맵 기반 한선씨 프로그램 정상화, 회원등록 성공 확인
✅ 완료: 회원관리.한선 맵 통일 (2026-04-17)
- 9개 배열 반환 → 맵 변환 (
_결과성공()/_결과오류(메시지)헬퍼 추가) - 컴파일 검증 완료
✅ 완료: SSO 위젯 (2026-04-17)
/Users/ef/crowny-data/auth/sso-widget.js— 자동 로그인/로그아웃 위젯- auth.crowny.org/sso-widget.js 로 서빙
- 11개 서비스 프론트엔드에
<script>삽입 (patent/stock/artist/avl/avls/card/mind/trading/int/market/church) - 동작: 쿠키 확인 → 있으면 사용자 표시+로그아웃, 없으면 로그인 버튼 → auth.crowny.org/login?return= 리디렉트
✅ 완료: 셀 슬롯 접근 API 불일치 수정 (2026-04-17)
- 원인:
셀읽(db,id)2인자인데 회원관리가셀읽(db,id,idx)3인자로 호출 → idx 무시 → 셀맵 전체 반환 → 비교 실패 - 해결:
_셀슬롯(db, id, idx)래퍼 추가 + 12건 일괄 치환 - 결과: 회원등록/인증/조회/서비스계정/지갑 전체 파이프라인 정상 동작 (VM 에러 0건)