안드로이드(Android) Apache Http Client의 SSL 성능개선을 위한 SSLSessionCache 사용하기

안드로이드 애플리케이션이 서버에 연결하는 프로토콜로 Http를 많이 사용하고 있고, 보안 이슈로 Https를 주로 사용한다. 안드로이드 Http/Https 통신을 하기 위해서는 Apache HTTP Client나 자바의 HttpUrlConnection(HttpsURLConnection)을 사용하는 방법이 있다. 공식 블로그에서는 진저브레드(Gingerbread) 이상에서는 HttpURLConnection을 사용하기를 권장하고 있고, 그 이하에서는 Apache HTTP Client를 권장하고 있다. 하지만, 현실적으로 HttpURLConnection보다 Apache HTTP Client를 더 많이 사용하고 있을 것으로 예상하고 있다. 제가 사용하는 방법은 양 쪽을 같이 혼용해서 사용하고 있다.

SSLSessionCache 클래스는 API 문서를 보면 도움이 된다. 2개의 옵션을 제공하는데, 세션캐시를 특정위치에 저장할 수 있거나, 기본 위치에 저장하는 등의 기능을 제공한다.

아래의 코드는 HttpClient를 생성하는 메서드이다. 아래 강조된 부분이 SSL에 SSLSessionCache를 사용하게 해 주는 코드이다.

 public static synchronized HttpClient createHttpClient(Context c, int cTimeout, int sTimeout) {
	// Use a session cache for SSL sockets

	SSLSessionCache sessionCache = c == null ? null : new SSLSessionCache(c);
        
	// sets up parameters
	HttpParams params = new BasicHttpParams();
	HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
	HttpProtocolParams.setContentCharset(params, “utf-8″);
	HttpConnectionParams.setConnectionTimeout(params, cTimeout);
	HttpConnectionParams.setSoTimeout(params, sTimeout);
	params.setBooleanParameter(“http.protocol.expect-continue”, false);
	// registers schemes for both http and https
	SchemeRegistry registry = new SchemeRegistry();
	registry.register(new Scheme(“http”, PlainSocketFactory.getSocketFactory(), 80));
	final SSLSocketFactory sslSocketFactory = SSLCertificateSocketFactory.getHttpSocketFactory(sTimeout, sessionCache);
	//sslSocketFactory.setHostnameVerifier(SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
	sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
	registry.register(new Scheme(“https”, sslSocketFactory, 443));
	ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);
	return new DefaultHttpClient(manager, params);
}

* Reference
http://hi-android.info/src/android/net/http/AndroidHttpClient.java.html
http://na.isobar.com/2011/best-way-to-use-httpclient-in-android/

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.