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

로그인 세션 만료 시간을 설정하는 것은 Swift 애플리케이션에서 중요한 요소입니다. 이를 위해 키체인(Keychain)을 사용하여 사용자의 로그인 상태를 안전하게 보관할 수 있습니다. 키체인은 사용자의 민감한 정보를 보호하기 위해 iOS에서 제공하는 보안 메커니즘입니다.

키체인을 초기화하기 위한 Configuration 생성

키체인을 사용하기 위해 먼저 Security 프레임워크를 import해야 합니다. 그런 다음 키체인을 초기화하는 Configuration을 생성합니다.

import Security

let kKeychainAccessGroup = "YOUR_KEYCHAIN_ACCESS_GROUP"
let kKeychainService = "YOUR_KEYCHAIN_SERVICE"

let keychainQuery: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: kKeychainService,
    kSecAttrAccessGroup as String: kKeychainAccessGroup
]

위의 코드에서 kKeychainAccessGroupkKeychainService는 각각 앱의 키체인 액세스 그룹과 서비스 식별자를 나타냅니다. 이를 각각 앱에 맞게 설정해야 합니다.

세션 만료 시간 저장하기

로그인 세션 만료 시간을 키체인에 저장하려면 다음 코드를 사용합니다.

func setExpirationDate(_ expirationDate: Date) {
    let query: [String: Any] = [
        kSecAttrAccount as String: "SESSION_EXPIRATION_DATE",
        kSecValueData as String: NSKeyedArchiver.archivedData(withRootObject: expirationDate),
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    
    let resultCode = SecItemDelete(query as CFDictionary)
    
    if resultCode != noErr && resultCode != errSecItemNotFound {
        // 삭제 오류 처리
        print("Failed to delete existing expiration date: \(resultCode)")
    }
    
    let status = SecItemAdd(keychainQuery as CFDictionary, nil)
    
    if status != noErr {
        // 추가 오류 처리
        print("Failed to save expiration date: \(status)")
    }
}

위의 코드에서 kSecAttrAccount는 키 체인 항목의 이름을 나타냅니다. 여기서는 “SESSION_EXPIRATION_DATE”로 설정되어 있습니다. kSecValueData는 저장할 데이터를 나타내며, 여기서는 expirationDate 매개 변수입니다. NSKeyedArchiver를 사용하여 날짜를 데이터로 변환하는 것에 유의하세요.

세션 만료 시간 불러오기

저장된 세션 만료 시간을 불러오려면 다음 코드를 사용합니다.

func getExpirationDate() -> Date? {
    var query = keychainQuery
    query[kSecAttrAccount as String] = "SESSION_EXPIRATION_DATE"
    query[kSecReturnData as String] = kCFBooleanTrue
    query[kSecMatchLimit as String] = kSecMatchLimitOne

    var result: AnyObject?
    let resultCode = SecItemCopyMatching(query as CFDictionary, &result)

    if resultCode == noErr, let data = result as? Data {
        return NSKeyedUnarchiver.unarchiveObject(with: data) as? Date
    } else {
        return nil
    }
}

위의 코드에서 kSecReturnData를 사용하여 키체인에 저장된 데이터를 반환하도록 설정합니다. 저장된 데이터를 NSKeyedUnarchiver를 사용하여 다시 날짜로 변환합니다.

사용자 로그인 세션 관리하기

이제 로그인 세션 만료 시간을 키체인을 통해 설정하고 가져올 수 있습니다. 로그인 세션이 만료되었는지 확인하는 코드를 작성하여 적절하게 처리할 수 있습니다.

let expirationDate = getExpirationDate()

if let expirationDate = expirationDate, expirationDate > Date() {
    // 로그인 세션 유효
} else {
    // 로그인 세션 만료
}

위의 코드에서 expirationDate 변수는 저장된 세션 만료 시간을 나타냅니다. 현재 날짜와 비교하여 세션이 유효한지 확인할 수 있습니다. 세션 만료 시 적절한 조치를 취할 수 있습니다.

이제 Swift에서 키체인을 사용하여 로그인 세션 만료 시간을 설정하는 방법을 알게 되었습니다. 키체인을 사용하면 사용자의 중요한 데이터를 안전하게 보관하고 관리할 수 있습니다. 필요에 따라 이러한 코드를 적용하여 앱의 보안을 강화할 수 있습니다.

기타 참고 자료: iOS Keychain Services