[Flutter] 네이티브 SDK → kakao_flutter_sdk 마이그레이션 시 기존 사용자 토큰 유지 방법 문의

문의 시 사용하시는 SDK 버전 정보와 플랫폼(Android / iOS) 및 디벨로퍼스 앱ID를 알려주세요.

앱 ID : 18663


안녕하세요. 운영 중인 앱의 SDK 전환과 관련하여 공식 가이드를 문의드립니다.

현재 상황

  • 기존: 네이티브 앱 (Android Kakao SDK / iOS Kakao SDK) 운영 중
  • 변경: Flutter로 리뉴얼하면서 kakao_flutter_sdk로 전환
  • packageName / BundleID 동일하게 유지하여 앱 업데이트 형태로 배포 예정

문제

앱 업데이트 후, 기존 네이티브 SDK가 저장한 토큰을 kakao_flutter_sdk가 읽지 못해 모든 사용자가 로그아웃 상태로 인식되는 것을 확인했습니다.
(저장소 키 네임스페이스가 서로 달라 발생하는 것으로 보입니다.)

문의 사항

  1. 네이티브 SDK → kakao_flutter_sdk로 전환 시 기존 사용자 토큰을 유지할 수 있는 공식 가이드가 있는지 궁금합니다.

  2. 가능한 경우, 아래 방식 중 권장되는 방법이 있는지 알려주실 수 있을까요?
    (a) 네이티브 SDK의 TokenManager.getToken() 으로 토큰을 읽고, MethodChannel로 Flutter에 전달하여 kakao_flutter_sdk의 setToken()으로 주입
    (b) 서버에 refresh_token을 사전 보관 후 갱신
    (c) 그 외 카카오에서 권장하는 방법

  3. (a) 방식을 적용할 경우, 동일 앱 내에 네이티브 SDK와 kakao_flutter_sdk를 함께 포함해도 정책상 / 기술상 문제가 없는지 확인 부탁드립니다.
    (manifest 또는 URL scheme 충돌 여부 포함)

  4. 위 방법이 모두 어렵다면, 사용자에게 재로그인을 안내하는 것이 공식 권장 사항인지 확인 부탁드립니다.

운영 중인 서비스라 사용자 영향이 커 신중하게 결정하고자 합니다.
공식 답변 부탁드리겠습니다. 감사합니다.

안녕하세요.

확인을 위해 앱 ID 부탁드립니다.


앱ID
https://developers.kakao.com/console/app 에 표시되는 ID 값 입니다.
숫자로된 ID 입니다
ex) 123456

안녕하세요. 카카오SDK 담당자입니다.

말씀주신 상황 이해했고, 결론부터 말씀드리면 마이그레이션은 어려울 것 같고, 사용자 경험이 많이 떨어지겠지만 재로그인을 안내하는 것이 현실적인 방안으로 보입니다.

아래는 문의주신 내용들에 대한 답변입니다.

  1. 네이티브 SDK → kakao_flutter_sdk로 전환 시 기존 사용자 토큰을 유지할 수 있는 공식 가이드가 있는지 궁금합니다.

→ 지금까지는 이렇게 마이그레이션하려는 문의는 들어온 적이 없었고, SDK도 당연히 이러한 케이스에 대한 고려가 되어있지 않습니다. 따라서 공식 가이드는 존재하지 않습니다.

  1. 가능한 경우, 아래 방식 중 권장되는 방법이 있는지 알려주실 수 있을까요?

→ 여러 가지 방법들을 말씀주셨는데, (a) 방식으로 android / ios용 SDK와 플러터용 SDK를 동시에 사용하는 경우 예상치 못한 동작이 발생할 수 있기 때문에 URL 스킴의 충돌로 정상적으로 동작하지 않을 것으로 보입니다.

토큰을 마이그레이션하려면 결국 android / ios용 SDK에서 토큰 객체를 가져오고, 해당 객체를 플러터용 SDK에 맞는 형태로 변환해서 저장해야할텐데요, SDK 내부 구현 상 두 개의 SDK의 동시에 사용하면 정상적인 동작을 보장할 수 없기 때문에 토큰을 마이그레이션하는게 현실적으로 불가능해보입니다.

현실성을 고려하지 않고, 단순히 기술적으로 마이그레이션이 가능한지에 대해서만 답변을 드리자면 android / ios용 SDK에 저장된 토큰 객체를 서버에서 내려온 원본 형태의 json 형태로 변환하고, 이를 플러터용 SDK의 OAuthToken 객체로 변환시킨 후 setToken() 으로 저장하면 정상적으로 동작할 것으로 보입니다. 하지만 위에서 언급했듯이 두 개의 SDK의 동시에 사용하면 다른 기능들에서 정상적인 동작을 보장할 수 없기 때문에 이미 유저에게 배포된 앱이 기존 android / ios용 SDK에서 가져온 토큰을 플러터용 SDK에 저장하는 것이 불가능하다고 판단했고, 그로 인해 마이그레이션은 불가능하다고 답변드린 점 참고드리겠습니다.

참고)
json 토큰 샘플

{
	"access_token":"p5EVPdPNGF_Glu9R7VKw4uvsBnOGFRbrAAAAAQoXC2sAAAGeBsM2uAVUwjIHKObK",
	"token_type":"bearer",
	"refresh_token":"--jc6987Zi8f1XTTK2qNCYlk2-Ygq2tYAAAAAgoXC2sAAAGeBsM2sgVUwjIHKObK",
	"expires_in":43199,
	"scope":"age_range birthday account_email gender",
	"refresh_token_expires_in":5183999,
}

android용 SDK 토큰 객체 샘플

OAuthToken(
	accessToken=kPgkDQd1kNYCLU8CPgVeUCTgrj6LYffEAAAAAQoNIJsAAAGeBrmu9AVUwjIHKObK,
	accessTokenExpiresAt=Sat May 09 05:34:51 GMT+09:00 2026,
	refreshToken=Qvaj7bFhJ-oOGMZOhlmnOOd8oucww5jTAAAAAgoNIJsAAAGeBrmu8QVUwjIHKObK,
	refreshTokenExpiresAt=Tue Jul 07 17:34:51 GMT+09:00 2026,
	idToken=null,
	scopes=[age_range, birthday, account_email, gender]
)

iOS SDK 토큰 객체 샘플

OAuthToken(
	tokenType: "bearer",
	accessToken: "Nmo0UMGbrj4nu-2hLsHy9YL_NhL0MmKMAAAAAQoNIFoAAAGeBqRLzAVUwjIHKObK",
	expiresIn: 43199.0,
	expiredAt: 2026-05-08 20:11:30 +0000,
	refreshToken: "uJst_T2sfaPzRJ-BB-HaCpeKMV6ooW7qAAAAAgoNIFoAAAGeBqRLygVUwjIHKObK",
	refreshTokenExpiresIn: 5183999.0,
	refreshTokenExpiredAt: 2026-07-07 08:11:30 +0000,
	scope: Optional("age_range birthday account_email gender"),
	scopes: Optional(["age_range", "birthday", "account_email", "gender"]),
	idToken: nil
)