Skip to content

[FEAT] 스토어 심사용 임시 로그인 진입점 추가 (#373) - #374

Merged
jeonbinggu merged 3 commits into
developfrom
feat/app-review-login-#373
Aug 28, 2026
Merged

jeonbinggu merged 3 commits into
developfrom
feat/app-review-login-#373

Conversation

@IISweetHeartII

Copy link
Copy Markdown
Contributor

Summary

스토어 심사관이 소셜 로그인 없이 앱 전 기능에 접근할 수 있는 진입점을 로그인 화면에 추가한다.

2026-08-20 App Store 리젝(Guideline 2.1 "We were unable to sign in with the following demo account credentials")의 원인은 심사관이 데모 계정으로 로그인하지 못한 것이다. 현재 로그인 화면의 진입점은 카카오/애플 소셜뿐이고 두 경로 모두 심사관 환경에서 막힌다.

  • 카카오 — 계정 생성에 한국 휴대폰 번호가 필요해 심사관이 자체 계정을 만들 수 없다. 데모용 카카오 계정도 확보되어 있지 않다.
  • 애플 — 심사관이 본인 Apple ID로 로그인하므로 providerId를 사전에 알 수 없다. 항상 신규 회원 플로우로 진입해 휴대폰 SMS 인증을 거쳐야 한다.

BE에 소셜을 거치지 않고 USER 롤 토큰을 발급하는 POST /auth/review/login이 추가되어(Finders-Official/BE#775, 운영 배포 완료) 이를 호출할 진입점을 붙인다.

Changes

파일 내용
types/auth/reviewLogin.ts 요청 타입. 응답은 소셜 로그인 기존 회원과 동일해 SocialLoginSuccess를 재사용
apis/auth/reviewLogin.api.ts POST /auth/review/login
hooks/auth/login/useReviewLogin.ts mutation 훅. 성공 시 토큰 저장 → 전역 사용자 설정
hooks/auth/login/useReviewLogin.test.ts 단위 테스트 4개
components/auth/ReviewLoginDialog.tsx 이메일/비밀번호 입력 시트
pages/auth/LoginPage.tsx 로고 롱프레스(2초) 진입점 연결

진입점을 로고 롱프레스로 둔 이유

일반 사용자가 우연히 마주치지 않으면서, 심사 노트에 진입 방법을 한 줄로 적을 수 있다. pointerdown에서 2초 타이머를 걸고 pointerup / pointerleave / pointercancel에서 취소하며, 언마운트 시에도 타이머를 정리한다.

플랫폼으로 분기하지 않는 이유

안드로이드는 애플 로그인이 없어 이 경로가 유일한 대안이고, iOS도 애플 로그인 후 SMS 인증에서 막힐 경우의 폴백이 필요하다. 어느 쪽을 안내할지는 스토어별 심사 노트에서 구분한다.

로그인 성공 후처리

소셜 로그인 기존 회원과 같은 순서(토큰 저장 → 전역 사용자 설정 → 메인 이동)를 탄다. 심사 경로만 다르게 동작하면 심사관이 보는 화면과 실제 사용자가 보는 화면이 갈라져 사각지대가 생긴다. consumeRedirectAfterLogin()도 동일하게 처리한다.

디자인 피드백 반영

피드백 반영
비밀번호 입력 시 바로 노출 기본 type="password" 마스킹 + 보기/숨김 토글
입력창 활성·비활성 구분 없음 포커스 시 테두리(orange-500)와 배경(neutral-850)으로 구분
id/pw 입력 완료 후 sign in 두 값이 모두 채워지기 전에는 버튼 비활성, 진행 중에는 Signing in...

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Refactoring
  • Documentation
  • Chore

Related Issues

Closes #373

관련: Finders-Official/BE#774, Finders-Official/BE#775

검증

  • pnpm lint 통과 (--max-warnings 0)
  • pnpm build 성공
  • pnpm test:run — 15개 통과 (신규 4개 포함)

훅 테스트는 TDD로 작성했다. 모듈이 없는 상태에서 먼저 실패를 확인한 뒤 구현했다.

테스트 검증 내용
성공 시 accessToken 저장 setTokens({ accessToken, signupToken: null })
성공 시 전역 사용자 설정 setUser({ memberId, nickname })
성공 콜백 호출 순서 토큰 저장 이후 onSuccess
실패 시 토큰·사용자 미설정, onError 호출

BE는 운영 배포와 실측 검증이 끝난 상태다.

POST https://api.prod.finders.it.kr/api/auth/review/login
→ HTTP 200, JWT {"sub":"9000000000000000001","role":"USER"}

참고 — 배경 스크림의 lint 예외

no-restricted-syntax(raw <button> 금지)에 eslint-disable-next-line을 한 줄 달았다. 배경 스크림은 누르는 대상이 아니라 닫기용 히트 영역이라 Press의 눌림 모션이 붙으면 시트 전체가 흔들린다. 룰 메시지가 안내하는 "스크림 등 의도적 미적용" 사례에 해당하며 사유를 주석으로 남겼다.

머지 후 심사 노트에 넣을 내용

Demo account (no social login required):

1. Launch the app
2. Long-press the logo on the login screen for 2 seconds
3. Email:    review@finders.app
   Password: FindersReview2026!

"Sign in with Apple" also works. If the app asks for phone verification:
   Phone: 01012345678
   Code:  123456
This is a permanent fixed bypass code — no SMS is sent and it can be
re-entered any number of times.

심사관은 소셜 로그인을 쓸 수 없다. 카카오는 계정 생성에 한국 휴대폰 번호가
필요하고 데모용 카카오 계정도 확보되어 있지 않다. 애플은 심사관 본인 Apple ID로
로그인해 항상 신규 가입 플로우로 들어가 휴대폰 SMS 인증을 거쳐야 한다.

BE 에 소셜을 거치지 않고 USER 롤 토큰을 발급하는 POST /auth/review/login 이
추가되어(Finders-Official/BE#775) 이를 호출할 진입점을 붙인다.

진입점은 로고 롱프레스 2초다. 일반 사용자가 우연히 마주치지 않으면서 심사 노트에
진입 방법을 한 줄로 적을 수 있다. 플랫폼으로 분기하지 않는다 — 안드로이드는 애플
로그인이 없어 이 경로가 유일한 대안이고, iOS 도 애플 로그인 후 SMS 인증에서 막힐
경우의 폴백이 필요하다.

로그인 성공 후처리는 소셜 로그인 기존 회원과 같은 순서(토큰 저장 -> 전역 사용자
설정 -> 메인 이동)를 탄다. 심사 경로만 다르게 동작하면 심사관이 보는 화면과 실제
사용자가 보는 화면이 갈라진다.

디자인 피드백을 반영해 비밀번호는 기본 마스킹 + 보기 토글, 입력창은 포커스 시
테두리와 배경으로 활성 상태를 구분하고, 두 값이 모두 채워지기 전에는 제출 버튼을
비활성으로 둔다.
@vercel

vercel Bot commented Aug 27, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
finders Ready Ready Preview Aug 28, 2026 5:07am

팀에서 심사관에게 전달하기로 한 ID 가 이메일 형식이 아니다. 서버가
@Email 검증을 제거하고 필드를 username 으로 바꿨다(Finders-Official/BE#781).

입력 필드도 type="email" 에서 text 로 바꾼다. 이메일 타입은 모바일에서
@ 키패드를 띄우고 브라우저 기본 검증이 붙어 임의 ID 입력을 방해한다.

@MlNTYS MlNTYS left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude 자동 리뷰

⚠️ 이슈 3건 (Critical 0 / Major 1 / Minor 2)

검사 범위:

  • 로직 오류 · 엣지 케이스 — 변경된 9개 파일 전체. 타입/저장소 정합(SocialLoginSuccess → tokenStorage.setTokens → useAuthStore.setUser), 롱프레스 타이머 정리, 훅 순서, Press의 prop 전달은 모두 확인했고 문제 없다. iOS 롱프레스 이미지 콜아웃도 index.css의 -webkit-touch-callout: none으로 이미 막혀 있어 해당 없음.
  • 컨벤션 준수 — CLAUDE.md, .claude/skills/tdd-clean-arch/SKILL.md, references/{directory-structure,state-management,routing-forms-http,testing-guide}.md. 레이어 의존 방향, {name}.api.ts 패턴, mutationKey 컨벤션, TSID string 유지, rem 단위, @theme 색상 토큰, 테스트 co-locate는 전부 준수.
  • typecheck / lint / test — tsc -b 통과, pnpm lint(--max-warnings 0 --report-unused-disable-directives) 통과, pnpm test:run 15/15 통과. lint가 unused disable까지 검사하므로 스크림 <button>의 eslint-disable-next-line no-restricted-syntax는 실제로 필요하고 위치도 맞다는 게 확인됐다.

Major 1건은 실패 경로에서 심사관이 보게 될 에러 문구 문제이고, 성공 경로(정상 자격증명 → 토큰 저장 → 메인 이동)는 소셜 로그인 기존 회원 경로와 동일하게 잘 맞물려 있다.

리뷰하지 않은 것: 백엔드가 잘못된 자격증명에 대해 실제로 어떤 HTTP 상태를 반환하는지는 이 레포에서 확인할 수 없어(BE는 별도 저장소), Major 건의 인터셉터 우회 부분은 401인 경우를 전제로 적었다. 400/403이어도 문구가 어긋나는 부분은 동일하게 성립한다.


Generated by Claude Code

Comment thread src/hooks/auth/login/useReviewLogin.ts Outdated
Comment thread src/components/auth/ReviewLoginDialog.tsx Outdated
Comment thread src/components/auth/ReviewLoginDialog.tsx
PR #374 리뷰 3건 반영.

비-2xx 응답은 axios가 먼저 reject해 reviewLogin.api.ts의 !success 분기를
타지 않는다. 그대로 두면 "Request failed with status code 401" 같은 axios
원문이 시트에 렌더되므로, 레포 기존 패턴대로 isAxiosError로 언랩해 서버
ApiResponse.message를 먼저 읽는다.

/auth/review/login은 인증 전 공개 엔드포인트인데 shouldSkipAuth에 없어
401이 refresh 분기까지 내려갔다. 쿠키도 없는 상태로 불필요한 reissue가
나가고 원래 로그인 에러가 reissue 에러로 대체되므로 예외 목록에 추가한다.

시트는 조건부 렌더가 아니라 숨김이라 요청이 시트보다 오래 살아남는다.
닫은 뒤 로그인이 성사되거나 재진입 시 이전 시도의 에러·pending 상태가
남으므로, 진행 중에는 스크림을 비활성화한다.

useReviewLogin은 저장소에서 유일하게 barrel을 우회하던 import라
hooks/auth/login/index.ts에 export를 추가하고 경로를 맞춘다.

AxiosError로 reject되는 테스트를 추가해 이 부류의 회귀를 잡는다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jeonbinggu
jeonbinggu merged commit efd2b2a into develop Aug 28, 2026
3 checks passed

This branch was successfully deployed

1 active deployment
Preview — b204f612 Deployed Aug 28, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] 스토어 심사용 임시 로그인 진입점 추가

3 participants