이번에 안드로이드 쪽에서 WebView의 특정 쿠키를 삭제해달라는 의뢰를 받았는데
이상하게 해당 쿠키가 탐색조차 안되길래 여러 방법을 써서 알아낸 정보를 공유 해드리겠습니다.
WebView에서 원하는 쿠키가 존재하는지 찾아보기
기본적으로 CookieManager의 getCookie 함수를 사용하면 해당 도메인의 모든 쿠키를 String 형태의 데이터로 받아볼 수 있습니다.
val cookieManager = CookieManager.getInstance()
var cookieValue = cookieManager.getCookie(domainName)
그래서 위와 같이 코드를 작성하고 cookieValue를 살펴보니...
제가 원하는 쿠키가 cookieValue에는 없었습니다.
그래서 다음과 같이 디버깅 모드로 확인하니 디버그 모드에서는 확인이 됩니다.
그래서 다른 쿠키들과 차이점을 보니까 다음과 같이 HttpOnly라는 곳에 체크가 있는데 이게 원인인가 싶어서 확인해봤습니다.
HttpOnly 란?
HttpOnly 쿠키 속성을 사용하면 JavaScript를 통해 쿠키에 접근할 수 없게 되어, 악성 스크립트를 통해 쿠키 값에 접근하는 것을 막아준다.
HTTP Only Cookie 를 활성화 하기 위해서는 쿠키를 생성할 때, 가장 마지막에 HttpOnly 라는 접미사를 추가하면 된다.
라고 되어있는데...
Android의 WebView는 자바 스크립트랑 상관이 없는거 같은데 왜 안되는지 이해가 안갔습니다.
그래서 그냥 안되는건가... 했는데 iOS에서는 해당 쿠키를 볼 수 있네요??
그래서 HttpOnly은 원인이 아니라고 생각했습니다.
getCookie() 함수에서 Path를 지정하기
또 다른 차이점은 해당 쿠키는 Path가 지정되어 있다는 것입니다.
분명 해당 도메인의 모든 쿠키를 다 가져올거라 생각했는데
혹시 Path까지 지정해야하는가? 해서 다음과 같이 Path도 넣어줬습니다.
val cookieManager = CookieManager.getInstance()
var cookieValue = cookieManager.getCookie("$domainName$LOGIN_SESSION_DOMAIN_PATH")
이렇게 하니 cookieValue에서 해당 쿠키까지 가져오는 것을 확인할 수 있었습니다.
setCookie() 함수를 사용해서 해당 쿠키 삭제하기
CookieManager의 setCookie() 함수를 사용해서 특정 쿠키를 삭제하는 방법은 다음과 같습니다.
setCookie() 함수에 함수 이름과 만기일(=Expires)를 지정해서 강제로 해당 쿠기가 삭제되도록 하는 것입니다.
그래서 다음과 같이 코드를 만들었습니다.
val cookieManager = CookieManager.getInstance()
var cookieValue = cookieManager.getCookie("$domainName$LOGIN_SESSION_DOMAIN_PATH")
if (cookieValue != null && cookieValue.contains(cookieName)) {
cookieManager.setCookie(domainName, "$cookieName=; Expires=Thu, 01 Jan 1970 00:00:00 GMT")
cookieManager.flush()
}
그런데!! 분명히 해당 Cookie가 존재하고 setCookie()를 사용해서 삭제했다고 생각했는데...
그대로 있네요??
(참고로 setCookie()는 결과를 boolean 으로 반환하지 않기 때문에 실행 결과를 알 수 없습니다.)
그래서 setCookie의 문서를 참조한 결과
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Set-Cookie
setCookie 또한 Path까지 지정해줘야 한다는 것을 알았습니다.
그래서 다음과 같이 코드를 수정했습니다.
val cookieManager = CookieManager.getInstance()
var cookieValue = cookieManager.getCookie("$domainName$LOGIN_SESSION_DOMAIN_PATH")
if (cookieValue != null && cookieValue.contains(cookieName)) {
cookieManager.setCookie(domainName, "$cookieName=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=$LOGIN_SESSION_DOMAIN_PATH")
cookieManager.flush()
}
여기서 cookieName과 도메인, Path를 대충 예를 들어 넣어보면 다음과 같이 적을 수 있습니다.
val cookieManager = CookieManager.getInstance()
var cookieValue = cookieManager.getCookie("https://example.com")
if (cookieValue != null && cookieValue.contains("cookieName")) {
cookieManager.setCookie("https://example.com", "cookieName=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/example/path")
cookieManager.flush()
}
Android에서 특정 Cookie 삭제하기 결과
해당 Cookie에 Path가 정의되어 있다면 해당 Path까지 지정해야 쿠키 정보도 얻을 수 있고
삭제도 가능하다는 것을 알게 되었습니다.
'안드로이드(kotlin)' 카테고리의 다른 글
안드로이드 XML로 된 프로젝트를 Compose로 변환하기 (6) | 2024.10.21 |
---|---|
안드로이드 현재 액티비티 Stack 확인하기 (0) | 2023.12.27 |
DiffUtil를 BaseAdapter로 하여 쉽게 RecyclerView만들기 (1) | 2023.11.12 |
Unsupported Java. Your build is currently configured to use Java 20.0.1 and Gradle 8.0. (0) | 2023.05.31 |
안드로이드 코틀린 EncryptedSharedPreferences 사용 방법 (0) | 2023.05.28 |
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
댓글