[swift] RxSwift에서의 쿠키 처리 방법

RxSwift를 사용하여 네트워크 요청을 처리할 때, 때로는 쿠키 관리가 필요할 수 있습니다. 쿠키는 서버에서 클라이언트로 보내진 작은 데이터 조각으로, 클라이언트가 다시 서버에 요청을 보낼 때 사용됩니다.

RxSwift에서 쿠키를 처리하는 방법에는 몇 가지가 있습니다. 아래에서는 가장 흔한 방법 중 하나를 살펴보겠습니다.

Step 1: URLSession에서 쿠키 정책 설정하기

우선 URLSession을 사용하여 네트워크 요청을 보내는 경우, URLSessionConfiguration을 사용하여 쿠키 정책을 설정해야 합니다. 아래의 코드는 .useProtocolCachePolicy 정책을 사용하여 URLSessionConfiguration을 설정하는 예시입니다.

let configuration = URLSessionConfiguration.default
configuration.httpCookieStorage = HTTPCookieStorage.shared
configuration.requestCachePolicy = .useProtocolCachePolicy

위의 코드에서 HTTPCookieStorage.shared은 앱 전체에서 사용되는 공유 쿠키 저장소입니다. 따라서 쿠키가 URLSession에서 설정된 후에도 유지될 수 있습니다.

Step 2: 네트워크 요청 전에 쿠키 가져오기

URLSession에서 네트워크 요청을 보내기 전에, 이전에 저장된 쿠키를 가져와서 URLRequest에 추가해야합니다. 아래의 코드는 기존의 쿠키를 가져와 URLRequest에 추가하는 예시입니다.

let url = URL(string: "https://example.com")
var request = URLRequest(url: url!)
request.httpMethod = "GET"

if let cookies = HTTPCookieStorage.shared.cookies {
    let headers = HTTPCookie.requestHeaderFields(with: cookies)
    request.allHTTPHeaderFields = headers
}

위의 코드에서 HTTPCookie.requestHeaderFields(with:) 함수는 쿠키를 요청의 헤더 필드로 변환합니다. 따라서 URLRequest의 allHTTPHeaderFields에 해당 헤더 필드를 설정하여 쿠키를 요청에 추가할 수 있습니다.

Step 3: 네트워크 요청 후 쿠키 저장하기

네트워크 요청이 성공적으로 완료된 후에 서버로부터 반환된 새로운 쿠키를 가져와서 저장해야합니다. 아래의 코드는 URLSessionDelegate를 사용하여 새로운 쿠키를 가져온 후, HTTPCookieStorage.shared에 저장하는 예시입니다.

class MyURLSessionDelegate: NSObject, URLSessionDelegate {
    // ...

    func urlSession(_ session: URLSession, task: URLSessionTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
        if let httpResponse = response as? HTTPURLResponse {
            if let cookies = HTTPCookie.cookies(withResponseHeaderFields: httpResponse.allHeaderFields as! [String : String], for: response.url!) {
                HTTPCookieStorage.shared.setCookies(cookies, for: response.url, mainDocumentURL: nil)
            }
        }
        completionHandler(.allow)
    }

    // ...
}

let sessionDelegate = MyURLSessionDelegate()
let session = URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)

let task = session.dataTask(with: request) { (data, response, error) in
    // ...
}

task.resume()

위의 코드에서 MyURLSessionDelegateURLSessionDelegate를 구현한 사용자 정의 클래스입니다. urlSession(_:task:didReceive:completionHandler:) 함수에서는 응답으로부터 쿠키를 가져와서 HTTPCookieStorage.shared에 저장합니다.

이제 위의 세 단계를 따라 RxSwift로 쿠키를 처리하는 방법을 배웠습니다. 이를 활용하여 네트워크 요청을 효과적으로 관리하고 쿠키를 처리할 수 있을 것입니다.

참고 자료