[swift] Swift에서 키체인을 사용하여 디바이스 고유 번호 저장하기

앱 개발에서 디바이스의 고유 번호는 유용한 정보입니다. 이를 활용하여 각 디바이스를 식별하고 사용자 경험을 개선할 수 있습니다. 하지만 사용자가 앱을 삭제하고 다시 설치하거나, 디바이스를 변경하면 고유 번호를 잃어버릴 수 있습니다. 이러한 문제를 해결하기 위해 Swift에서는 Keychain을 사용하여 디바이스의 고유 번호를 안전하게 저장할 수 있습니다.

Keychain에 접근하기

Keychain을 사용하기 위해 Security 프레임워크를 import 해야합니다. 다음 코드를 사용하여 Keychain에 액세스할 수 있습니다.

import Security

고유 번호 생성하기

디바이스의 고유 번호는 UUID (Universally Unique Identifier)를 사용하여 생성할 수 있습니다. UUID는 고유한 128 비트 값으로, 디바이스 및 앱 간의 식별자로 사용될 수 있습니다. 다음 코드를 사용하여 UUID를 생성할 수 있습니다.

let uuid = UUID().uuidString

Keychain에 고유 번호 저장하기

고유 번호를 생성한 후, 이를 Keychain에 저장해야 합니다. Keychain에 값을 저장하려면 SecItemAdd 함수를 사용해야 합니다. 다음 코드를 사용하여 고유 번호를 Keychain에 저장할 수 있습니다.

let serviceName = "com.example.myapp"
let accountName = "uniqueDeviceID"

if let data = uuid.data(using: .utf8) {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: serviceName,
        kSecAttrAccount as String: accountName,
        kSecValueData as String: data
    ]
    let status = SecItemAdd(query as CFDictionary, nil)
    if status == errSecSuccess {
        print("고유 번호가 Keychain에 저장되었습니다.")
    } else {
        print("Keychain에 고유 번호를 저장하는 데 실패했습니다.")
    }
}

Keychain에서 고유 번호 가져오기

Keychain에 저장된 고유 번호를 가져오려면 SecItemCopyMatching 함수를 사용해야 합니다. 다음 코드를 사용하여 Keychain에서 고유 번호를 가져올 수 있습니다.

let serviceName = "com.example.myapp"
let accountName = "uniqueDeviceID"

let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: serviceName,
    kSecAttrAccount as String: accountName,
    kSecReturnData as String: true
]
var result: AnyObject?
let status = SecItemCopyMatching(query as CFDictionary, &result)

if status == errSecSuccess, let data = result as? Data, let id = String(data: data, encoding: .utf8) {
    print("고유 번호: \(id)")
} else {
    print("Keychain에서 고유 번호를 가져오는 데 실패했습니다.")
}

요약

이렇게 Swift에서 Keychain을 사용하여 디바이스의 고유 번호를 안전하게 저장할 수 있습니다. Keychain은 고유 번호를 신뢰할 수 있는 방식으로 관리하며, 사용자가 앱을 삭제하거나 디바이스를 변경해도 계속해서 사용할 수 있습니다. 따라서 이를 활용하여 사용자 경험을 개선하고 개인화된 기능을 제공할 수 있습니다.

참고 자료