저장된 자동 로그인 정보가 만료된 상태에서 앱을 켜면 로그인 만료 팝업이 닫히자마자 다시 나타났다. 팝업을 닫으면 로그인 화면으로 가지만 백그라운드의 재접속 코드가 저장 정보를 다시 읽어 로그인 요청을 보냈다. 서버는 다시 만료 응답을 주고 같은 흐름이 반복됐다.
각 코드만 보면 정상적인 행동이었다. 만료 처리와 재접속이 서로의 상태를 모르고 움직인 게 문제였다.
만료는 재시도 가능한 오류가 아니었다
네트워크 타임아웃과 인증 정보 만료를 같은 Failed 상태로 처리해 공통 재시도기가 모두 다시 실행했다. 실패를 원인별로 분류했다.
enum LoginFailure
{
NetworkTemporary,
ServiceUnavailable,
CredentialExpired,
PermissionDenied
}
일시 오류만 제한적으로 재시도하고 만료와 권한 거부는 사용자 입력이 필요한 상태로 전환했다.
먼저 자동 로그인 근거를 무효화했다
팝업을 띄우기 전에 메모리와 안전한 저장소의 만료된 세션 정보를 정리하고 재접속을 중단했다.
async Task HandleExpiredAsync()
{
reconnect.Stop();
session.MarkExpired();
await credentialStore.RemoveExpiredAsync();
navigator.ShowLoginRequiredOnce();
}
화면은 이미 만료 상태인지 확인해 같은 안내를 두 번 열지 않았다.
동시에 온 실패도 한 번만 처리했다
여러 API가 같은 만료 세션으로 요청 중이면 인증 실패가 연속으로 도착했다. 첫 신호만 상태 전이를 실행하고 나머지는 이미 만료된 결과로 흡수했다. 진행 중 요청도 취소해 추가 팝업 원인을 줄였다.
앱이 백그라운드에 있을 때 만료되면 상태만 바꾸고 복귀 시 안내를 한 번 표시했다.
테스트에서는 만료된 정보로 첫 실행, 연결 중 만료, 여러 API가 동시에 실패, 팝업을 닫지 않고 앱 복귀를 확인했다. 어떤 순서에서도 저장 정보가 다시 자동 로그인 조건으로 살아나지 않아야 했다.
자동화에는 중단 조건이 필요했다
자동 로그인과 자동 재접속은 사용자를 돕지만 실패 원인을 구분하지 않으면 빠르게 같은 오류를 반복한다. 자동화가 언제 멈추고 사람의 입력을 기다릴지를 설계해야 했다.
이 작업 뒤 재시도 코드를 볼 때 횟수와 간격만 보지 않는다. 어떤 오류가 바뀐 조건 없이 다시 성공할 수 있는지, 성공하려면 누가 무엇을 바꿔야 하는지를 먼저 본다. 만료 팝업 반복은 인증 상태의 종료 조건이 없어서 생긴 문제였다.