TLS는 일명 SSL 3.1이라고도 불린다. 그러니 TLS가 무엇인지 모른다면 미닉스 님의 “SSL이란 무엇인가?” 1편, 2편(만화)부터 대충 살펴보자. 이 만화보다 쉽게 SSL을 설명한 글은 본적이 없다. 유용할 것이다.
HttpsUrlConnection에서는 TLS Intolerance Support를 지원한다. 안드로이드의 TLS Intorenace Support 소개를 보면
This class attempts to create secure connections using common TLS extensions and SSL deflate compression. Should that fail, the connection will be retried with SSLv3 only.
라고 한다. 번역하면, 이 클래스는 TLS 확장과 SSL 디플레이트(DEFLATE) 압축을 이용해 안전한 연결을 만들려 시도한다. 그 시도가 실패하면, SSLv3만을 protocol 로 지원하는 방법으로 연결을 재시도 한다. 라고 볼 수 있다.
안드로이드에는 기본으로 내장된 HTTP client가 크게 HttpClient와 UrlConnection으로 두개다. (AndroidHttpClient는 요즘 많이 쓰이지 않으니 빼자.) HttpClient에서는 TLS Intolerance Support기능을 제공하지 않고, UrlConnection(의 HttpsUrlConnection)은 제공한다.
처음에 제공되었던 원인은 이글(영문)을 참조할만 하다. 간략하게 요약하면 서버 버그로 정상적으로 처리되야할 연결이 실패할 수 있기 때문에, 하위버전의 protocol을 이용해 재시도해야 한다는 내용이다. 그러므로, 안드로이드에서는 HttpsUrlConnection에서는 SSLv3를 이용해 자동으로 재시도하는 기능을 추가함으로서 클라이언트 개발자에게 편의를 제공하려고 했다.
허나, 이전 글의 초반에 설명했듯이 POODLE 취약점으로 인해 많은 유명 서비스들에서 SSLv3를 지원하지 않고, 앞으로도 그럴 것이기 때문에 이 기능은 더이상 유용하다고 보기 어렵다. 만약, TLS에서 에러가 발생한다면 SSLv3를 지원하지 않는 서버의 경우 이 글 처럼 다시한번 SSLHandshakeException을 만나게 될 것이다.
대신 권장하는 기능은, TLS 1.2에서 실패했다면 TLS 1.1이나 TLS 1.0으로 재시도해야할 것이다.
참조