연락처 결함 수정 (2026-06-21)
개요
/Users/ef/crowny-ai/engine/contacts.js 연락처 동기화 엔진 보안 수정.
한선씨 동반 /Users/ef/crowny-ai/연락처.한선 반영 + 재컴파일 검증 완료.
수정 내용
1. [MED] 호출자 인증 — verifyOwnership() 추가
sync/matches/feed세 함수 모두 진입 시callerOwner(SSO 헤더 추출) vscrownyId(요청값) 일치 검증- 불일치 시
{ ok: false, error: 'forbidden', status: 403 }즉시 반환 - IP 버킷 + 계정 버킷 이중 rate limit 추가 (
rateLimitAccount함수 신설) - 배선 runbook(
배선-연락처.md) 라우팅도callerOwner전달 +r.status === 403→ HTTP 403 처리 업데이트
2. [MED] matches() crowny_id 원문 비노출
- 기존:
[{ crowny_id: o, matched_at }]— 식별자 수확 공격 가능 - 수정:
[{ matched: true, display_name: null, matched_at }]— crowny_id 원문 제거 _selfIdx조회로 전환 (버그 3 수정과 연동)
3. [기능결함] buildIdx selfHashes 인덱스 누락 수정
buildIdx()가 rec.hashes만 _hashIdx에 인덱싱, rec.selfHashes는 누락 → matches() 항상 0건_selfIdx 분리 신설 (Map<selfFoneHash, Set<crownyId>>)buildIdx(): selfHashes → _selfIdx 추가 (누락 수정)sync(): selfIdxAdd/Remove 함수로 _selfIdx 관리matches(): _selfIdx에서 조회 (가입된 사람 = selfHash 등록자)whoHasMe(): 기존대로 _hashIdx 사용 (나를 주소록에 가진 사람)파일
/Users/ef/crowny-ai/engine/contacts.js— 엔진 수정/Users/ef/crowny-ai/연락처.한선— 한선씨 동반 (8/8 자가검증 PASS)/Users/ef/crowny-ai/배선-연락처.md— 라우팅 runbook 업데이트
검증
bash# 한선씨 컴파일+실행
cd /Users/ef/CrownyOS/crownyc
./hanseonc_high /Users/ef/crowny-ai/연락처.한선 > /tmp/연락처.toau
./crownyc run /tmp/연락처.toau
# → 연락처.한선 자가검증 PASS (8/8)
# JS 문법
node --check /Users/ef/crowny-ai/engine/contacts.js # OK
node -e "require('./engine/contacts')" # OK
잔여 이슈
matches()display_name: 현재null(contact record에 username 없음). 추후 auth.findByOwnerToken 연계로 보강 가능.배선-연락처.md는 runbook(라이브 무접촉 원칙) — 메인세션이 server.js에 적용.