[swift] Swift에서 키체인을 사용하여 네트워크 요청 인증 설정하기

이번에는 Swift에서 Keychain을 사용하여 네트워크 요청 인증 설정하는 방법에 대해 알아보겠습니다. Keychain은 애플리케이션의 중요한 정보를 안전하게 저장하는 데 사용됩니다. 네트워크 요청 인증 정보도 Keychain을 사용하여 안전하게 보관할 수 있습니다.

Keychain을 사용하기 위해 Security 프레임워크를 import해야 합니다. Security 프레임워크는 Keychain에 데이터를 저장하고 로드할 수 있는 기능을 제공합니다.

먼저, Keychain에 인증 정보를 저장하는 함수를 작성해보겠습니다.

import Foundation
import Security

func saveCredentials(username: String, password: String) {
    let query: [String: Any] = [
        kSecClass as String: kSecClassInternetPassword,
        kSecAttrAccount as String: username,
        kSecValueData as String: password.data(using: .utf8)!
    ]
    
    let status = SecItemAdd(query as CFDictionary, nil)
    
    if status != errSecSuccess {
        print("Failed to save credentials")
    }
}

위의 코드에서는 SecItemAdd 함수를 사용하여 Keychain에 인증 정보를 저장합니다. kSecClass는 저장할 항목의 클래스를 지정하는데, 여기서는 kSecClassInternetPassword를 사용하여 인터넷 비밀번호를 저장합니다. kSecAttrAccount는 저장할 항목의 계정 이름을 지정하고, kSecValueData는 저장할 값의 데이터를 지정합니다. 저장할 값인 비밀번호는 data(using: .utf8) 메서드를 사용하여 데이터로 변환합니다.

인증 정보를 저장한 후에는, 해당 정보를 불러오는 함수를 만들어보겠습니다.

func loadCredentials(username: String) -> String? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassInternetPassword,
        kSecAttrAccount as String: username,
        kSecMatchLimit as String: kSecMatchLimitOne,
        kSecReturnData as String: kCFBooleanTrue!
    ]
    
    var result: AnyObject?
    let status = withUnsafeMutablePointer(to: &result) {
        SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
    }
    
    if status == errSecSuccess {
        if let data = result as? Data,
           let password = String(data: data, encoding: .utf8) {
            return password
        }
    }
    
    return nil
}

위의 코드에서는 SecItemCopyMatching 함수를 사용하여 Keychain에서 인증 정보를 불러옵니다. kSecMatchLimit은 일치하는 항목의 최대 개수를 지정하는데, 여기서는 하나의 항목만 가져오기 위해 kSecMatchLimitOne을 사용합니다. kSecReturnData는 가져온 값을 데이터로 반환하는 옵션입니다.

불러온 데이터가 있는 경우, 해당 데이터를 문자열로 변환하여 반환합니다. 그렇지 않은 경우에는 nil을 반환합니다.

이제 위의 두 함수를 사용하여 네트워크 요청을 할 때 인증 정보를 설정해보겠습니다.

let username = "username"
let password = "password"

saveCredentials(username: username, password: password)

// 네트워크 요청하기
let request = URLRequest(url: URL(string: "https://api.example.com")!)
let session = URLSession.shared

if let token = loadCredentials(username: username) {
    request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
}

let task = session.dataTask(with: request) { (data, response, error) in
    // 요청 완료 후 처리
}

task.resume()

위의 코드에서는 먼저 인증 정보를 저장하고, 요청을 보낼 때 해당 정보를 불러와 헤더에 추가합니다. 네트워크 요청할 때마다 Keychain에서 인증 정보를 가져오기 때문에 안전하게 인증을 처리할 수 있습니다.

이제 Swift에서 Keychain을 사용하여 네트워크 요청 인증 설정하는 방법에 대해 알아보았습니다. Keychain을 사용하여 애플리케이션의 중요한 정보를 안전하게 관리할 수 있습니다. 이를 통해 사용자 인증 정보를 보호하고 안전한 네트워크 통신을 할 수 있습니다.

참고 자료