[swift] Swift에서 키체인을 사용하여 세션 만료 시간 설정하기

개요

세션 만료 시간은 애플리케이션의 보안과 사용자 경험에 중요한 역할을 합니다. Swift에서 키체인을 사용하여 세션 만료 시간을 설정하는 방법에 대해 알아보겠습니다.

키체인에 데이터 저장하기

세션 만료 시간을 저장하기 위해서는 키체인에 데이터를 저장해야 합니다. 키체인은 iOS 운영 체제에서 안전하게 데이터를 보관하는 데 사용되는 메커니즘입니다.

import Foundation

// 키체인 접근 식별자
let service = "com.example.app"
let accessGroup = "group.com.example.app"
let expirationTimeKey = "expirationTime"

// 세션 만료 시간 설정
func setExpirationTime(time: Date) {
    let keychainQuery: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccessGroup as String: accessGroup,
        kSecAttrAccount as String: expirationTimeKey,
        kSecValueData as String: time.timeIntervalSince1970
    ]

    guard SecItemAdd(keychainQuery as CFDictionary, nil) == errSecSuccess else {
        print("Failed to save expiration time to keychain")
        return
    }

    print("Expiration time saved successfully")
}

위의 코드에서는 setExpirationTime 함수를 사용하여 세션 만료 시간을 키체인에 저장합니다. kSecClassGenericPassword를 사용하여 키체인의 일반 비밀번호 클래스를 지정하고, serviceaccessGroup 변수를 사용하여 키체인에 접근할 수 있도록 설정합니다. kSecAttrAccount를 사용하여 세션 만료 시간을 구분하는 키를 설정하고, kSecValueData에는 시간 값을 저장합니다.

세션 만료 시간 가져오기

세션 만료 시간을 가져오기 위해서는 키체인에서 데이터를 확인해야 합니다. 이를 위해 getExpirationTime 함수를 사용합니다.

func getExpirationTime() -> Date? {
    let keychainQuery: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccessGroup as String: accessGroup,
        kSecReturnData as String: true,
        kSecMatchLimit as String: kSecMatchLimitOne,
        kSecAttrAccount as String: expirationTimeKey
    ]

    var dataTypeRef: AnyObject?
    let status = SecItemCopyMatching(keychainQuery as CFDictionary, &dataTypeRef)

    guard status == errSecSuccess, let retrievedData = dataTypeRef as? Data else {
        return nil
    }

    let expirationTime = TimeInterval(retrievedData) + Date.timeIntervalSinceReferenceDate
    return Date(timeIntervalSince1970: expirationTime)
}

위의 코드에서는 getExpirationTime 함수를 사용하여 키체인에서 세션 만료 시간을 가져옵니다. 마찬가지로 키체인 접근을 위해 serviceaccessGroup 변수를 사용하고, kSecAttrAccount 값을 설정하여 세션 만료 시간을 확인합니다.

세션 만료 시간 설정 및 가져오기 사용 예제

아래는 세션 만료 시간 설정 및 가져오기를 사용하는 예제입니다.

// 세션 만료 시간 설정
let expirationTime = Date().addingTimeInterval(3600) // 현재 시간 기준으로 1시간 후
setExpirationTime(time: expirationTime)

// 세션 만료 시간 가져오기
if let retrievedExpirationTime = getExpirationTime() {
    print("Session expiration time:", retrievedExpirationTime)
} else {
    print("No session expiration time found")
}

위의 코드에서는 Date().addingTimeInterval(3600)를 사용하여 현재 시간에서 1시간 후의 세션 만료 시간을 설정하고, setExpirationTime 함수를 호출하여 키체인에 저장합니다. 그 후 getExpirationTime 함수를 호출하여 저장된 세션 만료 시간을 확인합니다.

결론

이번 글에서는 Swift에서 키체인을 사용하여 세션 만료 시간을 설정하는 방법에 대해 알아보았습니다. 키체인을 활용하여 애플리케이션의 보안과 사용자 경험을 향상시킬 수 있습니다. 추가로 키체인에 저장된 데이터를 업데이트하거나 삭제하는 등의 작업도 가능합니다.