안녕하세요. 카카오SDK 담당자입니다.
말씀주신 상황 이해했고, 결론부터 말씀드리면 마이그레이션은 어려울 것 같고, 사용자 경험이 많이 떨어지겠지만 재로그인을 안내하는 것이 현실적인 방안으로 보입니다.
아래는 문의주신 내용들에 대한 답변입니다.
- 네이티브 SDK → kakao_flutter_sdk로 전환 시 기존 사용자 토큰을 유지할 수 있는 공식 가이드가 있는지 궁금합니다.
→ 지금까지는 이렇게 마이그레이션하려는 문의는 들어온 적이 없었고, SDK도 당연히 이러한 케이스에 대한 고려가 되어있지 않습니다. 따라서 공식 가이드는 존재하지 않습니다.
- 가능한 경우, 아래 방식 중 권장되는 방법이 있는지 알려주실 수 있을까요?
→ 여러 가지 방법들을 말씀주셨는데, (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
)