ChamomileGuides 3.0.4 Help

쿠키 공유 관리 가이드(IOS)

(1) 웹 사이트로부터 받아 사용자의 브라우저에 저장하는 작은 데이터 (2) 웹 사이트를 로드할 때 마다, 사용자의 활동과 식별을 위해 서버로 다시 돌려보내는데 활용 (3) 상태 정보를 기억하고, 버튼 클릭, 브라우징 하스토리, 로그인 등 브라우저의 활동을 기록하는데 필요로 생성 (4) 기본적으로 자신을 보낸 서버의 도메인을 가지고 있고, 해당 도메인을 연결할때마다 사용됨

WKWebView 쿠키

저장소: webView.configuration.websiteDataStore.httpCookieStore 속성: Cookie의 속성에는 domain, path, name, value으로 이루어져 있으며, domain 이동할때마다 저장된 쿠키 사용

WKWebView -> HTTP 쿠키 공유

  1. WebSiteDataStore WKWebView에서는 expires Date가 지나지 않은 쿠키들은 WebSiteDataStore에 저장한다. WKWebsiteDataStore.default() : 앱 내 Disk에 저장 WKWebsiteDataStore.nonPersistent(): 앱 내 cache로 저장

  2. WKWebView의 쿠키들을 HTTPCookieStorage.shared에 동기화

    syncHTTPCookieStorage(webView.configuration.websiteDataStore.httpCookieStore) static func syncHTTPCookieStorage(_ cookieStore: WKHTTPCookieStore, completionHandler: (() -> Void)?) { // 쿠키 가져오기 허용(정책) HTTPCookieStorage.shared.cookieAcceptPolicy = .always cookieStore.getAllCookies({(_ cookies: [HTTPCookie]) -> Void in for cookie: HTTPCookie in cookies { HTTPCookieStorage.shared.setCookie(cookie) } completionHandler?() }) }
  3. API 통신시 헤더에 추가(Alamofire)

    func getHeaders() -> HTTPHeaders { var headers: HTTPHeaders = [ "Content-Type": "application/json" ] if let cookies = HTTPCookieStorage.shared.cookies { let cookieHeader = HTTPCookie.requestHeaderFields(with: cookies) for (name, value) in cookieHeader { // 저장소에서 가져온 쿠키를 key, value 값으로 넣는다. headers.add(name: name, value: value) } } return headers } func sendAPIRequest(url: URL) { let headers = getHeaders() AF.request(url, method: .get, headers: headers).response { response in switch response.result { case .success(let data): if let data = data { print("API Response Data: \(data)") } case .failure(let error): print("API Request Error: \(error)") } }

HTTPCookieStorage -> WKWebView 쿠키 공유

  1. HTTPCookieStorage.shared API 통신시 쿠키가 저장됨 싱글톤이기 때문에 앱내 어디서든 공유 가능

    self.syncWKHTTPCookieStore("https://chamomile-mobile.lotteinnovate.com") func syncWKHTTPCookieStore(_ urlString: String) { guard let url: URL(string: urlString) else { return } if let cookies: [HTTPCookie] = HTTPCookieStorage.shared.cookies { let group: DispatchGroup = .init() cookies.forEach({ cookie in group.enter() self.webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie) { group.leave() } }) // 쿠키 저장이 완료되었음을 알림 group.notify(queue: .main) { [unowned self] in // 웹뷰 로드 self.webView.load(URLRequest(url: url)) } } else { self.webView.load(URLRequest(url: url)) } }
Last modified: 21 4월 2025