[FEAT] 스토어 심사용 임시 로그인 진입점 추가 (#373) - #374
Merged
Merged
Conversation
심사관은 소셜 로그인을 쓸 수 없다. 카카오는 계정 생성에 한국 휴대폰 번호가 필요하고 데모용 카카오 계정도 확보되어 있지 않다. 애플은 심사관 본인 Apple ID로 로그인해 항상 신규 가입 플로우로 들어가 휴대폰 SMS 인증을 거쳐야 한다. BE 에 소셜을 거치지 않고 USER 롤 토큰을 발급하는 POST /auth/review/login 이 추가되어(Finders-Official/BE#775) 이를 호출할 진입점을 붙인다. 진입점은 로고 롱프레스 2초다. 일반 사용자가 우연히 마주치지 않으면서 심사 노트에 진입 방법을 한 줄로 적을 수 있다. 플랫폼으로 분기하지 않는다 — 안드로이드는 애플 로그인이 없어 이 경로가 유일한 대안이고, iOS 도 애플 로그인 후 SMS 인증에서 막힐 경우의 폴백이 필요하다. 로그인 성공 후처리는 소셜 로그인 기존 회원과 같은 순서(토큰 저장 -> 전역 사용자 설정 -> 메인 이동)를 탄다. 심사 경로만 다르게 동작하면 심사관이 보는 화면과 실제 사용자가 보는 화면이 갈라진다. 디자인 피드백을 반영해 비밀번호는 기본 마스킹 + 보기 토글, 입력창은 포커스 시 테두리와 배경으로 활성 상태를 구분하고, 두 값이 모두 채워지기 전에는 제출 버튼을 비활성으로 둔다.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
팀에서 심사관에게 전달하기로 한 ID 가 이메일 형식이 아니다. 서버가 @Email 검증을 제거하고 필드를 username 으로 바꿨다(Finders-Official/BE#781). 입력 필드도 type="email" 에서 text 로 바꾼다. 이메일 타입은 모바일에서 @ 키패드를 띄우고 브라우저 기본 검증이 붙어 임의 ID 입력을 방해한다.
MlNTYS
reviewed
Aug 27, 2026
MlNTYS
left a comment
Contributor
There was a problem hiding this comment.
Claude 자동 리뷰
검사 범위:
- 로직 오류 · 엣지 케이스 — 변경된 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:run15/15 통과. lint가 unused disable까지 검사하므로 스크림<button>의eslint-disable-next-line no-restricted-syntax는 실제로 필요하고 위치도 맞다는 게 확인됐다.
Major 1건은 실패 경로에서 심사관이 보게 될 에러 문구 문제이고, 성공 경로(정상 자격증명 → 토큰 저장 → 메인 이동)는 소셜 로그인 기존 회원 경로와 동일하게 잘 맞물려 있다.
리뷰하지 않은 것: 백엔드가 잘못된 자격증명에 대해 실제로 어떤 HTTP 상태를 반환하는지는 이 레포에서 확인할 수 없어(BE는 별도 저장소), Major 건의 인터셉터 우회 부분은 401인 경우를 전제로 적었다. 400/403이어도 문구가 어긋나는 부분은 동일하게 성립한다.
Generated by Claude Code
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>
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
스토어 심사관이 소셜 로그인 없이 앱 전 기능에 접근할 수 있는 진입점을 로그인 화면에 추가한다.
2026-08-20 App Store 리젝(Guideline 2.1 "We were unable to sign in with the following demo account credentials")의 원인은 심사관이 데모 계정으로 로그인하지 못한 것이다. 현재 로그인 화면의 진입점은 카카오/애플 소셜뿐이고 두 경로 모두 심사관 환경에서 막힌다.
providerId를 사전에 알 수 없다. 항상 신규 회원 플로우로 진입해 휴대폰 SMS 인증을 거쳐야 한다.BE에 소셜을 거치지 않고
USER롤 토큰을 발급하는POST /auth/review/login이 추가되어(Finders-Official/BE#775, 운영 배포 완료) 이를 호출할 진입점을 붙인다.Changes
types/auth/reviewLogin.tsSocialLoginSuccess를 재사용apis/auth/reviewLogin.api.tsPOST /auth/review/loginhooks/auth/login/useReviewLogin.tshooks/auth/login/useReviewLogin.test.tscomponents/auth/ReviewLoginDialog.tsxpages/auth/LoginPage.tsx진입점을 로고 롱프레스로 둔 이유
일반 사용자가 우연히 마주치지 않으면서, 심사 노트에 진입 방법을 한 줄로 적을 수 있다.
pointerdown에서 2초 타이머를 걸고pointerup/pointerleave/pointercancel에서 취소하며, 언마운트 시에도 타이머를 정리한다.플랫폼으로 분기하지 않는 이유
안드로이드는 애플 로그인이 없어 이 경로가 유일한 대안이고, iOS도 애플 로그인 후 SMS 인증에서 막힐 경우의 폴백이 필요하다. 어느 쪽을 안내할지는 스토어별 심사 노트에서 구분한다.
로그인 성공 후처리
소셜 로그인 기존 회원과 같은 순서(토큰 저장 → 전역 사용자 설정 → 메인 이동)를 탄다. 심사 경로만 다르게 동작하면 심사관이 보는 화면과 실제 사용자가 보는 화면이 갈라져 사각지대가 생긴다.
consumeRedirectAfterLogin()도 동일하게 처리한다.디자인 피드백 반영
type="password"마스킹 + 보기/숨김 토글orange-500)와 배경(neutral-850)으로 구분Signing in...Type of Change
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로 작성했다. 모듈이 없는 상태에서 먼저 실패를 확인한 뒤 구현했다.
setTokens({ accessToken, signupToken: null })setUser({ memberId, nickname })onSuccessonError호출BE는 운영 배포와 실측 검증이 끝난 상태다.
참고 — 배경 스크림의 lint 예외
no-restricted-syntax(raw<button>금지)에eslint-disable-next-line을 한 줄 달았다. 배경 스크림은 누르는 대상이 아니라 닫기용 히트 영역이라Press의 눌림 모션이 붙으면 시트 전체가 흔들린다. 룰 메시지가 안내하는 "스크림 등 의도적 미적용" 사례에 해당하며 사유를 주석으로 남겼다.머지 후 심사 노트에 넣을 내용