[swift] Swift에서 키체인을 사용하여 민감한 데이터 안전하게 저장하기

앱에서 민감한 데이터를 안전하게 저장하고 관리하기 위해 Swift에서 키체인을 사용할 수 있습니다. 키체인은 암호화된 형태로 데이터를 저장하여 앱의 보안을 강화할 수 있는 강력한 도구입니다. 이번 블로그에서는 Swift에서 키체인을 사용하는 방법에 대해 알아보겠습니다.

키체인에 접근하기

키체인은 iOS 및 macOS에서 동일한 개념으로 사용되며, Swift에서는 Security 프레임워크를 사용하여 키체인에 접근할 수 있습니다. 먼저, Security 프레임워크를 import 하겠습니다.

import Security

이제 키체인에 데이터를 저장하기 위해 SecItemAdd 함수를 사용할 수 있습니다. 예를 들어, 사용자의 비밀번호를 저장하려면 다음과 같이 코드를 작성할 수 있습니다.

let password = "myPassword".data(using: .utf8)
let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "myAccount",
    kSecValueData as String: password,
]

let status = SecItemAdd(query as CFDictionary, nil)
if status == errSecSuccess {
    print("비밀번호가 키체인에 저장되었습니다.")
} else {
    print("키체인에 데이터를 저장하는 데 실패했습니다.")
}

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

저장한 데이터를 가져오려면 SecItemCopyMatching 함수를 사용합니다. 예를 들어, 저장한 비밀번호를 가져오려면 다음과 같이 코드를 작성할 수 있습니다.

let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "myAccount",
    kSecReturnData as String: kCFBooleanTrue!,
    kSecMatchLimit as String: kSecMatchLimitOne
]

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

if status == errSecSuccess {
    if let passwordData = result as? Data {
        let password = String(data: passwordData, encoding: .utf8)
        print("저장한 비밀번호: \(password ?? "")")
    } else {
        print("비밀번호를 가져오는 데 실패했습니다.")
    }
} else {
    print("키체인에서 데이터를 가져오는 데 실패했습니다.")
}

키체인 데이터 업데이트 및 삭제하기

만약 이미 키체인에 데이터가 저장되어 있다면, SecItemUpdate 함수를 사용하여 데이터를 업데이트할 수 있습니다. 또한 데이터를 삭제하려면 SecItemDelete 함수를 사용할 수 있습니다. 예를 들어, 저장한 비밀번호를 업데이트하거나 삭제하려면 다음과 같은 코드를 작성할 수 있습니다.

let updateQuery: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "myAccount",
]

let updateAttributes: [String: Any] = [
    kSecValueData as String: "newPassword".data(using: .utf8)!
]

let status = SecItemUpdate(updateQuery as CFDictionary, updateAttributes as CFDictionary)

if status == errSecSuccess {
    print("비밀번호가 업데이트되었습니다.")
} else if status == errSecItemNotFound {
    print("해당하는 데이터가 키체인에 없습니다.")
} else {
    print("비밀번호 업데이트에 실패했습니다.")
}

// 데이터 삭제
let deleteQuery: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "myAccount",
]

let deleteStatus = SecItemDelete(deleteQuery as CFDictionary)

if deleteStatus == errSecSuccess {
    print("데이터가 삭제되었습니다.")
} else if deleteStatus == errSecItemNotFound {
    print("해당하는 데이터가 키체인에 없습니다.")
} else {
    print("데이터 삭제에 실패했습니다.")
}

요약

Swift에서 키체인을 사용하여 민감한 데이터를 안전하게 저장하는 방법에 대해 알아보았습니다. 키체인을 사용하면 암호화된 형태로 데이터를 저장하여 앱의 보안을 강화할 수 있습니다. 키체인에 저장된 데이터를 가져오고 업데이트 및 삭제하는 방법도 알아보았습니다. 앱에서 민감한 데이터를 다룰 때는 키체인을 적극적으로 활용하여 안전한 데이터 보호에 신경 쓰시기 바랍니다.

참고 자료