개발새발 - IT 기술블로그
article thumbnail

안녕하세요. 이번 포스팅은 웹뷰 시리즈 4번째인 웹뷰에서 쿠키 사용해보기 입니다.

 

지난 시리즈 동안 웹뷰를 직접 만들어보기도 하고, 생성 및 소멸 단계에 대해 알아보기도 하고, 캐시에 대한 개념도 공부해 보았는데요.

 

이번엔 웹 페이지에 데이터를 저장하고 불러오는 쿠키와 세션에 대해 학습해보겠습니다.

 

 

 

 

지난 포스팅이 궁금하신 분들은 아래 링크를 참고해주세요!

 

2022.12.26 - [Android] - [안드로이드] 웹뷰(WebView)(1) - 앱 브라우저에서 호출

2023.01.03 - [Android] - [안드로이드] 웹뷰(WebView)(2) - 접근과 제어

2023.09.04 - [Android] - [안드로이드] 웹뷰(WebView)(3) - 브라우저 캐시 사용하기

 

 





 

쿠키란?


쿠키(Cookie)는 웹페이지에서 관리하는 소규모 데이터 저장소입니다.

보통 데이터를 저장하고 가지고 있다가 동일한 URL에 재 접근할 때 서버에 보내는 요청 값과 함께 전달됩니다.

 

 

쿠키 사용의 목적

쿠키는 주로 사용자의 편의성을 증진시키기 위함에 목적이 있습니다.

 

같은 사이트에 다시 접속할 때 매번 같은 과정을 거쳐야 한다면 불편함이 생길 수 있기 때문에, 내가 올바른 사용자임을 증명하는 데이터들을 담아두고 일련의 과정들을 생략하는 경우에 사용 되기도 하죠.

 

또한,  테마나 언어 등 개인 설정을 저장하는데도 유용하게 사용됩니다. 

 

이런 사용 방식들은 HTTP의 특성과 관련이 있는데요. HTTP는 1 대 N의 구조이기 때문에 효율성을 고려하여 비연결성(Connectionless)무상태성(Stateless)의 특성을 가집니다.

 

 

 

출처 : 이건회님 velog

 

 

 

위와 같이 통신이 종료되면 연결에 사용되었던 정보들을 모두 잃습니다. 즉, 짧은 시간 내에 통신에 사용했던 정보들이 있더라도 다시 시도해야 한다는 의미가 됩니다.

 

따라서 우리는 쿠키를 사용하여 서버의 상태를 저장하고 웹 사이트의 활동들을 사용자와 연결시켜, 쿠키의 세션이 유지되는 동안 즐겨찾기 했던 목록이 유지되기도 하고, 장바구니에 물건이 사라지지 않기도 하고, 로그인을 다시 할 필요가 없게끔 만듭니다.

 

 

쿠키는 어디에 저장되나요?

쿠키는 기본적으로  웹 브라우저에 저장됩니다. 크롬 브라우저의 경우 Cookies라는 파일에 저장됩니다. 개발자 도구의 '애플리케이션' 탭에서 쉽게 확인이 가능하죠.

 

그렇기 때문에 쿠키에 중요한 사용자 정보를 담는것은 보안상 위험할 수 있습니다. 나중에 등장하는 세션이라는 기술과 같이 사용되는 이유가 됩니다.

 

안드로이드의 경우 CookieManager 라는 객체를 통해 쿠키 데이터를 전달하고 전달 받습니다.

 

 

 

세션이란?

쿠키와 같이 등장하는 개념인 세션입니다. 세션은 일정시간 동안 서버에 요청되는 동일한 작업들을 하나의 상태로서 취급하고, 그 시간동안 인증상태를 유지하는 기술입니다.

 

세션은 쿠키를 기반하고 있지만, 브라우저에 데이터를 저장하는 쿠키와 달리 서버에서 데이터를 관리한다는 차이점이 있습니다.

 

