[iOS] WKWebView 쿠키값 설정하기

pola·2024년 11월 3일

Company

목록 보기
1/7

웹에서 쿠키 설정 방식이 변경되면서 Android에서는 쿠키가 정상적으로 전달되는 반면, iOS에서는 제대로 전달되지 않는 문제가 발생했습니다. 이를 해결하기 위해 iOS의 쿠키 설정 방식을 변경했습니다.

  • 기존에는 request 객체에 쿠키 값을 직접 HTTPHeader로 전달하는 방식
var request = URLRequest(url: link)
request.addValue("aa=\(aa); bb=\(bb);", forHTTPHeaderField: "Cookie")

이 방식에서는 쿠키 값을 Cookie 헤더에 모두 추가하여 전달했습니다. 그러나 웹에서 요구하는 방식과 달라, iOS에서는 올바르게 작동하지 않았습니다.

  • 새로운 방식에서는 각 쿠키를 HTTPCookie 객체로 생성하여 WKWebView의 httpCookieStore에 설정하는 방식
//호출
let cookieData: [String: String] = [
    "aa": aa,
    "bb": bb
]

setCookies(for: webView, with: cookieData)

//함수
private func setCookies(for webView: WKWebView, with cookieData: [String: String]) {
    // 쿠키의 기본 속성 설정
    let baseCookieProperties: [HTTPCookiePropertyKey: Any] = [
        .domain: url?.host ?? "",
        .path: "/",
        .secure: "TRUE",
        .expires: Date().addingTimeInterval(3600) // 1시간 후 만료
    ]
    
    // 쿠키 저장소 가져오기
    let cookieStore = webView.configuration.websiteDataStore.httpCookieStore

    // 쿠키 데이터 반복 처리
    cookieData.forEach { (name, value) in
        var properties = baseCookieProperties
        properties[.name] = name
        properties[.value] = value
        
        if let cookie = HTTPCookie(properties: properties) {
            cookieStore.setCookie(cookie) {
                print("\(name) cookie set successfully.")
            }
        } else {
            print("Failed to create cookie for \(name)")
        }
    }
}

이와 같이 쿠키를 개별적으로 설정하면 웹에서 요구하는 쿠키 구조를 따를 수 있고, iOS와의 호환성 문제도 해결

쿠키 만료 시간과 secure 옵션을 적용하여 보안 측면에서도 더 안전하게 사용 가능

profile
pola

0개의 댓글