이 글의 성격은 무엇인가요?
질문 / 문제 해결
내용을 설명해주세요
개발 환경: WebView 미니앱 (Next.js + @apps-in-toss/web-framework 2.5.0)
테스트 환경: 콘솔 빌드 업로드 → QR 실행 (샌드박스/실기기)
상태 관리: Zustand persist 어댑터로 SDK Storage(getItem/setItem) 사용
[증상]
토스 로그인(appLogin → 자체 BE 토큰 교환)은 성공합니다(BE 로그상 토큰 정상 발급).
그런데 로그인 직후 첫 인증 API(/me) 호출이 간헐적으로 실패하며,
재시도 화면(“정보를 불러오지 못했어요”)으로 떨어집니다.
앱을 완전 종료 후 재실행하면 정상 동작할 때가 많아, 콜드 스타트 타이밍 의존이 의심됩니다.
[구조]
- 로그인 성공 시 Zustand store 메모리에 accessToken/refreshToken을 즉시 set
- persist는 refreshToken만 SDK Storage에 저장 (partialize)
- 앱 부팅 시 persist가 SDK Storage에서 비동기 rehydration
[의심하는 원인 — 확인 요청]
SDK Storage의 getItem/setItem이 Promise(비동기)이고 네이티브 브리지라 느리다 보니,
"로그인으로 막 set한 토큰"보다 "부팅 시 시작된 rehydration"이 늦게 도착해
메모리의 fresh 토큰을 과거값/null로 덮어쓰는 레이스가 의심됩니다.
local(브라우저 localStorage) 환경에선 재현되지 않고, 토스 SDK Storage 환경에서만 나타납니다.
[질문]
- SDK Storage(getItem/setItem)의 호출 지연/완료 순서에 대해 보장되는 동작이 있나요?
(예: 부팅 직후 첫 getItem이 수백 ms~초 단위로 지연될 수 있는지) - Zustand persist 같은 비동기 rehydration 어댑터와 함께 쓸 때,
토스 측에서 권장하는 hydration 완료 감지/순서 보장 패턴이 있나요? - WebView 환경에서 SDK Storage 접근이 hang되거나 크게 지연된 사례가 보고된 적 있나요?
(web-framework 2.5.0 기준)
appName (선택)
ppojjak-log