반응형

Http Request(URLRequest)에서 받은 쿠키를 저장 한 후, WKWebView에 저장한 쿠키를 세팅하기

  • 로그인 REST API를 호출한 후 응답값에서 쿠키를 추출 한후 뒤에 보여지는 WKWebView에 해당 쿠키를 세팅하여, 서버에서 동일한 세션으로 인식되게 한다.
  • 쿠키를 동기화 시키지 않아, 서버에서 새로운 세션으로 인식해 버리게 되는것을 방지한다.

 

1. 저장할 쿠키를 임의 위치(Common.swift)의 전역변수에 저장한다.

//API, Webview 간의 쿠기 공유
static var cookies: [HTTPCookie]?

 

2. Http Request(URLRequest)에서 받은 쿠키를 저장한다.

//로그인 REST API호출
let param = "action=login&id=\(id)&pass=\(pass)";//요청param
let paramData = param.data(using: .utf8)
let url = URL(string : "http://www.myserver.co.kr/LoginServlet");//요청url
var request = URLRequest(url: url!)
request.httpMethod = "POST"
request.httpBody = paramData;
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue(String(paramData!.count), forHTTPHeaderField: "content-Length")

//요청하기
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    if let e = error {
        NSLog("An error has occurred: \(e.localizedDescription)")
        return;
    }
 
 
    //---쿠키 저장하기-------------------
    if let httpResponse = response as? HTTPURLResponse, let fields = httpResponse.allHeaderFields as? [String : String] {
        let cookies: [HTTPCookie] = HTTPCookie.cookies(withResponseHeaderFields: fields, for: response!.url!)
        Common.cookies = cookies
    }
    //-----------------------------------
    
 
    //응답처리
    DispatchQueue.main.async {
        let jsonString = String(bytes: data!, encoding: .utf8)
        let decoder = JSONDecoder()
        var data = jsonString!.data(using: .utf8)
        if let data = data, let voLogin = try? decoder.decode(VoLogin.self, from: data) {
            if(voLogin.result == "success") {
                //성공 처리
            } else {
                //실패 처리
                let alert = UIAlertController(title: "알림", message: voLogin.message, preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "확인", style: .default) { action in
                })
                self.present(alert, animated: true, completion: nil)
            }
        }
        else {
            let alert = UIAlertController(title: "알림", message: "로그인을 실패했습니다.", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "확인", style: .default) { action in
            })
            self.present(alert, animated: true, completion: nil)
        }
    }
}
task.resume(); //POST전송

 

3. 저장된 쿠키를 WKWebView에 세팅한다.(초기화 위치에 삽입)

//WKWebview 쿠키 셋팅
if Common.cookies != nil {
    for cookie in Common.cookies! {
        webview.configuration.websiteDataStore.httpCookieStore.setCookie(cookie, completionHandler: nil)
    }
}
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기