본문 바로가기
Computer/Android&iOS

안드로이드 웹뷰 로그인이 자꾸 풀린다면?

by ywlee 2026. 1. 14.

앱을 운영하다 보면 iOS에서는 멀쩡한데 안드로이드에서만 유독 "앱 업데이트만 하면 로그인이 풀린다"거나 "앱을 껐다 켜니 다시 로그인해야 한다"는 사용자 제보를 받을 때가 있습니다. 이 문제의 핵심 원인인 CookieManager의 동기화 메커니즘과 해결 방법을 정리했습니다.

 

1. 상용 환경에서 로그인이 풀리는 현상

정상적인 상용 업데이트는 동일한 서명 키를 사용하므로 앱 내부 데이터가 유지되어야 합니다.

하지만 다음과 같은 상황에서 쿠키가 유실되는 케이스가 발생합니다.

  • 앱 업데이트 직후: 구글 플레이를 통해 앱이 업데이트되면 시스템은 기존 프로세스를 강제 종료합니다. 이때 메모리에만 머물던 세션 정보가 디스크로 기록되지 못하고 사라질 수 있습니다.
  • 백그라운드에서의 프로세스 종료: 사용자가 앱을 사용하다가 다른 앱을 사용하는 사이, OS가 메모리 확보를 위해 앱을 종료(Kill)할 때 동기화되지 않은 쿠키가 날아갑니다.

 

2. 원인: 메모리와 디스크 사이의 시차

안드로이드 웹뷰의 쿠키는 성능 최적화를 위해 메모리(RAM)에 먼저 저장된 후, 특정 시점에 디스크(SQLite DB)로 비동기 동기화됩니다.

문제는 이 '비동기 동기화' 시점입니다. 안드로이드 시스템은 효율성을 위해 쿠키를 모았다가 한꺼번에 저장하는데, 이 작업이 완료되기 전에 프로세스가 종료되면 메모리에만 존재하던 최신 로그인 정보(AccessToken 등)는 공중분해 됩니다.

 

flush 에 대한 공식문서입니다. 

이 말은 반대로 해석하면, flush 를 호출하기 전에는 영속성을 보장하지 않는다 라고 볼 수 있스빈다.

 

3. 해결책: CookieManager.flush() 명시적 호출

안드로이드 개발자는 쿠키의 영속성을 보장하기 위해 시스템에 "지금 당장 메모리의 내용을 디스크에 써라"라고 명령할 수 있습니다.

바로 flush() 메소드입니다.

flush()는 디스크 I/O를 발생시키지만, 브릿지 응답 시나 페이지 로딩 직후 1회 호출하는 정도는 실제 사용자 경험(UX)에 체감될 만한 오버헤드를 주지 않습니다.

 

// 1. 웹뷰 초기화 시 기본 설정
CookieManager.getInstance().apply {
    setAcceptCookie(true)
    setAcceptThirdPartyCookies(webView, true)
}

// 2. 동기화가 필요한 시점에 호출할 공통 함수
fun syncWebViewCookies() {
    // 내부적으로 비동기 I/O를 트리거하여 메모리 쿠키를 디스크에 기록함
    CookieManager.getInstance().flush()
}

적용 최적화 포인트

성능과 안정성을 모두 잡기 위해 다음 시점들에 flush()를 배치하는 것이 좋습니다.

  • 로그인 브릿지 콜백 시점: 웹뷰에서 로그인이 완료되어 안드로이드에 토큰을 전달하거나 상태를 알리는 브릿지가 호출될 때 즉시 동기화합니다.
  • 앱이 백그라운드로 갈 때 (onStop/onPause): 사용자가 앱을 이탈하는 시점에 데이터를 보존합니다.
  • 페이지 로딩 완료 시 (onPageFinished): SPA 구조가 아니라면 페이지 이동이 끝날 때마다 호출하여 유실 방지를 극대화합니다.

 

 

5. 마치며

안드로이드에서 웹뷰 세션 관리는 단순히 설정값 몇 개를 바꾸는 것으로 끝나지 않습니다. 특히 비즈니스 로직상 중요한 로그인 세션은 CookieManager.flush()를 적재적소에 배치하여 데이터의 영속성을 직접 관리해 주는 것이 가장 확실한 해결책입니다.