[swift] Swift에서 키체인에 데이터 저장하기

Swift에서 앱의 중요한 데이터를 안전하게 보관할 수 있는 방법 중 하나는 키체인(Keychain)을 사용하는 것입니다. 키체인은 암호화된 형태로 데이터를 저장할 수 있으며, 앱을 삭제해도 데이터가 남아있는 장점이 있습니다. 이번 포스트에서는 Swift에서 키체인에 데이터를 저장하는 방법에 대해 알아보겠습니다.

키체인 서비스 식별자 생성

먼저, 키체인에 데이터를 저장하기 위해 서비스 식별자를 생성해야 합니다. 서비스 식별자는 앱의 고유한 값이어야 하며, 앱 이름이나 Bundle Identifier를 사용할 수 있습니다.

let serviceIdentifier = "com.yourapp.appName"

Keychain에 데이터 저장하기

Keychain에 데이터를 저장하기 위해 다음과 같은 함수를 작성합니다.

import Security

func saveDataToKeychain(data: Data, forKey key: String) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: serviceIdentifier,
        kSecAttrAccount as String: key,
        kSecValueData as String: data
    ]

    let status = SecItemAdd(query as CFDictionary, nil)
    return status == errSecSuccess
}

위의 함수는 datakey에 해당하는 이름으로 키체인에 저장합니다.

Keychain에서 데이터 불러오기

Keychain에서 데이터를 불러오기 위해 다음과 같은 함수를 작성합니다.

func getDataFromKeychain(forKey key: String) -> Data? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: serviceIdentifier,
        kSecAttrAccount as String: key,
        kSecReturnData as String: true
    ]

    var result: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &result)

    if status == errSecSuccess {
        return result as? Data
    } else {
        return nil
    }
}

위의 함수는 key에 해당하는 이름의 데이터를 키체인에서 불러옵니다.

데이터 삭제하기

Keychain에서 데이터를 삭제하기 위해 다음과 같은 함수를 작성합니다.

func deleteDataFromKeychain(forKey key: String) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: serviceIdentifier,
        kSecAttrAccount as String: key
    ]

    let status = SecItemDelete(query as CFDictionary)
    return status == errSecSuccess
}

위의 함수는 key에 해당하는 데이터를 키체인에서 삭제합니다.

예제 사용

이제 작성한 함수를 사용하여 데이터를 키체인에 저장하고 불러오는 예제를 살펴보겠습니다.

let dataToSave = "Hello Keychain".data(using: .utf8)!
let key = "myDataKey"

let saveResult = saveDataToKeychain(data: dataToSave, forKey: key)
if saveResult {
    print("Data saved to keychain")
} else {
    print("Failed to save data to keychain")
}

let loadedData = getDataFromKeychain(forKey: key)
if let loadedData = loadedData {
    let loadedString = String(data: loadedData, encoding: .utf8)
    print("Data loaded from keychain: \(loadedString ?? "")")
} else {
    print("Data not found in keychain")
}

let deleteResult = deleteDataFromKeychain(forKey: key)
if deleteResult {
    print("Data deleted from keychain")
} else {
    print("Failed to delete data from keychain")
}

위의 예제를 실행하면 데이터를 키체인에 저장하고 불러오는 과정을 확인할 수 있습니다.

마무리

Swift에서 키체인을 사용하여 데이터를 안전하게 저장하는 방법에 대해 알아보았습니다. 키체인은 앱의 보안을 강화하기 위해 유용한 도구이므로, 중요한 데이터를 안전하게 보호해야 할 때 활용할 수 있습니다.