📋 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 필요 |
| 앱 권한 사용 설명(카메라·연락처·알림 등) | 스토어 심사용 설명 문구 별도 준비 필요 |
| 스크린샷·앱 아이콘·설명문구 | 미준비 |
| 연령등급 신청 | 미확인(성인 매칭 서비스 특성상 등급 검토 필요) |
| 통신판매업번호 | 미확보(기존 메모리 이슈, 유료 이용권 판매 중이라 필요할 수 있음) |
문의: 위 남은 항목 진행 여부는 별도로 말씀해 주세요.