Supabase Auth 세션이 꼬일 때 로컬 세션을 정리하기
모바일 앱에서 refresh token 오류와 세션 누락 오류가 반복될 때, 인증 상태를 안전하게 복구한 기록입니다.
Code notes
코드에서 확인한 구현 포인트
배포 기준 2026.05.03
관련 파일
apps/mobile/lib/supabase.tsapps/mobile/app/auth/index.tsxapps/mobile/app/auth/email-login.tsx구현 메모
Supabase 클라이언트는 AsyncStorage에 세션을 저장하고 autoRefreshToken/persistSession을 켠다.
Invalid Refresh Token과 Auth session missing 오류를 패턴으로 구분해 로컬 세션 정리 여부를 결정한다.
sessionPromise로 동시에 여러 화면이 getSession을 호출할 때 같은 요청을 공유하게 했다.
로그인이 된 것 같은데 API는 사용자를 못 찾는다
모바일 앱에서 인증 문제는 아주 헷갈리게 나타난다. 화면은 로그인 상태처럼 보이는데 서버 요청에서는 user가 없거나, refresh token 오류가 반복되며 다음 화면으로 넘어가지 못할 수 있다.
처음에는 특정 화면의 문제처럼 보였지만, 실제로는 Supabase 세션을 읽는 공통 계층에서 오류를 더 조심스럽게 처리해야 했다.
오류 문구를 패턴으로 나누다
모든 인증 오류를 로그아웃으로 처리하면 사용자 경험이 거칠어진다. 그래서 Invalid Refresh Token, Refresh Token Not Found, Auth session missing 같은 패턴을 나눠 보았다.
refresh token이 확실히 잘못된 경우에는 로컬 세션을 정리하고, 세션이 비어 있는 경우에는 불필요하게 추가 오류를 키우지 않도록 처리했다.
동시에 여러 번 세션을 읽지 않기
여러 화면이 동시에 getSession을 호출하면 같은 오류가 여러 번 터질 수 있다. 그래서 sessionPromise를 두어 한 번 진행 중인 세션 조회를 공유하도록 했다.
이 작은 장치는 로그인 직후 화면 전환이나 앱 재시작 시 인증 상태가 여러 곳에서 동시에 필요할 때 안정성을 높여줬다.
배운 점
인증 디버깅은 화면에서 시작해도 공통 클라이언트에서 끝나는 경우가 많다. 로그인 화면만 고치면 되는 문제가 아니라, 세션을 읽고 정리하는 기준을 제품 전체에 맞춰야 한다.
사용자를 강제로 내보내는 것은 마지막 선택이어야 한다. 먼저 어떤 오류인지 분류하고, 복구 가능한 오류인지 확인하는 습관이 필요하다.
Keep reading
다른 글 이어서 보기
Debugging
2026.05.05
6 min read
GitHub 푸시 후 Vercel 배포가 Blocked가 되었을 때
커밋은 올라갔지만 Vercel 자동 배포가 막혔던 상황에서, GitHub 작성자와 프로젝트 권한을 확인해 해결한 기록입니다.
Debugging
2026.05.04
7 min read
서브도메인은 연결됐는데 /admin이 404였던 이유
blog, ad, nacho 서브도메인을 나누는 과정에서 Vercel 404와 앱 내부 라우팅 문제를 구분해 해결한 기록입니다.
Debugging
2026.05.03
8 min read
도메인은 연결됐는데 접속이 거부될 때
tangly.kr과 www 도메인을 Vercel에 붙이며 DNS, 네임서버, SSL 발급 대기 상태를 구분해 해결한 기록입니다.