Tag Archives: 쿠키

[Android] WebView 사용시에 쿠키 동기화 문제 해결하기

안드로이드 기반의 WebView를 사용하다 보면 쿠키와 관련 부분의 동작이 조금 이상한 것을 발견하실 수 있습니다. 예를 들자면 로그인을 했는데 사용중에 갑자기 로그인이 풀려버린다거나 로그아웃을 아무리 해도 로그아웃처리가 되지 않는 문제가 있습니다.

이러한 문제는 실제로 어플리케이션이 할당 받은 메모리 영역(RAM)과 전체 쿠기가 보관되는 지역 저장소간의 동기화가 제대로 이루어지지 못하는데서 발생하는 문제입니다. 다음에서 보여드릴 CookieSyncManager를 이용하여 이 문제를 해결할 수 있습니다.

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);         
    setContentView(R.layout.main);
        
    CookieSyncManager.createInstance(this);
}

위와같이 onCreate내에서 싱크를 시작하여 주도록 합시다. 이 명령은 어플리케이션의 가장 Host가 되는 액티비티의 생성시에 호출해 주시면 됩니다. 액티비티마다 매번 호출하실 필요가 없습니다.

@Override
protected void onResume()
{
    super.onResume();
    CookieSyncManager.getInstance().startSync();
}

위의 명령을 onResume() 메서드 안에서 구현해 주도록 합시다.

@Override
protected void onPause()
{
    super.onPause();
    CookieSyncManager.getInstance().stopSync();
}

위의 명령을 onPause() 메서드 안에서 구현해 주도록 합시다. 위와 같은 과정을 통해 어플리케이션이 실행되면 쿠키싱크 매니저의 인스턴스를 생성하고 어플리케이션이 중지 상태로 들어가게 되면 싱크를 중단시켜 외부의 어플리케이션에 의해 쿠키가 꼬이는것을 방지하여 줍니다. 이후에 어플리케이션이 다시 시작되면 쿠키 동기화를 재시작합니다.

실제로 제작했던 어플리케이션의 쿠키 문제가 “정말 아주 간헐적”으로 발생해서 원인을 찾기도 어려웠는데 위와같은 처리를 하고나니 아무런 문제없이 해결이 되었네요.

참고 : http://stackoverflow.com/questions/2566485/webview-and-cookies-on-android

CookieUtil Class

예전 게시판 만들다가 만들었던 쿠키 관련 유틸 클래스이다.
URLDecoder의 decode가 deprecation되었는데, 어떻게 강제로 해버렸다.
좀더 깔끔한 해결책 아시는분은 알려주시면 감사하겠습니다.

[CODE]import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieUtil
{
 public static boolean setCookie(HttpServletResponse response, String name, String value)
 {
  try
  {
   Cookie cookie = new Cookie(name, URLEncoder.encode(value, “EUC-KR”));
   cookie.setMaxAge(24*60*60);
   response.addCookie(cookie);
   
   return true;
  }
  catch (UnsupportedEncodingException e)
  {
   e.printStackTrace();
   
   return false;
  }
 }
 
 @SuppressWarnings(“deprecation”)
 public static String getCookie(HttpServletRequest request, String name)
 {
  Cookie[] cookies = request.getCookies();
  if(cookies == null)
  {
   return “”;
  }
 
  for(int i = 0 ; i < cookies.length ; i++)
  {
   if(cookies[i].getName().equals(name))
   {
    return URLDecoder.decode(cookies[i].getValue());
   }
  }
 
  return “”;
 }
}[/CODE]

사용할때는 비즈니스 로직에 다음과 같이 사용하면 되겠다.
쿠키를 저장할때 :
[CODE]CookieUtil.setCookie(response, “name”, boardForm.getName());
CookieUtil.setCookie(response, “email”, boardForm.getEmail());[/CODE]

쿠키를 읽어올때 :
[CODE]request.setAttribute(“name”, CookieUtil.getCookie(request, “name”));
request.setAttribute(“email”, CookieUtil.getCookie(request, “email”));[/CODE]