sideproject · 2026-08-08 · 조회수 48
익명 테스트를 실제 가족 로그인으로 바꾸기 — 우리콕 개발기 4
초기 동기화 검증은 익명 로그인으로 시작했다. 버튼 한 번이면 두 클라이언트를 만들 수 있어 빨랐지만, 아내와 각자 휴대폰에 설치해 사용하려면 기기를 바꿔도 복구할 수 있는 계정이 필요했다.
이메일과 비밀번호로 돌아간 이유
첫 실사용 버전은 이메일·비밀번호 로그인을 사용한다. 가입할 때 이름은 필수,
닉네임은 선택으로 받는다. 화면에 표시할 이름은 닉네임 → 이름 → 이메일 앞부분
순서로 결정한다. 이 값을 공간 멤버 목록과 메모 작성자 이름에 함께 사용해
상대, 멤버 같은 익명 표기를 줄였다.

인증 화면도 메모 화면과 같은 밝은 배경, 청록 포인트, 얇은 입력 경계를 사용했다. 설치 직후부터 같은 제품으로 느껴지도록 강아지 봉투 아이콘과 우리콕 이름을 상단에 배치했다.
확인 링크가 첫 클릭부터 만료됐다
처음에는 Supabase 기본 ConfirmationURL 링크를 이메일에 넣고 Android
딥링크 com.woorikok.woori_kok://login-callback/으로 돌아오게 만들었다.
그런데 가입 확인과 비밀번호 복구 모두 새 메일을 처음 눌렀는데도
otp_expired 403이 재현됐다.
서버 로그에는 메일 요청이 200으로 남았고 OTP 만료 시간도 3600초였다. 에뮬레이터, 실제 휴대폰, 다른 브라우저에서 같은 결과가 나와 기기 시간 문제로 보기 어려웠다. 메일 보안 스캐너가 링크를 먼저 열었을 가능성도 확인했지만 명확한 선행 요청은 보이지 않았다.
링크 문제를 붙잡고 있기보다 메일에 포함된 숫자 인증번호를 앱에서 직접 입력하는
방식으로 바꿨다. 가입은 verifyOTP의 signup 타입, 비밀번호 복구는 recovery
타입을 사용한다. 프로젝트 설정에 따라 코드 길이가 달라질 수 있어 입력은
6~10자리를 허용했다. 복구 인증이 끝난 뒤에는 새 비밀번호 화면으로 이동한다.

기본 SMTP 대신 Resend
Supabase 기본 메일 발송은 개발 확인에는 충분하지만 가족 외 테스트까지 생각하면
발송량과 발신자 설정이 제한적이다. 보유 도메인의 하위 도메인을 Resend에 연결하고
DNS 검증을 마친 뒤 no-reply 발신 주소를 Supabase Custom SMTP에 연결했다.
앱에는 API 키나 SMTP 비밀번호를 넣지 않는다. 앱은 Supabase Auth에 가입·복구를 요청하고, 실제 메일 발송은 Supabase와 Resend 사이에서 처리한다.
인증 뒤에는 공간을 만든다
로그인이 끝났다고 바로 메모 화면으로 보내지 않는다. 사용자가 속한 공간이 없으면 새 공간을 만들거나 상대에게 받은 8자리 초대 코드로 참여하는 화면을 먼저 보여준다. 공간 생성이 끝나면 코드를 복사해 전달할 수 있고, 일반 멤버도 새 초대장을 만들 수 있다.
최종 가족 테스트 전에는 기존 익명 계정과 테스트 공간, 기기 토큰을 모두 삭제했다. Auth 사용자 수가 0명인지 확인한 뒤 새 APK를 만들었기 때문에 첫 설치 사용자는 테스트 데이터와 섞이지 않은 상태에서 시작한다.
딥링크 코드는 앱에 남아 있지만 현재 이메일 확인의 주 경로는 숫자 인증번호다. 나중에 링크 소비 원인을 확실히 찾거나 Universal Link/App Link를 구성하면 한 번 누르는 흐름을 다시 검토할 수 있다.
댓글