← 목록
기타 2026-07-23 5KB 읽기 5분

Crowny INT — API v2 확장 (INT서버.한선)

개요

int.crowny.org 백엔드 /Users/ef/crowny-int2/INT서버.한선에 API v2 계약(인증/세션, 라이브 육성방송, WebRTC 시그널링, 체험(demo) 샌드박스, 신규 정적 4라우트)을 추가. 기존 라우트·체인 로직·정적 pc/tablet/mobile/bar/design.html·int-bridge.js는 무변경.

무엇을 했는지

  • 계정: 고정 13계정(yongin/guseong/flexdev/m1~m10) 조회 함수 _계정조회 — 아니면-체인 대신 개별 만약+조기 반환으로 구현(35중첩 아니면 한계 회피).
  • 세션: POST /api/auth/login, GET /api/auth/check — 토큰=해시_SHA256(id+ts+소금) 앞32자, data/세션.psv(token|id|role|org|ts) append. 조회는 tail -n 200 체계 + 한선씨 비교(클라 토큰은 셸에 절대 보간하지 않음).
  • 라이브: POST /api/live/start·/stop(yongin·m1만) → data/라이브.psv 단일줄 재작성 + 기존 _처리커밋의 main직행/sub전달(curl→/api/fire) 경로를 복제한 _라이브커밋으로 체인 커밋. GET /api/live는 on/since/by + listeners(스펙 명시 find -mmin -1 | wc -l 그대로 사용).
  • WebRTC 시그널링: /api/rtc/{join,listeners,offer,answer,leave} — lid는 서버가 생성(l<ts>-<무작위(0,999999)>), flat 파일 /tmp/int_rtc_{l,o,a}_<lid>.txt. 클라 제공 lid/to/sdp는 화이트리스트 문자클래스 검증(포함하나 기반, [a-z0-9-] / base64자모) 후에만 파일명 조립 — 경로 주입(../etc/passwd 등) 400 거부 실측 확인.
  • 체험(demo) 샌드박스: /api/demo/{signup,state,config,fire,logs} — 메인 체인과 분리된 체험체인.psv/체험헤드.psv(제네시스 ts=0 결정론 동일), _헤드읽기_경로/_블록추가_경로/_제네시스보장_경로로 기존 체인 로직을 경로 파라미터화해 복제(원본 _헤드읽기/_블록추가 무변경).
  • 정적 4라우트: /guide, /demo, /demo/console(demo-console.html), /module — 기존 _정적서빙 재사용.

실측 검증 (포트 9577 임시 인스턴스)

  • CROWNY_STRICT=1 hanseonc_high 컴파일 경고 0건.
  • 로그인 성공/403, check 200/401, live start(관리자 성공/일반사용자 403 role)/stop, 체인 height 반영(emerg 커밋 2건) 전부 PASS.
  • RTC: join(유효/무효 모듈 400) → listeners 목록 반영 → offer POST/GET base64 왕복 바이트 일치 → answer POST/GET 왕복 일치 → 경로주입 lid(../etc/passwd, ../x) 400 거부 → leave 후 파일 삭제(offer 재조회 시 빈 문자열) 전부 PASS.
  • demo: signup/중복(dup)/state(found 0→1, now/prev 2건 전후비교)/config/fire 2회 height 증가(1→2)/logs 전부 PASS. 메인 체인 height는 demo fire와 무관하게 불변(오염 없음) 확인.
  • 회귀: 기존 /api/fire 키검증(403)·정상 커밋(height 증가)·/api/chain/verify(ok:true)·기존 정적 5라우트(pc/tablet/mobile/bar/design) 전부 200 유지.

잔여 이슈

  • /api/livelisteners 필드(계약 SSOT 명시 find /tmp -maxdepth 1 -name 'int_rtc_l_*' -mmin -1 | wc -l)가 이 개발 샌드박스에서 항상 0을 반환 — 진단 결과 find(옵션 무관, /usr/bin/find도 동일)가 이 도구 샌드박스 안에서 /tmp 하위 파일을 전혀 열거하지 못함(방금 touch한 파일도 미검출, ls는 정상). 스펙 문구를 임의 변경하지 않고 그대로 구현했으나, 실제 운영 호스트(VPS/맥, 샌드박스 밖)에서 재검증 필요. /api/rtc/listeners는 동일 문제를 피하려 ls 글롭 + 파일 내용에 기록한 등록시각(현재시간() 비교)으로 구현해 정상 동작 확인(라이브 데모에서도 이 패턴이 필요하면 /api/live도 전환 검토).
  • RTC 리스너에 하트비트/재조인 갱신 엔드포인트가 계약에 없어, 40초 신선도 판정은 최초 join 시각 1회 기준(장시간 세션에서 listeners 목록에서 자연 소멸 가능) — 계약 범위 내 설계, 필요시 클라가 주기적 재-join 권장.

관련 파일

  • /Users/ef/crowny-int2/INT서버.한선 (수정 대상, 유일 담당)
  • /Users/ef/crowny-int2/data/{세션,라이브,체험계정,체험설정,체험체인,체험헤드}.psv (신규 런타임 생성 경로)
  • 테스트: 포트 9577 임시 인스턴스(/tmp/intx2), 정리 완료(프로세스 kill, tmp RTC 파일 삭제)

크라우니코드

lookup/search MISS(신규 세션/RTC 시그널링 패턴 DB 부재) → 직접 생성 → learn add "한선씨세션토큰생성" 1건 학습 완료.