크라우니클라우드 관리 사이드카(:9662) 실인증 게이트
개요
cloud.crowny.org가 무인증 공개 상태(누구나 노드/서비스/jimin 계정 데이터 열람)였던 문제를 닫았다.
:9662 사이드카의 전 라우트(
/api/health 제외)에 Bearer 세션토큰 검증을 강제했다.
무엇을 했는지
/Users/ef/crowny-services/클라우드관리.한선: 서비스서버.한선(:9611) 717~800행 세션토큰 검증 로직을
CM_ 접두로 이식 — CM_시크릿초기화(data/auth/.secret 로드, 생성은 :9611 몫), CM_세션서명, CM_인증헤더추출,
CM_소유자ver조회, CM_인증확정(owner.exp.ver.sig 파싱→화이트리스트→exp→ver→sig). X-Crowny-Owner 폴백 완전 제거.
CM_요청처리에서
/api/health만 무인증, 그 외는 CM_인증확정 실패 시 401
{"error":"auth_required"}.
/Users/ef/crowny-services/public/cloud/index.html: 로그인 게이트 뷰 추가(토큰 없으면 대시보드 대신 로그인 카드).
토큰은
localStorage.crownyCloudToken, 로그인/가입은 동일 오리진 :9611
/api/auth/login·
/api/auth/register
(게이트웨이
/cloudapi 접두 없이). 모든
/cloudapi fetch에
Authorization: Bearer 헤더, 401 응답 시 토큰
삭제+로그인 뷰 복귀. 로그아웃 버튼 추가.
- 동반 파일:
/Users/ef/crowny-services/public/cloud/index.한선 — 프론트 인증 흐름(토큰 파싱/헤더/401 처리/
로그인·가입 바디) 한선씨 명세(프론트는 브라우저 전용 JS라 실행 대체 불가, 계약 문서화 목적).
검증 (실측)
curl 무토큰 GET :9662/api/node → 401 {"error":"auth_required"}
:9611 /api/auth/register cloudtest/test1234! → {"ok":true,"owner":"cloudtest"} → /api/auth/login → 토큰 발급
- 유효 토큰으로 GET
/api/node → 200 {"addr":...,"cpu":...}
- 잘못된 sig 토큰 →
401 {"error":"auth_required"}
- 게이트웨이 경유
https://cloud.crowny.org/cloudapi/api/node 무토큰 → 401
- 크라우니AI검증.sh shot으로
http://127.0.0.1:9611/cloud/ 렌더 확인 — 로그인 카드 정상 표시(크림/골드 토큰)
- 디자인이식.sh diff crowny-cloud → 판정=티 점수=100 신규색=0 (첫 시도 타 → 임의 치수/그림자 값을 기존
모달카드 스타일(max-width:440px, box-shadow 0 18px 50px rgba(32,24,18,.25))로 교체해 통과)
컴파일
hanseonc_high 클라우드관리.한선 STRICT 0경고. 9662 재기동(
launchctl kickstart -k gui/501/org.crowny.cloudapi).
잔여 이슈
- 프론트 401 자동로그아웃은 폴링 중 발생 시에도 즉시 처리되나, 폴백 UX(재로그인 유도 토스트)는 없음 — 향후 개선 여지.
/api/tier, /api/chain 등 모듈 내부의 ?owner= 쿼리 파싱은 이번 범위 밖(토큰 owner가 CM_요청처리의 소유자
인자로는 우선하지만, 각 모듈이 자체적으로 쿼리 owner를 또 읽는 부분은 손대지 않음 — 스펙 문서에 반영된 대로
"각 모듈 핸들에 넘기는 소유자 인자"만 토큰 owner로 확정됨).
이어진 ②③ 마감 (같은 날, 본세션 실측)
- 교차소유자 우회 수리: ①직후 본세션 재검증에서 발견 — 유효 토큰으로
?owner=jimin 조회 시 타인 데이터 노출(체인/tier/snapshot). 3모듈 모두 쿼리 owner 무시, 토큰 확정 소유자만 사용으로 수리. cloudtest 토큰→jimin 조회=자기 데이터만 반환 실측.
- ② 체인 실구동: 시드 12.5 제거(신규 계정 0), 장부 owner 컬럼 분리, 체인기록(owner,…) 시그니처, :9611 /api/anchor 실앵커(해시체인) 연동 — 앵커기록.psv seq=1의 anchor 해시가 :9611 head와 정확 일치 실측. 백업 시 +0.4가 실제 소유자 귀속.
- ③ 지표 정직화: mem 산식 (active+wired+compressed)/hw.memsize — 99% 고정→75~77% 실값. uplink 추정식(20+cpu/4) 폐기→netstat 비루프백 델타/1Gbps %, 소수2자리(awk — VM 정수나눗셈 절단 회피). 40MB 다운로드 중 2.17% 실측(이론 2.2% 일치).
- 함정 기록: VM 정수 나눗셈 자연반올림 → 소량 트래픽 % 절단. 비율 계산은 셸 awk 소수 산출로.