[swift] Swift에서 키체인을 사용하여 암호화된 데이터 동기화하기

암호화된 데이터를 안전하게 저장하고 동기화하기 위해 Swift에서 키체인을 사용하는 방법을 알아보겠습니다. 키체인은 iOS 및 macOS에서 사용자의 기밀 정보를 보호하기 위해 제공되는 안전한 저장소입니다.

1. Keychain Access Framework 추가

먼저 프로젝트에 Keychain Access Framework를 추가해야 합니다. 이를 위해 프로젝트 설정에서 “Build Phases” 탭으로 이동하고 “Link Binary With Libraries”를 클릭한 다음 Security.framework을 추가하세요.

2. 키체인에 데이터 저장

키체인에 데이터를 저장하기 위해 다음 코드를 사용할 수 있습니다.

import Foundation
import Security

func saveDataToKeychain(data: Data, service: String, account: String) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword as String,
        kSecAttrService as String: service,
        kSecAttrAccount as String : account,
        kSecValueData as String: data
    ]
    
    let status = SecItemAdd(query as CFDictionary, nil)
    return status == errSecSuccess
}

이 코드는 saveDataToKeychain 함수를 정의합니다. 이 함수는 data 매개변수로 전달된 데이터를 serviceaccount 매개변수로 지정된 식별 정보와 함께 키체인에 저장합니다. 저장이 성공하면 true를 반환하고, 실패하면 false를 반환합니다.

3. 키체인에서 데이터 가져오기

저장된 데이터를 키체인에서 가져오기 위해 다음 코드를 사용할 수 있습니다.

import Foundation
import Security

func fetchDataFromKeychain(service: String, account: String) -> Data? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String : account,
        kSecReturnData as String : kCFBooleanTrue!,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    
    var dataTypeRef: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
    
    if status == errSecSuccess {
        return dataTypeRef as? Data
    } else {
        return nil
    }
}

이 코드는 fetchDataFromKeychain 함수를 정의합니다. 이 함수는 serviceaccount 매개변수로 지정된 식별 정보를 사용하여 키체인에서 데이터를 검색하고 반환합니다. 데이터가 존재하지 않는 경우 nil을 반환합니다.

4. 데이터 업데이트 및 삭제

키체인에서 데이터를 업데이트하거나 삭제하기 위해서는 다음과 같은 코드를 사용할 수 있습니다.

import Foundation
import Security

func updateDataInKeychain(data: Data, service: String, account: String) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword as String,
        kSecAttrService as String: service,
        kSecAttrAccount as String : account
    ]
    
    let attributes: [String: Any] = [
        kSecValueData as String: data
    ]
    
    let status = SecItemUpdate(query as CFDictionary, attributes as CFDictionary)
    return status == errSecSuccess
}

func deleteDataFromKeychain(service: String, account: String) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword as String,
        kSecAttrService as String: service,
        kSecAttrAccount as String : account
    ]
    
    let status = SecItemDelete(query as CFDictionary)
    return status == errSecSuccess
}

updateDataInKeychain 함수는 키체인에서 데이터를 업데이트하는 데 사용됩니다. deleteDataFromKeychain 함수는 키체인에서 데이터를 삭제하는 데 사용됩니다. 이 함수들은 serviceaccount 매개변수로 지정된 식별 정보를 사용하여 해당하는 데이터를 업데이트하거나 삭제합니다.

결론

Swift에서 키체인을 사용하여 암호화된 데이터를 안전하게 저장하고 동기화하는 방법을 알아보았습니다. 키체인은 사용자의 기밀 정보를 보호하는 데 매우 유용한 도구입니다. 앱에 보안 기능을 구현할 때 키체인을 사용해보세요.

참고 자료