[swift] Swift에서 키체인을 사용하여 앱 접근 권한 관리하기

앱 개발을 하다보면 사용자의 개인 정보를 안전하게 저장하고 관리하기 위해 키체인을 사용해야하는 경우가 있습니다. 이번에는 Swift에서 키체인을 사용하여 앱의 접근 권한을 관리하는 방법에 대해 알아보겠습니다.

1. 키체인에 데이터 저장하기

키체인에 데이터를 저장하기 위해서는 Security 프레임워크를 import해야합니다. 아래의 코드를 사용하여 키체인에 값을 저장하는 함수를 만들 수 있습니다.

import Security

func saveDataToKeychain(value: String, forKey key: String) {
    let valueData = value.data(using: .utf8)
    
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword as String,
        kSecAttrAccount as String: key,
        kSecValueData as String: valueData!,
        kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked as String
    ]
    
    let resultCode = SecItemAdd(query as CFDictionary, nil)
    
    if resultCode != errSecSuccess {
        print("Failed to save data to keychain. Error code: \(resultCode)")
    }
}

위의 함수는 valuekey를 인자로 받아서 키체인에 값을 저장하는 역할을 합니다. kSecValueData 키에 데이터를 kSecAttrAccountkSecAttrAccessible 키를 이용하여 저장합니다. 저장할 때에는 SecItemAdd 함수를 사용하며, 저장이 실패한 경우에는 에러 코드를 출력합니다.

2. 키체인에서 데이터 불러오기

이번에는 키체인에서 데이터를 불러오기 위한 함수를 만들어보겠습니다. 아래의 코드를 사용하여 키체인에서 값을 불러오는 함수를 만들 수 있습니다.

func loadDataFromKeychain(forKey key: String) -> String? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: key,
        kSecReturnData as String: true,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    
    var item: CFTypeRef?
    
    let resultCode = SecItemCopyMatching(query as CFDictionary, &item)
    
    if resultCode != errSecSuccess {
        print("Failed to load data from keychain. Error code: \(resultCode)")
        return nil
    }
    
    guard let itemData = item as? Data, let itemValue = String(data: itemData, encoding: .utf8) else {
        return nil
    }
    
    return itemValue
}

위의 함수는 key를 인자로 받아서 키체인에서 값을 불러오는 역할을 합니다. kSecReturnData 키를 true로 설정하여 값을 반환하도록 합니다. 불러올 때에는 SecItemCopyMatching 함수를 사용하며, 불러오기가 실패한 경우에는 에러 코드를 출력하고 nil을 반환합니다.

3. 키체인에서 데이터 삭제하기

마지막으로 키체인에서 데이터를 삭제하는 함수를 만들어보겠습니다. 아래의 코드를 사용하여 키체인에서 값을 삭제하는 함수를 만들 수 있습니다.

func deleteDataFromKeychain(forKey key: String) {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: key
    ]
    
    let resultCode = SecItemDelete(query as CFDictionary)
    
    if resultCode != errSecSuccess {
        print("Failed to delete data from keychain. Error code: \(resultCode)")
    }
}

위의 함수는 key를 인자로 받아서 키체인에서 값을 삭제하는 역할을 합니다. 삭제할 때에는 SecItemDelete 함수를 사용하며, 삭제가 실패한 경우에는 에러 코드를 출력합니다.

결론

Swift에서 키체인을 사용하여 앱의 접근 권한을 관리하는 방법에 대해 알아보았습니다. 키체인을 사용하면 앱에서 사용자의 개인 정보를 안전하게 저장하고 관리할 수 있으니, 앱 개발 시에는 키체인을 적극적으로 활용해보세요.