앱이 설치되있고 카카오 로그인이 된 상태에서, 그 위에 앱 업데이트가 이루어지면, 토큰을 블러오지 못하고, 로그인이 풀립니다

문의 시 사용하시는 SDK 버전 정보를 알려주세요.
사용 버젼:
pod ‘RxKakaoSDKCommon’, ‘~> 2.6.0’
pod ‘RxKakaoSDKAuth’, ‘~> 2.6.0’
pod ‘RxKakaoSDKUser’, ‘~> 2.6.0’
pod ‘RxKakaoSDKLink’, ‘~> 2.6.0’

===========
해당 버전의 sdk의 Properties.swift 파일에서
image

public class Properties {
static let sdkVersionKey = "com.kakao.sdk.version"

public static func saveCodable<T: Codable>(key: String, data:T?) {
    if let encoded = try? JSONEncoder().encode(data) {
        SdkLog.d("save-plain : \(encoded as NSData)")
        guard let crypted = SdkCrypto.shared.encrypt(data: encoded) else { return }
        SdkLog.d("save-crypted : \(crypted as NSData)")
        UserDefaults.standard.set(crypted, forKey:key)
        UserDefaults.standard.synchronize()
    }
}

public static func loadCodable<T: Codable>(key: String) -> T? {
    if let data = UserDefaults.standard.data(forKey: key) {
        SdkLog.d("load-crypted : \(data as NSData)")
        guard let plain = SdkCrypto.shared.decrypt(data: data) else { return nil }
        SdkLog.d("load-plain : \(plain as NSData)")
        
        do {
            return try JSONDecoder().decode(T.self, from:plain)
        } catch {
            print("error occured while decoding to OAuthToken: \(error.localizedDescription)")  // T: OAuthToken
            // error occured while decoding to OAuthToken: 올바른 포맷이 아니기 때문에 해당 데이터를 읽을 수 없습니다.
            return nil
        }
        //return try? JSONDecoder().decode(T.self, from:plain)
    }
    
    return nil
  }
}

SDK에서 userdefault에 “com.kakao.sdk.version” 키에 암호화 하여 OAuthToken을 저장하는 것으로 알고 있는데요. 앱이 설치되고 로그인 된 채로, 업데이트가 이루지면, loadCodable() 부분에서 다시 "com.kakao.sdk.version"키에 암호화되어 저장된 값을 decode하여 OAuthToken 변환할 때, try JSONDecoder().decode(T.self, from:plain) 에서 <올바른 포맷이 아니기 때문에 해당 데이터를 읽을 수 없습니다> 라는 에러가 발생하면서, 디코딩이 실패하여 TokenManager의 token으로 다시 불러오지 못하고, 따라서 카카오 로그인이 풀리고 있습니다.

하지만, 로그인이 된채로 앱 업데이트가 될 때, 카카오 로그인이 해제되는 것은 정상적인 작동이 아닌 것 같은데,
혹시 제가 잘못파악한 게 있거나, 다른 해결책이 있을지 궁금합니다.

해당 현상 다음의 기기/OS 환경에서 간헐적으로 발생하고 있습니다 :

  1. iPhone Xs Max / iOS15.1
  2. iPhone 12 Pro Max / iOS 15.1
  3. iPad7 / iPadOS 14.7.1

안녕하세요~
확인을 위해 앱 ID 알려주세요~


앱ID
https://developers.kakao.com/ 의 내 애플리케이션>앱 설정>요약 정보 : 기본정보에 있는 앱 ID
숫자로된 ID 입니다~
ex) 123456

1개의 좋아요

17313
입니다

안녕하세요
테스트환경도 좀 알려주시겠어요?

혹시 테스트플라이트 환경에서 테스트 하신걸까요?

  1. 마켓버전 → 파이어베이스 앱 디스트리뷰션 버전
  2. 파이어베이스 앱 디스트리뷰션 버전 → 파이어베이스 앱 디스트리뷰션 버전

이렇게 업데이트 진행했습니다.

안녕하세요

파이어베이스 앱 디스트리뷰션 환경을 사용해보질 않아서 잘 모르겠는데요.
구글링을 해보니 테스트플라이트 대신에 테스트 배포환경으로 사용한다고 되어있네요.

테스트용도로 배포하는 앱인지요?

먼저 테스트플라이트 배포앱에서는 위와같은 현상이 생길수 있습니다.
참고)Does the 'identifierForVendor.uuid… | Apple Developer Forums

토큰 암호화에 사용하는 암호키 seed로 vender Id를 사용하고 있는데요. (UIDevice.current.identifierForVendor?.uuidString)
테스트플라이트 앱에서는 vender_Id 가 마켓버전과 달라져서 마켓버전에서 암호화한 토큰을 복호화 할 수가 없습니다.

아래 각각의 앱에서 직접 한번 테스트 해보시는게 좋을거같아요.
UIDevice.current.identifierForVendor?.uuidString 를 찍어보고 이것이 어떻게 변경되는지…

  • 디바이스에 직접설치한앱 (마켓버전을 배포하는 계정의 개발프로비저닝으로 설치했을경우 - 벤더아이디 동일)
  • 테스트플라이트로 배포한앱 (벤더아이디 달라짐)
  • 파이어베이스 디스트리뷰션으로 배포한 앱 (??? - 테스트 해보시고 공유 부탁드려요)

해당현상은 벤더아이디가 달라질때 생기는 현상이라서 예상컨대 아마 달라질것같습니다.

참고) 실제 배포되는 마켓버전에는 애플문서상 같은앱으로 업데이트할 경우 vender_Id는 바뀔수가 없습니다.
https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor

1개의 좋아요

넵 테스트 플라이트와 유사한 테스트 용도입니다. 답변 감사합니다! 내일 써주신 글 한 번 확인해보고 답장 드리겠습니다

토큰 암호화에 사용하는 암호키 seed로 vender Id를 사용하는 것은
최근 SDK에서도 동일하나요?

네 동일합니다.

테스트 해본 결과 벤더ID에 대한 이슈로 확인되었습니다. 지원 감사드립니다. 테스트 결과 추후 참고를 위해 공유드립니다.
https://bit.ly/3qqQhVT

, , SDK ?

안녕하세요. 테스트공유 감사드립니다.
해당이슈는 실사용에서 발생하는 이슈가 아니고 테스트 배포에서만 발생하고 있어서 현재까지 대안은 생각하지 않고 있습니다.

팀내에서 키체인등으로 저장소 변경 관련해서 몇번 논의는 되었지만 현재방식이 아래 암호화 목적에 부합하는 최소의 방법을 적용한것이며 대부분 QA시에만 발생해서 해당이슈는 known issue로 판단하고 있습니다.

혹시 테스트배포를 다른목적으로 사용하시는것일까요?

참고로 말씀드리면 저희 sdk 토큰 암호화의 목적은

  • (공통으로 사용하는 저장소를 사용하므로) 플레인 토큰 노출방지
  • 디바이스간 무분별한 복제사용 방지

입니다.