[swift] Swift에서 키체인을 사용하여 로그인 시간 기록하기

로그인 시간을 기록하기 위해 Swift에서 키체인(Keychain)을 사용하는 방법에 대해 알아보겠습니다.

키체인은 iOS 앱과 macOS 앱에서 보안 정보를 안전하게 저장하기 위한 메커니즘입니다. 암호화된 형태로 데이터를 저장하므로, 보안 측면에서 안전하게 로그인 시간을 기록할 수 있습니다.

1. Keychain에 접근하는 클래스 만들기

먼저, Keychain에 접근하여 로그인 시간을 저장하고 가져오기 위한 Helper 클래스를 작성하겠습니다. 아래의 코드를 참고하세요.

import Foundation
import Security

class KeychainHelper {
    static let service = "com.example.app.login"
    static let account = "loginTime"

    class func saveLoginTime(time: String) {
        let data = time.data(using: .utf8)

        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrService as String: service,
            kSecAttrAccount as String: account,
            kSecValueData as String: data ?? Data()
        ]

        SecItemDelete(query as CFDictionary)

        let status = SecItemAdd(query as CFDictionary, nil)
        if status != errSecSuccess {
            print("Failed to save login time to Keychain")
        }
    }

    class func getLoginTime() -> String? {
        let query: [String: Any] = [
            kSecClass as String : kSecClassGenericPassword,
            kSecAttrService as String : service,
            kSecAttrAccount as String : account,
            kSecMatchLimit as String : kSecMatchLimitOne,
            kSecReturnData as String : kCFBooleanTrue!,
            kSecReturnAttributes as String : kCFBooleanTrue!
        ]

        var item: CFTypeRef?
        let status = SecItemCopyMatching(query as CFDictionary, &item)

        if status != errSecSuccess {
            print("Failed to retrieve login time from Keychain")
            return nil
        }

        guard let existingItem = item as? [String: Any],
              let data = existingItem[kSecValueData as String] as? Data,
              let time = String(data: data, encoding: .utf8) else {
            return nil
        }

        return time
    }
}

위의 코드에서는 KeychainHelper라는 클래스가 생성되어 있습니다. 이 클래스에는 saveLoginTime 메서드와 getLoginTime 메서드가 있습니다.

saveLoginTime 메서드는 로그인 시간을 Keychain에 저장합니다. getLoginTime 메서드는 Keychain에서 저장된 로그인 시간을 가져옵니다.

2. 로그인 시간 기록하기

실제로 로그인 시간을 기록하는 부분에서는, 로그인 성공 후에 KeychainHelper.saveLoginTime 메서드를 호출하여 로그인 시간을 저장합니다.

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let loginTime = dateFormatter.string(from: Date())
KeychainHelper.saveLoginTime(time: loginTime)

위의 코드에서는 현재 시간을 yyyy-MM-dd HH:mm:ss 형태의 문자열로 변환하고, 이를 KeychainHelper.saveLoginTime 메서드에 전달하여 로그인 시간을 저장합니다.

3. 저장된 로그인 시간 가져오기

저장된 로그인 시간을 가져와서 사용할 때에는 KeychainHelper.getLoginTime 메서드를 호출하여 가져옵니다.

if let loginTime = KeychainHelper.getLoginTime() {
    print("마지막 로그인 시간은 \(loginTime)입니다.")
} else {
    print("로그인 시간을 가져올 수 없습니다.")
}

위의 코드에서는 저장된 로그인 시간을 가져와서 출력하는 예제입니다. 가져온 로그인 시간이 존재하는 경우에는 해당 시간을 출력하고, 없는 경우에는 “로그인 시간을 가져올 수 없습니다.”라는 메시지를 출력합니다.

결론

Swift에서 Keychain을 사용하여 로그인 시간을 기록하는 방법에 대해 알아보았습니다. Keychain을 사용하면 보안적인 측면에서 안전하게 로그인 시간을 관리할 수 있으며, 중요한 보안 정보를 안전하게 저장할 수도 있습니다. 이를 활용하여 앱의 보안성을 향상시킬 수 있습니다.

참고 자료: