Debugging/2026.05.03/7 min read

Supabase Auth 세션이 꼬일 때 로컬 세션을 정리하기

모바일 앱에서 refresh token 오류와 세션 누락 오류가 반복될 때, 인증 상태를 안전하게 복구한 기록입니다.

Supabase AuthMobileSession

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

다른 글 이어서 보기

전체 글 보기