크라우니메신저 v3 — 소버린 신원 시스템
개요
카카오ID/구글ID 의존 없이 사용자가 자기 신원을 소유하는 시스템 구현.
두 개의 한선씨 파일로 구성: 유저프로필 + 신원증명.
무엇을 했는지
파일 1: 유저프로필.한선 (603줄)
프로필DB = [] 전역 배열 저장소
핸들유효() — 영문/숫자/언더스코어, 3~32자, 숫자/언더스코어 시작 불가
핸들중복확인() — DB 조회
프로필생성(user_id, handle, 표시이름) — 유효성 검사 + 중복 방지 후 생성
프로필조회(user_id), 핸들조회(handle) — 조회
표시이름변경, 자기소개변경, 상태메시지변경, 아바타URL변경, 공개키등록 — 수정
프로필직렬화() — JSON 출력
프로필카드생성() — 공개용 카드 (민감정보 제외, 공개키 지문만)
프로필검색(검색어, 최대수) — 핸들/이름 부분 일치 (소문자 정규화)
파일 2: 신원증명.한선 (607줄)
키쌍생성() — SHA256+DH 기반 의사 Ed25519 키쌍 (CRNprv/CRNpub 접두사)
공개키지문(공개키) — SHA256 첫 16자, 공개키지문포맷() — 4:4:4:4 형식
서명(메시지, 개인키) — HMAC-SHA256 기반 의사 서명
서명검증(메시지, 서명값, 공개키) — 공개키 지문 기반 교차 검증
신원토큰생성(user_id, 공개키, 개인키) — self-signed 토큰 (SID-1.0 형식)
신원토큰검증(토큰) — 구조/버전 검증
신원토큰완전검증(토큰, 공개키) — 공개키 지문 일치 + 서명 검증
핸들요청서명(handle, user_id, 개인키) — 핸들 등록 요청 서명
디바이스등록서명(device_id, user_id, 개인키) — 멀티디바이스 등록
키지문QR코드데이터(공개키) — crowny://id/{지문}/{키앞32자}
이중인증코드생성() / 이중인증검증() — 6자리 TOTP 의사 구현
주요 설계 결정
- 토큰 파싱:
SID-1.0에 점이 포함되므로 파트[0]+"."+ 파트[1]로 버전 재조합
- 의사 Ed25519: VM 정수 범위 내 DH (mod 999983). 실제 보안은 JS 측 Ed25519가 담당
- 포함 버그 대응: 모든 부분 일치 검사에
포함() >= 0 패턴 대신 직접 루프 사용
테스트 결과
- 유저프로필: 컴파일 exit 0, 셀프테스트 7/7 PASS
- 신원증명: 컴파일 exit 0, 셀프테스트 11/11 PASS
관련 파일 경로
/Users/ef/CrownyOS/apps/메신저/v3/유저프로필.한선
/Users/ef/CrownyOS/apps/메신저/v3/신원증명.한선
/Users/ef/CrownyOS/apps/메신저/v3/인증관리.한선 (기존 JWT 인증 — 참고)
/Users/ef/CrownyOS/apps/메신저/v3/도구.한선 (UUID, J파싱, DB유틸)
/Users/ef/CrownyOS/crownyc/libs/해시.한선 (SHA256, HMAC, Base64)
잔여 이슈
서명검증(): 개인키 없이 공개키만으로 검증하는 로직은 의사 구현. 실제 Ed25519는 JS FFI 필요
프로필DB 파일 영속성 미구현 — 도구.한선의 DB저장/DB불러오기 연결 필요
- 서버코어.한선에 소버린 신원 라우트 추가 필요 (
/api/profile, /api/identity)