[swift] Swift에서 키체인을 사용하여 로그인 세션 유지하기

로그인 세션을 유지하기 위해 사용자의 인증 정보를 안전하게 저장하는 것은 매우 중요합니다. Swift 프로그래밍 언어에서는 Keychain을 사용하여 이러한 인증 정보를 안전하게 저장할 수 있습니다. Keychain은 iOS 기기의 보안을 위해 설계된 암호화된 데이터베이스로, 사용자의 비밀번호, 토큰 및 기타 중요한 정보를 안전하게 저장할 수 있습니다.

Step 1: Security 프레임워크 가져오기

프로젝트에서 Keychain을 사용하려면 Security 프레임워크를 가져와야 합니다. 프로젝트 네비게이터에서 다음 작업을 수행하여 프레임워크를 추가합니다.

  1. 프로젝트 파일을 선택하고, TARGETS 섹션에서 프로젝트를 선택합니다.
  2. General 탭에서 “Linked Frameworks and Libraries”를 찾아, “+” 버튼을 클릭합니다.
  3. “Security.framework”을 선택하고, “Add” 버튼을 클릭합니다.

Step 2: Keychain Wrapper 클래스 생성하기

Keychain을 간편하게 사용하기 위해 Keychain Wrapper 클래스를 만들어 보겠습니다. 이 클래스는 Keychain에 데이터를 저장하고 검색하는 간단한 인터페이스를 제공합니다.

import Foundation
import Security

class KeychainWrapper {
    
    class func save(key: String, data: Data) -> OSStatus {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: key,
            kSecValueData as String: data
        ]
        
        return SecItemAdd(query as CFDictionary, nil)
    }
    
    class func load(key: String) -> Data? {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: key,
            kSecMatchLimit as String: kSecMatchLimitOne,
            kSecReturnData as String: true
        ]
        
        var result: AnyObject?
        let status = SecItemCopyMatching(query as CFDictionary, &result)
        
        if status == errSecSuccess {
            return result as? Data
        }
        
        return nil
    }
    
    class func delete(key: String) -> OSStatus {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: key
        ]
        
        return SecItemDelete(query as CFDictionary)
    }
    
}

Step 3: 로그인 세션 관리하기

이제 로그인 세션을 관리하는 방법을 알아보겠습니다. 보통 로그인 성공 후에는 사용자의 인증 정보를 Keychain에 저장하고, 앱을 다시 실행할 때마다 Keychain에서 정보를 검색하여 로그인 세션을 유지합니다.

class LoginViewController: UIViewController {
    
    let keychainKey = "loginSession"
    
    func saveLoginSession() {
        let sessionData = "UserLoggedIn".data(using: .utf8)!
        let saveStatus = KeychainWrapper.save(key: keychainKey, data: sessionData)
        
        if saveStatus == errSecSuccess {
            print("Login session saved successfully")
        } else {
            print("Failed to save login session")
        }
    }
    
    func loadLoginSession() {
        if let sessionData = KeychainWrapper.load(key: keychainKey) {
            let sessionString = String(data: sessionData, encoding: .utf8)
            print("Login session loaded: \(sessionString ?? "")")
            
            // 사용자 세션이 유효한지 확인하고 필요한 작업을 수행합니다.
        } else {
            print("Login session not found")
            
            // 로그인이 필요한 화면으로 이동합니다.
        }
    }
    
    func deleteLoginSession() {
        let deleteStatus = KeychainWrapper.delete(key: keychainKey)
        
        if deleteStatus == errSecSuccess {
            print("Login session deleted successfully")
            
            // 로그아웃 후에 필요한 작업을 수행합니다.
        } else {
            print("Failed to delete login session")
        }
    }
    
}

위의 코드에서는 saveLoginSession() 메서드를 사용하여 사용자의 로그인 세션 정보를 Keychain에 저장하고, loadLoginSession() 메서드를 사용하여 저장된 세션을 로드합니다. deleteLoginSession() 메서드는 로그아웃 시 로그인 세션을 Keychain에서 삭제하는 데 사용됩니다.

결론

Swift에서 Keychain을 사용하여 로그인 세션을 유지하는 방법에 대해 알아보았습니다. Keychain을 사용하면 사용자의 인증 정보를 안전하게 저장하고 관리할 수 있으므로, 보안에 민감한 앱을 개발하는 경우 반드시 사용해야 합니다.