📋 2026-07-04 — 가입 방식 전면 개편 · KCP 실계약 전환 보고서

■ 진행률: 설계→백엔드→모바일→약관→QA 전 단계 완료, OTA+웹 배포 완료   ■ 완료: KCP 실계약 전환, 가입=휴대폰 본인인증 단일화, 알림 세분화, 마케팅동의 설정, 숨김 관리자/테스트 로그인, RLS 치명 버그 발견+수정, 약관·개인정보처리방침 개정   ■ 승인 필요: 없음(전부 사용자 승인 하에 진행)   ■ 남은 것: 실기기 수동 테스트(아래 3절), 스토어 등록 체크리스트(아래 4절), 결제(PG)는 보류

1. 오늘 진행한 일 — KCP 실계약 전환

항목내용
PortOne 실운영 채널KCP 휴대폰 본인인증 실연동 채널 생성 완료, 앱 채널키 교체, DUP_CHECK·REQUIRE_PHONE을 운영값(on)으로 전환
실제 인증 테스트구글남 계정으로 실제 통신사 인증 성공 확인(암호화 CI 저장 확인) → 테스트 후 롤백 완료(해당 번호 재사용 가능)
스플래시 로딩최소 노출시간 2초→1초로 단축

2. 가입 방식 전면 개편(휴대폰 PASS 전용)

설계 결정

결정이유
회원가입 = 휴대폰 본인인증(PASS) 단일 경로, 구글 버튼 제거구글/번호 두 경로를 두면 회원이 헷갈려 중복계정을 만드는 문제를 원천 차단
CI(연계정보) 기반 계정 매칭번호가 바뀌어도 동일인이면 같은 계정으로 로그인(버디·채팅·찜 유지), 번호가 같아도 다른 사람이면 새 계정 — 전화번호가 아니라 실제 신원(CI)으로 매칭
관리자·테스트계정 = 숨김 로그인(로고 5회 탭)회원가입 화면을 어지럽히지 않으면서 내부 계정 접근로 확보. role=admin 또는 is_test_account=true만 통과
번호변경 = 반드시 재인증(텍스트 직접수정 불가)신원 일치를 보장할 수 있는 유일한 방법
연락처 자기입력 폐지PASS로 검증된 번호가 이미 있어 중복 수집 불필요. 지인차단 로직은 원래도 profiles.phone을 함께 확인하고 있어 백엔드 변경 없이도 자동 대체됨
본인인증 불가자(알뜰폰·법인폰 등) 별도 구제 경로미구축(사용자 결정: "그냥 안 할게") — 현재는 가입 자체가 막힘
결제(PG)이번 범위에서 제외(사용자: "나중에 다시 고민"). PortOne PG 계약 완료 메일 수신 확인했으나 앱에 연동된 코드는 없음(버디 충전은 여전히 무통장입금 수동확인)

백엔드 구현

항목내용
identity-signup Edge Function(신규)로그인 없이 PortOne 재검증 → CI로 기존계정 조회(있으면 로그인, 없으면 섀도이메일+휴대폰만으로 신규계정) → generateLink(magiclink)+클라이언트 verifyOtp로 세션 발급. 실제 토큰 발급·교환 테스트 완료(200, access_token 확인)
notification_prefs(0146)찜·매칭대화·신규회원·프로필방문·충전·공지 6개 카테고리 토글. notify_push/notify_push_message 발송 직전에만 확인 — 인앱 알림함은 그대로 유지, 기기 푸시만 제어. 경고·승인·거절은 항상 발송(끌 수 없음)
관리자·테스트 숨김 로그인기존 구글 계정(gongssum@gmail.com, 구글남, 구글녀)에 비밀번호만 추가(계정·데이터 그대로, Google identity 유지). CREDENTIALS.local.md 기록, password grant로 3계정 모두 로그인 성공 확인

⚠️ 작업 중 발견한 치명적 기존 버그(이번에 함께 수정)

profiles_select RLS 정책 무력화0106(관리자 비노출)부터 존재하던 버그. 정책 안의 exists(select from users u where...) 서브쿼리가 호출자 권한으로 실행되는데, users_select 정책이 "본인 또는 관리자만 조회 가능"이라 일반 회원은 남의 users 행을 볼 수 없음 → 그 결과 관리자/강퇴/테스트계정 제외 조건이 전부 무효화되어 있었음(실제로 테스트계정이 새는 것을 라이브 DB에서 확인). blocks 테이블도 같은 이유로 "상대가 나를 차단"한 방향은 감지 안 됨(한쪽만 작동).
✅ 0145로 수정(SECURITY DEFINER 헬퍼 함수로 우회) — 실제회원 시점 테스트계정 조회 0건, 차단 양방향 모두 비노출 재검증 완료

모바일 구현

파일내용
sign-in.tsx구글 버튼 제거, 휴대폰 본인인증 단일 버튼. 로고 텍스트 5회 연속탭 → /admin-login
admin-login.tsx(신규)이메일+비밀번호, role=admin 또는 is_test_account=true만 통과 후 나머지는 강제 로그아웃
contact-change.tsx연락처 수동입력 화면 → PASS 재인증 기반 "번호 변경" 화면으로 전면 교체
notification-settings.tsx / marketing-consent.tsx(신규)알림 6종 토글 / 마케팅동의 토글, 설정에서 진입
schemas.ts · profile-form.tsx · profile.ts연락처(contact_phone) 수동입력 필드 전체 제거(입금자명은 유지 — 계좌이체 확인용으로 별도 목적)
terms.tsx · privacy.tsx가입방식(구글→PASS), 번호변경 재인증 필수, CI 기반 동일인확인, 알림 옵트아웃, 마케팅동의 철회 반영. 기존 문서의 "연락처가 상대에게 공개될 수 있음" 문구가 실제 동작과 불일치하던 부분도 함께 정정
안심가이드 공지(DB)"구글 로그인"→"PASS 가입" 문구 갱신 + 번호변경 안내 추가

3. ⚠️ 실기기 수동 테스트가 필요한 부분

이 작업 환경에는 모바일 시뮬레이터가 없어 타입체크·백엔드 API 직접 호출로만 검증했습니다. 아래는 실제 폰에서 한 번은 눈으로 확인하시길 권합니다.

확인 항목확인 방법
가입 화면에서 실제 PASS 인증 → 온보딩 진입새 번호(또는 테스트 후 롤백한 번호)로 "휴대폰 번호로 시작하기" 눌러 끝까지 진행
로고 5회 탭 → 숨김 로그인 화면가입 화면 상단 "공치고 썸타고" 텍스트 빠르게 5번 탭
관리자/테스트 계정 숨김 로그인CREDENTIALS.local.md의 계정으로 로그인 시도
설정 3종 화면 레이아웃번호변경/알림설정/마케팅동의 진입해 스위치 동작 확인

4. 📦 스토어 등록 전 별도 체크리스트(이번 작업과 무관 — 참고용)

항목상태
개인정보처리방침 공개 URL(스토어 등록 시 필수 기재)앱 내부에만 있음 — 외부에서 열람 가능한 고정 URL 필요
앱 권한 사용 설명(카메라·연락처·알림 등)스토어 심사용 설명 문구 별도 준비 필요
스크린샷·앱 아이콘·설명문구미준비
연령등급 신청미확인(성인 매칭 서비스 특성상 등급 검토 필요)
통신판매업번호미확보(기존 메모리 이슈, 유료 이용권 판매 중이라 필요할 수 있음)

문의: 위 남은 항목 진행 여부는 별도로 말씀해 주세요.