앱을 운영하다 보면 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()를 적재적소에 배치하여 데이터의 영속성을 직접 관리해 주는 것이 가장 확실한 해결책입니다.
'Computer > Android&iOS' 카테고리의 다른 글
| [Android] 인앱 정기결제 아이템 의미 (0) | 2025.12.02 |
|---|---|
| Android WebViewAssetLoader: 안전하고 효율적인 로컬 리소스 로딩 (0) | 2025.10.22 |
| KMP (CMP) 프로젝트 init (0) | 2025.10.17 |
| Android Gradle 빌드 에러 해결: Duplicate class org.jetbrains.annotations (0) | 2025.10.13 |
| Android studio 단축키 모음집 (0) | 2025.10.10 |