Android 앱에서 딥링크 호출 후 세션 유지가 안 될 때 체크할 것들

Android 앱에서 딥링크 호출 후 세션 유지가 안 될 때 체크할 것들

Android 딥링크 호출 시 세션이 초기화되는 이유와 해결 방법

모바일 앱 개발을 하다 보면 딥링크(Deep Link) 를 통해 다른 앱을 호출하고, 특정 데이터를 전달하는 경우가 많습니다. 그런데 앱에서 딥링크를 통해 API를 호출했을 때, 세션이 유지되지 않고 초기화되는 문제가 발생할 수 있습니다. "같은 앱에서 호출했는데 왜 세션이 바뀌었을까?" 라는 의문이 들 수 있는데요, 이번 글에서는 그 원인과 해결 방법을 정리해보겠습니다.

📌 문제 상황

  1. A 앱에서 B 앱을 딥링크로 호출하며 user_id를 전달함.
  2. B 앱user_id를 이용해 WAS에 init API를 호출하여 세션에 저장함.
  3. 이후, B 앱에서 저장된 user_id를 조회하기 위해 별도의 API를 호출했으나 세션이 유지되지 않음.
  4. WAS 로그를 확인해보니, init API 호출 시점의 세션 ID와 조회 시점의 세션 ID가 서로 다름.

🔍 원인 분석

1️⃣ WebView 또는 Chrome Custom Tabs 사용 시 세션이 분리됨

만약 B 앱이 WebView나 Chrome Custom Tabs에서 init API를 호출하고, 이후 네이티브 코드에서 API를 호출했다면 문제가 발생할 수 있습니다.

이유:

  • WebView와 네이티브 HTTP 클라이언트(OkHttp, Retrofit)는 각각 다른 쿠키 저장소를 사용함.
  • 즉, WebView에서 세션을 생성했더라도 네이티브 HTTP 클라이언트에서는 이를 인식하지 못함.

2️⃣ 앱 프로세스 종료 또는 분리 실행

  • Android는 메모리 관리 및 절전 정책 때문에 앱을 백그라운드로 보냈다가 다시 실행할 때, 프로세스를 종료하고 재시작할 수 있음.
  • 딥링크 실행 시 앱이 새로운 태스크(Task)로 실행되면 기존 세션 정보가 사라질 가능성이 있음.

3️⃣ 네이티브 HTTP 클라이언트에서 쿠키 저장 실패

  • WAS에서 세션을 유지하려면 Set-Cookie 헤더를 통해 JSESSIONID(또는 SESSION) 쿠키가 설정되어야 함.
  • 하지만 앱의 HTTP 클라이언트가 쿠키 저장을 처리하지 않으면, 이후 요청에서 세션이 유지되지 않음.

4️⃣ 딥링크 실행 방식에 따른 세션 컨텍스트 문제

  • AndroidManifest.xml의 android:taskAffinity 설정에 따라 앱이 새롭게 실행될 수도 있음.
  • 딥링크로 앱이 실행될 때 기존 인스턴스를 재사용하지 않으면 세션이 유지되지 않을 가능성이 있음.

5️⃣ WAS의 세션 유지 정책 문제

  • WAS 설정에서 session fixation 보안 설정이 활성화되어 있으면, 특정 조건에서 세션 ID가 변경될 수 있음.
  • SameSite=None 또는 Secure 쿠키 정책이 설정되지 않으면 WebView 또는 네이티브 클라이언트에서 세션을 유지하지 못할 수도 있음.

✅ 해결 방법

✔ 1. WebView에서 쿠키 공유 설정하기

WebView에서 네이티브와 동일한 쿠키를 사용하도록 설정하세요.

val cookieManager = CookieManager.getInstance()
cookieManager.setAcceptCookie(true)
cookieManager.setAcceptThirdPartyCookies(webView, true)

✔ 2. 네이티브 HTTP 클라이언트에서 쿠키 저장

OkHttp를 사용한다면 CookieJar를 설정하세요.

val client = OkHttpClient.Builder()
    .cookieJar(JavaNetCookieJar(CookieManager()))
    .build()

✔ 3. 딥링크 실행 방식 변경

AndroidManifest.xml에서 android:launchMode="singleTask" 또는 taskAffinity 설정을 조정하여 동일한 태스크에서 실행되도록 보장하세요.

<activity
    android:name=".YourActivity"
    android:launchMode="singleTask"
    android:taskAffinity="com.example.app" />

✔ 4. WAS의 세션 쿠키 설정 확인

WAS에서 응답 헤더를 점검하고 SameSite=None, Secure, HttpOnly 속성을 추가해야 합니다.

Set-Cookie: JSESSIONID=abc123; Path=/; Secure; HttpOnly; SameSite=None

✔ 5. 디버깅을 위해 세션 ID 로깅

API 호출 전후로 JSESSIONID 값을 로깅하여 세션이 유지되는지 확인하세요.

val sessionId = response.headers["Set-Cookie"]
Log.d("SESSION", "Current Session ID: $sessionId")

📌 결론

같은 앱에서 API를 호출했는데도 세션이 바뀌는 이유는 WebView와 네이티브 HTTP 클라이언트의 세션 관리 차이, 앱 태스크 구조, 쿠키 저장 문제, WAS 설정 때문일 가능성이 큽니다.

위 해결 방법을 적용하여 문제를 점검하고, 앱의 세션 관리가 정상적으로 동작하는지 확인하세요! 🚀

Comments