Android 딥링크 호출 시 세션이 초기화되는 이유와 해결 방법
모바일 앱 개발을 하다 보면 딥링크(Deep Link) 를 통해 다른
앱을 호출하고, 특정 데이터를 전달하는 경우가 많습니다. 그런데 앱에서
딥링크를 통해 API를 호출했을 때, 세션이 유지되지 않고 초기화되는 문제가
발생할 수 있습니다. "같은 앱에서 호출했는데 왜 세션이 바뀌었을까?" 라는
의문이 들 수 있는데요, 이번 글에서는 그 원인과 해결 방법을 정리해보겠습니다.
📌 문제 상황
-
A 앱에서 B 앱을 딥링크로 호출하며
user_id
를 전달함. -
B 앱이
user_id
를 이용해 WAS에init API
를 호출하여 세션에 저장함. -
이후, B 앱에서 저장된
user_id
를 조회하기 위해 별도의 API를 호출했으나 세션이 유지되지 않음. -
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
Post a Comment