[swift] Swift에서 키체인을 사용하여 네트워크 API 토큰 관리하기

개발자들은 네트워크 API와의 통신에 토큰을 사용하여 사용자를 인증하고 보안을 유지하는 경우가 많습니다. 이 토큰을 안전하게 저장하고 관리하기 위해 Swift에서는 키체인을 사용할 수 있습니다. 이 글에서는 Swift에서 키체인을 사용하여 네트워크 API 토큰을 관리하는 방법을 알아보겠습니다.

1. 키체인 접근하기

Swift에서 키체인에 접근하기 위해서는 보안 프레임워크인 Security를 import해야 합니다.

import Security

2. 토큰 저장하기

네트워크 API 토큰을 키체인에 저장하기 위해서는 SecItemAdd 함수를 사용합니다. 아래의 예시 코드는 토큰을 생성하고, SecItemAdd 함수를 사용하여 토큰을 키체인에 저장합니다.

func storeAPIToken(token: String) {
    let tokenData = token.data(using: .utf8)
    
    let keychainQuery: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: "API_TOKEN",
        kSecValueData as String: tokenData,
        kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked
    ]
    
    let status = SecItemAdd(keychainQuery as CFDictionary, nil)
    
    if status != errSecSuccess {
        print("Failed to store API token in keychain")
    }
}

위의 코드에서 kSecAttrAccount는 저장할 토큰의 식별자를 나타냅니다. kSecValueData는 토큰 데이터를 나타내며, kSecAttrAccessible는 키체인에 저장된 데이터의 접근 가능성을 정의합니다.

3. 토큰 불러오기

저장된 API 토큰을 키체인에서 불러오기 위해서는 SecItemCopyMatching 함수를 사용합니다. 아래의 예시 코드는 토큰을 키체인에서 읽어오는 함수를 정의합니다.

func loadAPIToken() -> String? {
    let keychainQuery: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: "API_TOKEN",
        kSecReturnData as String: kCFBooleanTrue!,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    
    var result: AnyObject?
    let status = SecItemCopyMatching(keychainQuery as CFDictionary, &result)
    
    if status == errSecSuccess, let tokenData = result as? Data {
        return String(data: tokenData, encoding: .utf8)
    }
    
    return nil
}

위의 코드에서 kSecReturnData는 토큰 데이터를 반환하도록 지정하고, kSecMatchLimit은 사용할 수 있는 결과의 최대 개수를 지정합니다.

4. 토큰 삭제하기

만약 저장된 토큰을 삭제하고 싶다면, SecItemDelete 함수를 사용하여 토큰을 삭제할 수 있습니다. 아래의 예시 코드는 토큰을 삭제하는 함수를 정의합니다.

func deleteAPIToken() {
    let keychainQuery: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: "API_TOKEN"
    ]
    
    let status = SecItemDelete(keychainQuery as CFDictionary)
    
    if status != errSecSuccess {
        print("Failed to delete API token from keychain")
    }
}

위의 코드에서 kSecAttrAccount는 삭제할 토큰의 식별자를 나타냅니다.

마무리

이제 Swift에서 키체인을 사용하여 네트워크 API 토큰을 안전하게 관리하는 방법에 대해 알게 되었습니다. 이를 통해 사용자 인증과 보안에 필요한 토큰을 신뢰할 수 있고 안전하게 사용할 수 있습니다. 예제 코드를 참고하여 자신의 프로젝트에 키체인을 적용해 보세요.

참고 자료