Programming/Mac & iOS

[iOS] iOS에서 쿠키 사용하기 (NSHTTPCookieStorage, NSHTTPCookie)

MB Brad KWON 2014. 12. 3. 11:13


WebViewTest.zip



쿠키란?


    쿠키는 웹 사이트로부터 받아 사용자의 브라우저에 저장하는 작은 데이터이다. 쿠키는 웹사이트를 로드할 때마다 사용자의 활동과 식별을 위해 서버로 다시 돌려 보내는데 사용된다. 쿠키는 상태 정보를 기억하고 버튼 클릭, 브라우징 히스토리, 로그인 등 브라우저에서의 활동을 기록하는 데 필요한 신뢰있는 메카니즘으로 만들어졌다. 쿠키는 기본적으로 자신을 보낸 서버의 도메인을 가지고 있고 해당 도메인에 연결할 때마다 사용된다.

    

    데이터는 'name=value' 구조로 구성된 String 데이터 쌍이다. 쿠키는 일반적으로 웹브라우저가 종료되기 전까지 유지되며 만료시간을 설정할 경우에는 브라우저가 종료되도 설정한 만료시간까지 유지된다. 아래를 보면 쿠키가 'session'이란 name에 'eylZWNIbnQiOlsiMTZIMHZ'라는 value가 실려 있음을 확인할 수 있다.


    HEADERS

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) 

                     AppleWebKit/600.1.25 (KHTML, like Gecko) 

                     Version/8.0 Safari/600.1.25

Connect-Time: 1

Connection: close

Host: requestb.in

Accept-Language: ko-kr

Via: 1.1 vegur

X-Request-Id: 49c4d7f1-c604-4dc4-8021-6dec739a3d98

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Cookie: session=eyJyZWNlbnQiOlsiMTZlMHZ

Total-Route-Time: 0



iOS에서 쿠키를 사용하기


    iOS에서 쿠키 관리는 자동으로 이루어진다. 쿠키를 관리하기 위해 별도로 저장하거나 입력할 필요가 없다. 프로토콜 상에서 지원하는 'Set-Cookie'라는 키를 통해 서버에서 보내준다면 iOS는 NSHTTPCookieStorage에 자동으로 저장된다. 저장된 쿠키는 개발자가 임의로 'Cookie'라는 키로 다른 값이 입력되어 있지 않은 이상, 자동으로 도메인을 기준으로 NSHTTPCookieStorage에 저장된 쿠키가 입력된다. 아래의 그림은 예제 중에서 쿠키를 생성해서 NSHTTPCookieStorage에 저장하는 부분이다. 이처럼 설정한 경우, 개발자가 직접 설정한 쿠키가 없을 경우엔 지정한 도메인인 'requestb.in'으로 연결될 때마다 아래의 쿠키를 사용한다.





2014-12-03 09:39:00.618 WebViewTest[22815:81595] http cookie : (

    "<NSHTTPCookie version:0 name:\"access_token\" value:\"value\" expiresDate:(null) created:2014-12-03 00:38:26 +0000 (4.3926e+08) sessionOnly:TRUE domain:\"requestb.in\" path:\"/\" isSecure:FALSE>"

)


    위를 보면 NSHTTPCookieStorage에 저장된 쿠키의 모습을 확인할 수 있다. NSURLRequest를 이용해서 'requestb.in'으로 연결하면 된다. 위에서 언급한 것처럼 개발자가 쿠키를 직접 설정한 경우엔 쿠키가 자동으로 불러오지 못하기 때문에 아래와 같이 쿠키를 설정하지 않는다.


2014-12-03 09:39:10.835 WebViewTest[22815:81595] http headers : {

}


    위와 같이 쿠키를 직접 설정은 안 했지만 도메인으로 설정한 'requestb.in'에서 확인하면 아래와 같이 쿠키가 설정되어 있음을 확인할 수 있다. 만약서버에서 전달 받은 쿠키 외로 개발자의 임의로 쿠키를 설정해야만 한다면 'Cookie'라는 키로 NSURLRequest의 header에 추가하면 된다. 그럼, NSHTTPCookieStorage의 값을 자동으로 무시하게 된다.





    참고로 iOS에서 쿠키를 지원하는 프로토콜은 'http, https, file, ftp, data' 5가지이다. 쿠키 사용에 관한 정책은 아래의 3가지가 사용된다. Default는 'NSHTTPCookieAcceptPolicyAlways'가 사용된다.


  • NSHTTPCookieAcceptPolicyAlways : 모든 쿠키를 받아들인다.
  • NSHTTPCookieAcceptPolicyNever : 모든 쿠키를 거절한다.
  • NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain : Main Domain에 한해서만 쿠키를 받아들인다.



iOS NSHTTPCookieStorage tip


    iOS에서 NSHTTPCookieStorage는 UIWebView에 종속적이지 않고 app의 life cycle 종속적이다. 그렇기 때문에 app내에서 NSHTTPCookieStorag의 쿠키들은 모두 공유된다. NSHTTPCookie의 'NSHTTPCookieExpires'가 null이면 app의 종료와 함께 쿠키는 삭제되고 NSDate로 만료 일시가 설정이 되어있으면 app이 종료된 후에도 만료 일시까지 존속된다.



출처 : 위키피디아, Cookie and Custom Protocol in iOS, NSHTTPCookieStorage, NSHTTPCookie