[swift] Swift에서 키체인을 사용하여 비밀번호 관리하기

앱에서 사용되는 사용자의 비밀번호를 안전하게 저장하고 관리하는 것은 매우 중요합니다. Swift에서는 키체인을 사용하여 비밀번호와 같은 중요한 정보를 안전하게 저장하고 관리할 수 있습니다. 이 글에서는 Swift에서 키체인을 사용하는 방법에 대해 알아보겠습니다.

1. 키체인에 값 저장하기

먼저, 사용자의 비밀번호를 키체인에 저장하는 방법을 알아보겠습니다. 이를 위해 Security 프레임워크를 사용합니다. 아래의 예제 코드는 setPassword(_:forService:account:) 함수를 사용하여 비밀번호를 키체인에 저장하는 방법을 보여줍니다.

import Foundation
import Security

func setPassword(_ password: String, forService service: String, account: String) {
    let passwordData = password.data(using: .utf8)!
    
    let addQuery: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: account,
        kSecValueData as String: passwordData
    ]
    
    let status = SecItemAdd(addQuery as CFDictionary, nil)
    guard status == errSecSuccess else {
        print("Failed to save password to keychain")
        return
    }
    
    print("Password saved to keychain")
}

위의 코드에서 setPassword(_:forService:account:) 함수는 세 개의 매개변수를 받습니다. 첫 번째 매개변수는 저장할 비밀번호입니다. 두 번째 매개변수는 해당 비밀번호를 사용하는 서비스를 나타내는 식별자입니다. 세 번째 매개변수는 계정을 나타내는 식별자입니다.

2. 키체인에서 값 불러오기

이제, 키체인에서 저장된 비밀번호를 불러오는 방법에 대해 알아보겠습니다. getPassword(forService:account:) 함수를 사용하여 키체인에서 비밀번호를 불러올 수 있습니다. 아래의 예제 코드를 참고하세요.

import Foundation
import Security

func getPassword(forService service: String, account: String) -> String? {
    let getQuery: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: account,
        kSecReturnData as String: true
    ]
    
    var passwordData: AnyObject?
    let status = SecItemCopyMatching(getQuery as CFDictionary, &passwordData)
    guard status == errSecSuccess else {
        print("Failed to retrieve password from keychain")
        return nil
    }
    
    if let passwordData = passwordData as? Data,
       let password = String(data: passwordData, encoding: .utf8) {
        return password
    } else {
        return nil
    }
}

getPassword(forService:account:) 함수는 두 개의 매개변수를 받습니다. 첫 번째 매개변수는 서비스 식별자이고, 두 번째 매개변수는 계정 식별자입니다. 함수는 해당 서비스와 계정에 저장된 비밀번호를 반환합니다.

3. 키체인에서 값 삭제하기

키체인에서 저장된 비밀번호를 삭제해야 하는 경우 deletePassword(forService:account:) 함수를 사용할 수 있습니다. 아래의 예제 코드를 참고하세요.

import Foundation
import Security

func deletePassword(forService service: String, account: String) {
    let deleteQuery: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: account
    ]
    
    let status = SecItemDelete(deleteQuery as CFDictionary)
    guard status == errSecSuccess || status == errSecItemNotFound else {
        print("Failed to delete password from keychain")
        return
    }
    
    print("Password deleted from keychain")
}

위의 코드에서 deletePassword(forService:account:) 함수는 두 개의 매개변수를 받습니다. 첫 번째 매개변수는 서비스 식별자이고, 두 번째 매개변수는 계정 식별자입니다. 함수는 해당 서비스와 계정에 저장된 비밀번호를 삭제합니다.

결론

이제 Swift에서 비밀번호와 같은 중요한 정보를 안전하게 저장하고 관리하는 방법에 대해 알아보았습니다. 키체인을 사용하면 사용자의 중요한 정보를 안전하게 저장할 수 있으며, 다른 앱이나 시스템에서의 무단 접근으로부터 보호할 수 있습니다.

더 자세한 내용은 Apple Developer Documentation을 참고하시기 바랍니다.