[swift] Swift Moya에서 쿠키 저장 및 사용하기

Moya는 Swift로 작성된 네트워킹 라이브러리로, 네트워크 요청 및 응답 처리를 쉽게 구현할 수 있도록 도와줍니다. 이번 포스트에서는 Moya를 사용하여 쿠키를 저장하고 사용하는 방법에 대해 알아보겠습니다.

1. 쿠키 저장하기

쿠키를 저장하기 위해서는 MoyaProvider의 endpointClosure을 사용하여 네트워크 요청을 설정해야 합니다. 아래는 쿠키를 저장하는 endpointClosure 예제입니다.

let provider = MoyaProvider<MyAPI>(endpointClosure: { (target: MyAPI) -> Endpoint in
    let defaultEndpoint = MoyaProvider.defaultEndpointMapping(for: target)
    
    // 저장할 쿠키 생성
    let cookie = HTTPCookie(properties: [
        .domain: "example.com",
        .path: "/",
        .name: "my_cookie",
        .value: "my_cookie_value"
    ])
    
    // 쿠키를 URLRequest의 headerFields에 추가
    var headers = defaultEndpoint.httpHeaderFields ?? [:]
    if let cookie = cookie {
        headers.merge(HTTPCookie.requestHeaderFields(with: [cookie])) { $1 }
    }
    
    return defaultEndpoint.adding(newHTTPHeaderFields: headers)
})

위 예제에서는 defaultEndpointMapping 메서드를 사용하여 기본적인 URLRequest를 생성하고, 추가적으로 쿠키를 생성하여 headerFields에 추가합니다.

2. 쿠키 사용하기

쿠키를 사용하기 위해서는 Moya의 endpointClosure 외에도 requestClosure을 사용하여 URLRequest를 수정해야 합니다. 아래는 쿠키를 사용하는 requestClosure 예제입니다.

let provider = MoyaProvider<MyAPI>(endpointClosure: { (target: MyAPI) -> Endpoint in
    let defaultEndpoint = MoyaProvider.defaultEndpointMapping(for: target)
    return defaultEndpoint
}, requestClosure: { (endpoint: Endpoint, closure: RequestResultClosure) in
    // 기존 URLRequest 가져오기
    var urlRequest = try! endpoint.urlRequest()
    
    // UserDefaults에서 저장된 쿠키 가져오기
    if let storedCookies = UserDefaults.standard.value(forKey: "my_cookies") as? [Data],
       let cookies = HTTPCookie.cookies(withResponseHeaderFields: [:], for: urlRequest.url!) {
        // 저장된 쿠키를 URLRequest에 추가
        var cookieHeaders = HTTPCookie.requestHeaderFields(with: cookies)
        for cookieData in storedCookies {
            if let cookie = NSKeyedUnarchiver.unarchiveObject(with: cookieData) as? HTTPCookie {
                cookieHeaders.merge(HTTPCookie.requestHeaderFields(with: [cookie])) { $1 }
            }
        }
        urlRequest.allHTTPHeaderFields?.merge(cookieHeaders) { $1 }
    }
    
    closure(.success(urlRequest))
})

위 예제에서는 requestClosure 클로저에서 UserDefaults에서 저장된 쿠키를 가져와 URLRequest의 headerFields에 추가하는 방식으로 쿠키를 사용합니다.

3. 쿠키 저장 및 불러오기

쿠키를 저장하거나 불러오기 위해서는 UserDefaults를 사용합니다. 아래는 쿠키를 저장하고 불러오는 예제입니다.

// 쿠키 저장
if let cookies = HTTPCookieStorage.shared.cookies {
    var storedCookies: [Data] = []
    for cookie in cookies {
        storedCookies.append(NSKeyedArchiver.archivedData(withRootObject: cookie))
    }
    UserDefaults.standard.set(storedCookies, forKey: "my_cookies")
}

// 쿠키 불러오기
if let storedCookies = UserDefaults.standard.value(forKey: "my_cookies") as? [Data],
   let cookies = HTTPCookieStorage.shared.cookies {
    for cookieData in storedCookies {
        if let cookie = NSKeyedUnarchiver.unarchiveObject(with: cookieData) as? HTTPCookie {
            HTTPCookieStorage.shared.setCookie(cookie)
        }
    }
}

위 예제에서는 HTTPCookieStorage.shared를 사용하여 쿠키를 저장하고 불러옵니다. 저장된 쿠키는 UserDefaults에 저장되며, 불러온 쿠키는 다시 HTTPCookieStorage.shared에 추가됩니다.

쿠키를 저장하고 불러오는 방식은 애플리케이션의 요구에 따라 다르게 구현할 수 있습니다. 위 예제는 단순히 UserDefaults를 사용한 예제이며, 실제 애플리케이션에 맞게 적절한 저장 및 불러오기 방식을 선택하여 구현해야 합니다.

결론

Moya와 Swift를 사용하여 쿠키를 저장하고 사용하는 방법에 대해 알아보았습니다. Moya의 endpointClosure과 requestClosure을 활용하여 네트워킹 요청 및 응답 처리를 자유롭게 구현할 수 있습니다. 쿠키는 HTTP 요청에 필요한 중요한 정보를 저장하고 사용할 때 유용한 기능이므로, 필요에 따라 적절히 활용해보시기 바랍니다.

참고 자료