[Android] 쿠키에 관하여
쿠키
여기서는 앱에 내려주는 쿠키형식에 관하여 이야기한다.
- [MDN] Set-Cookie
1. 세션 쿠키
1 | Set-Cookie: sessionId=38afes7a8 |
가장 간단한 형재는 key=value 형태로 되어있다.
Expires 속성 설명에 나와있듯이,
If unspecified, the cookie becomes a session cookie. A session finishes when the client shuts down, after which the session cookie is removed.
Expires 속성값이 지정되지 않으면 세션 쿠키이고, Chrome Inspector의 쿠키 리스트 중 expires 값에 “session”이라고 나타난다.
2. 지속(persistent) 쿠키
1 | Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT |
지속 쿠키는 Expires 값이 HTTP Date 형태로 지정된 값이다. 이는 GMT(그리니치 평균시)를 따르며 런던을 기점으로 하는 시각이고, 로컬 시각이 아니다.
⚠️ 한국의 경우 GMT+09:00으로 표현하나, Expires 속성값 마지막에 “GMT” 대신 “GMT+09:00”를 쓰더라도 “+09:00”는 무시되기 때문에 날짜는 항상 “GMT” 시간을 나타내는 점에 주의해야 한다.
이렇게 Expires 속성값이 지정된 쿠키는 지정된 만료 일자까지 살아있는다.
3. 안드로이드 웹뷰에도 세션 쿠키와 지속 쿠키가 나뉘어져서 보관되는가?
결론만 말하면, 그렇다.
이는 CookieManager의 removeSessionCookies()와 removeAllCookies() 메소드로 확인할 수 있다.
- 우선 expires 속성값이 내려오는 “test” 쿠키가 있다고 하자.
1
Set-Cookie: test=1; Expires=Thu, 20 Mar 2025 11:13:47 GMT+09:00; Domain=.megastudy.net; Path=/;
- 이를 앱에서 받아(받는 방법은 아래의 [okhttp3.CookieJar] 항목을 참조) cookieManager를 이용해 setCookie한다.
- removeSessionCookies()와 removeAllCookies()를 각각 수행하고 쿠키가 삭제되는지 확인한다.
그 결과는 다음과 같다.
| expires 속성 없음 | expires 속성 있음 | |
|---|---|---|
| removeSessionCookies | 삭제됨 | 삭제안됨 |
| removeAllCookies | 삭제됨 | 삭제됨 |
여기서 removeSessionCookie로 삭제되지 않는 값, 즉 expires 속성이 있는 쿠키값은 지속 쿠키로 간주할 수 있겠다.
CookieManager의 getCookie를 통해서는 쿠키의 이름과 값만 내려온다. 따라서 CookieManager를 통해 해당 쿠키의 만료일자 또는 만료여부를 판단할 수 있는 deprecated되지 않은 메소드는 없다.(CookieManager#removeExpiredCookie()는 deprecated되었다.) 그러나 앱 내부적으로 쿠키DB에 저장은 되고 있음을 inspector의 [Application] 탭 > 사이드바의 [Storage] > [Cookies] > [해당 도메인]으로 접근하여 expires 값이 세팅되어있음을 확인할 수 있다.

okhttp3.CookieJar
1 | val cookieManager = CookieManager.getInstance() |
CookieJar은 loadForRequest와 saveFromResponse 두 개의 함수를 구현하도록 되어 있다.
- loadForRequest: HTTP 요청을 보내 기 전에 요청에 사용할 쿠키를 반환한다.
- saveFromResponse: HTTP 응답으로부터 받은 쿠키를 저장소에 저장한다.
따라서 순서로 따지면 loadForRequest 후에 saveFromReponse가 호출된다.
이를 적용하는 코드는 다음과 같다.
1 | private val clientBuilder = OkHttpClient.Builder().apply { |
[Web/Attribute] Expires
Expires 속성을 가진 지속 쿠키를 웹으로부터 받아온 경우(CookieJar의 saveFromResponse로 확인) 이 만료 기간이 잘 작동하는지 확인하고자 하였다.
우선 아래와 같이 test 라는 이름의 쿠키를 추가한다.
1 | val time = SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US) |
Expires 속성값은 HTTP Date 형식으로 되어, GMT(그리니치 표준시)를 따른다. 이를 위해 타임존을 설정하면 로컬(한국)의 시간보다 9시간차이가 나는 값을 얻을 수 있다. 즉 아래 두 값은 같은 시각을 나타낸다고 보면 된다.
- Thu, 20 Mar 2025 15:00:00 GMT+09:00
- Thu, 20 Mar 2025 06:00:00 GMT
그리고 Expires 속성값은 1번을 넣어도 2번으로 인식하는 게 아니기 때문에 반드시 로컬 시간을 보정해주어야 하며 이를 위해 timeZone을 TimeZone.getTimeZone("GMT")로 설정한다.

그리고 해당 “test” 쿠키는 GMT 값에 따라 만료일이 경과하면 자동으로 사라지는 것을 inspector를 통해 확인할 수 있다.
[Android] 쿠키에 관하여