데이터를 서버에서 관리한다는 말은 외부에서 접근하기 어렵다는 이야기가 되고, 이는 보안적으로 쿠키보다 더 우수하다는 말이됩니다.

 

또한, 세션은 클라이언트의 구분을 위해 클라이언트 정보가 담긴 세션ID를 지급하고, 그 세션ID가 유지되는 동안 정보가 유실되지 않도록 합니다.

 

 

하지만 서버에서 데이터를 관리하는 만큼 사용자 수가 늘어날수록 부하가 커진다는 것을 의미하기도 하죠.

 

 

세션의 사용

세션은 주로 쿠키와 같이 사용되는 경우가 많습니다.

 

새 클라이언트가 서버에 접근할 때 세션은 클라이언트를 구분짓기 위해 소멸 기한이 있는 세션ID를 부여하게 되고, 이때 서버는 이 세션ID를 쿠키에 담아 기억하고 있습니다.

 

클라이언트는 이제부터 서버에 요청을 보낼 때 세션ID를 같이 담아서 보내게 되고, 서버는 세션ID의 유효성을 검사한 후 세션ID에 있는 클라이언트의 정보를 사용하게 됩니다.

 

이후 클라이언트의 요청에 응답값을 보내는 것으로 통신이 종료되게 되는 구조이죠.

 

 

출처 : Microsoft ASP.NET - Web API

 

 

 

뭔가 구조가 로그인 서비스와 매우 유사한 것 같지 않나요? 그래서 세션은 주로 로그인과 연계되어 사용되는 경우가 매우 많습니다.

 

 

 

쿠키 사용하기


앞서 말씀드린 것 처럼 쿠키는 CookieManager 객체를 사용합니다.

 

Android 21 이전에는 CookieSyncManager를 통해 페이지 생성 소멸에 따라 싱크를 맞춰주어야 했지만, 이젠 자동으로 쿠키 매니저가 싱크를 조절하여 Deprecated 되었습니다.

 

 

WebView 생성하기

기존 시리즈의 웹뷰 생성과 동일합니다.

val webView = findViewById<WebView>(R.id.webView)

webView.apply {
    this.webChromeClient = WebChromeClient()
    this.webViewClient = WebViewClient()
}

webView.settings.apply {
    this.javaScriptEnabled = true
    this.useWideViewPort = true
}

 

 

CookieManager 생성하기

private val cookieManager by lazy {CookieManager.getInstance()}
cookieManager.apply {
    this.acceptCookie()
    this.acceptThirdPartyCookies(webView)
}

 

 

쿠키 확인하기

private fun hasCookies(): Boolean {
    return cookieManager.hasCookies()
}

 

 

쿠키 불러오기

private fun getCookie(key: String?): String? {
    return cookieManager.getCookie(key)
}

 

 

쿠키 저장하기

private fun setCookie(key: String?, value: String?) {
    cookieManager.setCookie(key,value)
}

 

 

쿠키 초기화하기

private fun clearCookie() {
    val callback = ValueCallback<Boolean> {
        println(if(it) "success to remove" else "fail to remove")
    }
    cookieManager.removeAllCookies(callback)
}

 

 

setCookie로 해당 URL에 쿠키를 (key,value) 형식으로 저장시키고, getCookie로 해당 URL에서 key에 해당하는 쿠키를 받아오시면 됩니다.

 

또한, clearCookie로 저장된 모든 쿠키를 삭제할 수도 있고, hasCookies로 쿠키가 비어있는지에 대한 여부도 확인 가능합니다.

 

 

 

마무리


이렇게 쿠키와 세션의 개념들을 알아보았습니다.

 

사실 안드로이드 보다는 웹의 비율이 더 큰 포스팅이었네요.

 

그래도 웹뷰를 딥하게 사용하려면 꼭 알아두어야 하는 개념이니, 도움이 되셨으면 합니다.

 

 

감사합니다.