Akashic Records

Android에서 Httpclient와 WebView간 HttpSession 공유 본문

오래된글/Articles

Android에서 Httpclient와 WebView간 HttpSession 공유

Andrew's Akashic Records 2018. 4. 19. 15:06
728x90

요즘은 Mobile Application를 Hybrid Type으로 개발하는 것이 대세인 것 같습니다. App과 Web의 이동을 원활하게 하기 위해서 HttpSession를 사용하는 경우가 있습니다.

이 번 글에서는 Android에서 Httpclient와 WebView간 Session(사실은 Cookie)를 공유(사실은 Copy)하는 방법을 알아보겠습니다.


Example Case

  1. 기존 사용 중이던 Web Site을 최소한의 개발로 Mobile로 이식하길 원한다.

  2. Web Site는 사용자 인증를 거치게 되면 사용자 인증 정보를 HttpSession에 저장하게 되어 있다.

  3. 사용자 인증 부분은 Mobile App으로 개발한다. 사용자 인증을 위해 Login RESTful API을 신규로 개발한다.

  4. 그 외 화면은 Web Site 기존 Web Application을 최대한 활용하여 Mobile Web Application을 만든다.


Mobile App에서 사용자인증은 Httpclient이용하여  진행되고, Mobile Web은 WebView내에서 호출된다. 이 두가지 는 동일한 App에 있지만 마치 한 PC 두 개의 Browser 처럼 Cookie을 공유하지 못하지만 Cookie을 Copy 해주면 해결 됩니다.


Cookie Copy


HttpResponse response = httpclient.execute(httppost);


List<Cookie> cookies = httpclient.getCookieStore().getCookies();

if (!HMGWServiceHelper.cookies.isEmpty()) {


CookieSyncManager.createInstance(LoginActivity.this);

CookieManager cookieManager = CookieManager.getInstance();


Cookie sessionInfo = null;

for (Cookie cookie : cookies ) {

sessionInfo = cookie;

String cookieString = sessionInfo.getName() + "="

+ sessionInfo.getValue() + "; path="

+ sessionInfo.getPath();

cookieManager.setCookie(sessionInfo.getDomain(),cookieString);

CookieSyncManager.getInstance().sync();

}

}


Httpclient을 사용하여 Response가 온 이후에 httpclient.getCookieStore().getCookies();

로 Cookie을 가져옵니다.


CookieSyncManager.createInstance(LoginActivity.this);

CookieManager cookieManager = CookieManager.getInstance();

CookieManager는 App에서 관리되는 Cookie 저장소입니다. cookieManager에 Cookie을 복사할때는 문자열로 변경하여 저장해야 합니다.


WebView에서 사용방법

특별한게 없습니다. URL을 호출하면 됩니다.


Conclusion

Hybrid App에서 App과 Web 사이를 이동할 경우에 Session을 유지할 수 있는 방법을 살펴봤습니다. 하지만 우리는 중요한 문제에 대해서 고민 하지 않았습니다.


“Hybrid Web에서 HttpSession을 사용하는게 좋은가?”


저는 절대 추전하지 않겠습니다. 이유를 들자면..

  • Mobile 환경에서 Device의 할당 IP는 언제든지 변경될 소지가 있는데 이 경우 HttpSession은 IP에 따라 Bind 되기에 영속적일 수 없다.

  • App이 Background 상태에 있을 때 HttpSession이 만료된 경우 처리가 복잡하다.

  • Device와 WebServer 사이에 보안을 위해 Proxy나 Gateway을 둘 경우 HttpSession 사용 자체가 힘들다.(Domain이 Proxy나 Gateway을 바라보게 됩니다.)


제가 추천하는 방법은 사용자 인증 코드 전달 방식 입니다. Server로부터 사용자 코드를 부여 받고 WebURL 호출시 사용자 코드를 Header나 Parameter 넣는 방식입니다. 이런 방식은 나중에 보안 적용에도 유연합니다.


728x90
Comments