[swift] Swift에서 키체인을 사용하여 사용자 지문 인식 정보 저장하기

iOS 기기에서 사용자 지문 인식은 매우 편리한 기능이지만, 앱 개발자는 사용자의 개인정보를 보호해야 합니다. 이를 위해 Swift에서 키체인을 사용하여 사용자 지문 인식 정보를 안전하게 저장하는 방법을 알아보겠습니다.

1. 키체인 접근 준비하기

첫째로, 프로젝트를 만들고 키체인에 접근하기 위해 사용할 Security.framework을 추가해야 합니다. 이를 위해 프로젝트 탐색기에서 프로젝트를 선택한 뒤, “Build Phases” 탭을 열고 “Link Binary With Libraries” 옵션에서 “+ 버튼”을 클릭하여 Security.framework을 추가합니다.

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

키체인에 데이터를 저장하기 위해서는 키체인에 저장할 값을 바이트 배열로 변환해야 합니다. Swift에서 이를 위해 NSData 객체를 사용할 수 있습니다. 아래는 사용자 지문 정보를 키체인에 저장하는 예제 코드입니다.

import UIKit
import LocalAuthentication

class ViewController: UIViewController {

    let keychainIdentifier = "com.example.app.fingerprintData"

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let fingerPrintData = "exampleFingerprintData" // 저장할 사용자 지문 정보
        let data = fingerPrintData.data(using: .utf8)
        
        // 키체인에 데이터 저장
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: keychainIdentifier,
            kSecValueData as String: data!,
            kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
        ]
        
        let status = SecItemAdd(query as CFDictionary, nil)
        if status != errSecSuccess {
            print("Failed to save fingerprint data to keychain")
        } else {
            print("Fingerprint data saved successfully")
        }
    }
}

위 코드에서는 keychainIdentifier라는 고유한 식별자를 사용하여 키체인에 데이터를 저장합니다. fingerPrintData 변수에는 저장할 사용자 지문 정보가 들어가며, data(using: .utf8)를 통해 데이터를 NSData로 변환합니다. 그리고 kSecClass, kSecAttrAccount, kSecValueData, kSecAttrAccessible 등의 속성을 설정하여 키체인에 데이터를 추가합니다.

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

키체인에 저장된 데이터를 가져오기 위해서는 키체인에서 데이터를 조회해야 합니다. 아래는 키체인에서 데이터를 조회하는 예제 코드입니다.

import UIKit
import LocalAuthentication

class ViewController: UIViewController {

    let keychainIdentifier = "com.example.app.fingerprintData"

    override func viewDidLoad() {
        super.viewDidLoad()

        // 키체인에서 데이터 조회
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: keychainIdentifier,
            kSecMatchLimit as String: kSecMatchLimitOne,
            kSecReturnData as String: true
        ]

        var result: AnyObject?
        let status = SecItemCopyMatching(query as CFDictionary, &result)
        if status == errSecSuccess,
            let data = result as? Data,
            let fingerprintData = String(data: data, encoding: .utf8) {
            print("Fingerprint data retrieved successfully: \(fingerprintData)")
        } else {
            print("Failed to retrieve fingerprint data from keychain")
        }
    }
}

위 코드에서는 마찬가지로 keychainIdentifier 변수를 사용하여 키체인에서 데이터를 가져옵니다. kSecMatchLimit, kSecReturnData 등의 속성을 설정하여 키체인에서 데이터를 조회합니다. 데이터가 성공적으로 조회되면 해당 데이터를 String으로 변환하여 사용할 수 있습니다.

결론

이제 Swift에서 키체인을 사용하여 사용자 지문 인식 정보를 안전하게 저장하는 방법을 알았습니다. 이를 통해 앱 사용자의 개인정보를 보호하면서 편리한 사용자 지문 인식 기능을 구현할 수 있습니다.

참고 자료