[swift] Swift에서 키체인을 사용하여 설정값 백업 및 복원하기

앱의 설정값을 저장하고 복원하기 위해 iOS에서 흔히 사용되는 방법 중 하나는 키체인(Keychain)을 이용하는 것입니다. 키체인은 보안을 위해 디바이스에 데이터를 안전하게 저장하는 용도로 사용됩니다. 이번 블로그 포스트에서는 Swift에서 키체인을 사용하여 설정값을 백업하고 복원하는 방법에 대해 알아보겠습니다.

키체인에 값 저장하기

import Foundation
import Security

func saveValueToKeychain(value: String, forKey key: String) {
    let valueData = value.data(using: .utf8)

    guard let serviceIdentifier = Bundle.main.bundleIdentifier else {
        return
    }
    
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: serviceIdentifier,
        kSecAttrAccount as String: key,
        kSecValueData as String: valueData,
    ]
    
    SecItemDelete(query as CFDictionary)
    
    let status = SecItemAdd(query as CFDictionary, nil)
    if status != errSecSuccess {
        print("Failed to save value to Keychain")
    }
}

위의 코드는 saveValueToKeychain이라는 함수를 정의합니다. 이 함수는 원하는 값을 키체인에 저장하는 역할을 합니다. 주어진 키와 값으로 query 딕셔너리를 만들고, SecItemDelete를 사용하여 이미 저장된 값이 있다면 삭제한 후 SecItemAdd를 통해 새로운 값으로 저장합니다. 저장에 실패한 경우 오류 메시지를 출력합니다.

키체인에서 값 복원하기

import Foundation
import Security

func getValueFromKeychain(forKey key: String) -> String? {
    guard let serviceIdentifier = Bundle.main.bundleIdentifier else {
        return nil
    }
    
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: serviceIdentifier,
        kSecAttrAccount as String: key,
        kSecMatchLimit as String: kSecMatchLimitOne,
        kSecReturnData as String: true,
    ]
    
    var result: CFTypeRef?
    let status = SecItemCopyMatching(query as CFDictionary, &result)
    
    if status == errSecSuccess, let data = result as? Data, let value = String(data: data, encoding: .utf8) {
        return value
    }
    
    return nil
}

위의 코드는 getValueFromKeychain이라는 함수를 정의합니다. 이 함수는 주어진 키에 대한 값을 키체인에서 찾아서 반환합니다. query 딕셔너리를 만들고, SecItemCopyMatching을 사용하여 키체인에서 값을 찾습니다. 찾은 값이 있다면 이를 데이터로 변환하여 반환하며, 값이 없거나 찾는 과정에서 오류가 발생한 경우 nil을 반환합니다.

사용 예시

let key = "userToken"
let userToken = "XYZ123"

saveValueToKeychain(value: userToken, forKey: key)

if let retrievedToken = getValueFromKeychain(forKey: key) {
    print("Retrieved token: \(retrievedToken)")
} else {
    print("Token not found in Keychain")
}

위의 예시 코드는 saveValueToKeychain 함수를 사용하여 userTokenkey에 대해 키체인에 저장하고, getValueFromKeychain 함수를 사용하여 key에 저장된 값을 가져와 출력합니다.

키체인을 사용하여 설정값을 백업하고 복원하는 것은 앱의 설정을 안전하게 관리하고 사용자 데이터를 보호하는 데 매우 유용합니다. 키체인은 iOS 앱 개발에서 자주 사용되는 보안 메커니즘 중 하나이므로 앱의 설정값을 안전하게 보관하기 위해 꼭 사용해보시기 바랍니다.

참고 자료