[swift] Swift에서 키체인을 사용하여 네트워크 세션 유지하기

개요

네트워크 요청이나 API 호출을 할 때, 사용자의 세션을 관리하는 것은 중요한 과제입니다. 세션을 관리하는 방법은 여러 가지가 있지만, Swift에서 키체인을 사용하는 것은 안전하고 편리한 방법 중 하나입니다. 이 글에서는 Swift에서 키체인을 사용하여 네트워크 세션을 유지하는 방법에 대해 알아보겠습니다.

키체인(Keychain)이란?

키체인은 iOS나 macOS에서 사용자의 비밀번호, 인증서, 암호화된 데이터 등을 안전하게 저장하는 용도로 사용됩니다. 앱이나 서비스 간에 공유하기 위해 사용되는 것이 아니라, 현재 앱 또는 기기의 사용자에 대한 데이터를 저장하기 위해 사용됩니다.

Swift에서 키체인 사용하기

  1. Security.framework 가져오기
    키체인을 사용하기 위해, 프로젝트에 Security.framework를 추가해야 합니다. 이는 Xcode 프로젝트의 Build Phases 탭에서 “Link Binary With Libraries” 섹션에서 추가할 수 있습니다.

  2. 키체인 관련 함수 만들기
    키체인 작업에 필요한 함수들을 만들어야 합니다. 예를 들어, 아래와 같은 함수들을 만들 수 있습니다.

    import Foundation
    import Security
    
    class KeychainManager {
    
        static func save(key: String, data: Data) -> OSStatus {
            let query: [CFString: Any] = [
                kSecClass: kSecClassGenericPassword,
                kSecAttrAccount: key,
                kSecValueData: data,
                kSecAttrAccessible: kSecAttrAccessibleAfterFirstUnlock
            ]
    
            return SecItemAdd(query as CFDictionary, nil)
        }
    
        static func load(key: String) -> Data? {
            let query: [CFString: Any] = [
                kSecClass: kSecClassGenericPassword,
                kSecAttrAccount: key,
                kSecMatchLimit: kSecMatchLimitOne,
                kSecReturnData: kCFBooleanTrue
            ]
    
            var result: AnyObject?
            let status = SecItemCopyMatching(query as CFDictionary, &result)
    
            if status == errSecSuccess {
                return result as? Data
            } else {
                return nil
            }
        }
    
        static func delete(key: String) -> OSStatus {
            let query: [CFString: Any] = [
                kSecClass: kSecClassGenericPassword,
                kSecAttrAccount: key
            ]
    
            return SecItemDelete(query as CFDictionary)
        }
    }
    
  3. 세션 토큰 저장하기
    네트워크 요청을 보낼 때 세션 토큰을 받아온 경우, 키체인을 사용하여 세션 토큰을 저장할 수 있습니다.

    // 세션 토큰을 받아온 경우
    let sessionToken = "ABCDEF12345"
    let data = sessionToken.data(using: .utf8)
       
    let status = KeychainManager.save(key: "SessionToken", data: data)
    if status == errSecSuccess {
        // 키체인에 성공적으로 저장된 경우
        print("세션 토큰이 성공적으로 저장되었습니다.")
    } else {
        // 키체인 저장 실패
        print("세션 토큰 저장에 실패했습니다.")
    }
    
  4. 세션 토큰 불러오기
    세션을 유지해야 하는 네트워크 요청을 보낼 때, 저장된 세션 토큰을 다시 불러와 사용할 수 있습니다.

    if let data = KeychainManager.load(key: "SessionToken"),
        let sessionToken = String(data: data, encoding: .utf8) {
        // 저장된 세션 토큰을 사용하여 네트워크 요청을 보낼 수 있음
        print("저장된 세션 토큰:", sessionToken)
    } else {
        // 세션 토큰이 저장되어 있지 않은 경우
        print("세션 토큰을 찾을 수 없습니다.")
    }
    
  5. 세션 토큰 삭제하기
    세션 토큰을 더 이상 사용하지 않을 때, 키체인에서 해당 세션 토큰을 삭제할 수 있습니다.

    let deleteStatus = KeychainManager.delete(key: "SessionToken")
    if deleteStatus == errSecSuccess {
        // 키체인에서 세션 토큰이 삭제된 경우
        print("세션 토큰이 성공적으로 삭제되었습니다.")
    } else {
        // 세션 토큰 삭제 실패
        print("세션 토큰 삭제에 실패했습니다.")
    }
    

요약

Swift에서 키체인을 사용하여 네트워크 세션을 유지하는 방법을 살펴보았습니다. 키체인은 사용자의 데이터를 안전하게 저장하기 위한 강력하고 신뢰할 수 있는 도구입니다. 네트워크 요청을 보낼 때 세션 토큰을 저장하고 불러와 사용하여 원활한 세션 관리를 할 수 있습니다.