Android Network Protocol(HTTP, HTTPS 외)의 이해

2020. 1. 6. 21:49

네이버를 비롯한 많은 인터넷 웹 사이트는 모두 저마다 접속가능한 URL을 가지고 있다. HTTP 프로토콜의 이해에 앞서 URI, URN, URL의 개념을 정리해 본다.

 

 

URI(Uniform Resource Identifier)

 

  • 통합 자원 식별자
  • 인터넷에 있는 자원을 나타내는 유일한 주소
  • URI의 존재는 인터넷에서 요구되는 기본조건으로서 인터넷 프로토콜에 항상 붙어다님.
  • URI의 하위개념에 URN, URI이 포함되어 있다.
  • URI의 보편적인 형태가 URL인데, URI의 부분집합으로 볼수 있다.
    • 자원에 접근하기 위한 사용되는 절차
      • 어떤 자원을 가지고 있는 특정한 컴퓨터
      • 컴퓨터 상의 유니크한 자원의 이름(파일명)
  • http://myroute.co.kr/path/file.pdf?ver=1234 이라는 주소는 URI이지만, URL은 아니다.
    • http://myroute.co.kr/path/file.pdf 까지는 URL임(주소의 위치)
    • ver=1234 는 쿼리스트링의 값에 따라 결과가 달라지게 됨. 따라서 식별자 역할을 하고 있음.
  • http://myroute.co.kr/path/file.pdf?ver=1234 , http://myroute.co.kr/path/file.pdf?ver=5678 는 같은 URL을 가지고 있지만, 다른 URI를 가짐.

 

URN(Uniform Resource Name)

 

  • 위치와 상관없이 리소스의 이름값을 이용해서 접근하는 방식
  • 노출된 URL은 http://myroute.co.kr/path/file.pdf 인데, http://myroute.co.kr/diffpath/file.pdf 으로 요청을 보내면 404 response를 받는다. 이를 보완하기 위해서 위치 정보와는 무관하게 리소스를 찾을 수 있게 해주는 방식임
  • 해당 리소스의 위치 정보가 아닌 실제 리소스의 이름으로 사용하는 방식

 

URL(Uniform Resource Locator)

 

  • 자원
  • 에전에는 URL이 가르키는게 파일 소스
  • 요즘은 Rewrite등의 Apache, Tomcat 등의 핸들러 때문에 자원이라고 부름
  • 웹 사이트 주소가 요청하는 파일이라기 보다는 구분자로 보는 것
  • 웹 상에 서비스를 제공하는 각 서버들에 있는 파일의 위치를 표시하기 위한 것
    • http://myroute.co.kr/path/file.pdf 는 myroute.co.kr 서버에서 path 폴더 안의 file.pdf를 요청하는 것이다.

 

 

 

HTTP

 

 

HTTPS

 

 

HTTP2.0

 

 

안드로이드 HTTP Library의 역사

 

  • 2007년 11월 05일: 안드로이드 발표. HttpClient에는 여러 버그들 문제가 있었음
    • Apache의 DefaultHttpClient, AndroidHttpClient 등이 사용됨
    • HttpClient는 안정적이고, 방대한 API를 제공하였지만, 너무 방대했기 때문에 안드로이드 개발팀에서 지원하지 않게 됨(API 23부터 제외)
  • 2013년: 다양한 Library 등장
    • Volley나 Square의 Okhttp, Retrofit 등의 다양한 Library가 등장하여 쉽게 Http 통신을 사용할 수 있게 됨
    • 2013년 05월 06일: OkHttp 1.0.0이 릴리즈 됨
    • 2013년 05월 14일: Retrofit 1.0.0이 릴리즈 됨
    • 2013년 05월 21일: Volley가 릴리즈 됨
  • 2014년: 롤리팝 이후 HttpClient가 Deprecated
    • HttpClient를 베이스로 하는 Volley 도 Deprecated됨
  • 2016년: Android6.0에서 HttpClient가 삭제 됨
    • Okhttp와 그 래퍼인 Retrofit이 인기를 가짐
    • Retrofit은 클라이언트 부분과 콜백 형식등을 플러그로 변경할수 있다는점에서 인기를 가짐
    • 2016년 03월 12일: Retrofit2가 릴리즈 됨
  • 기타 ion: 간단히 사용할 수 있는 Library

 

Android의 HTTP 관련 버그 사례

대상 클래스 버그 설명 해결 버전
HttpURLConnection 커넥션 풀을 사용할 때 이전 커넥션에서 남아있던 데이터가 읽힌다.

Froyo
(Android 2.2)

HttpURLConnection HTTP 헤더의 이름이 소문자로만 되어서 일부 웹 서버에서 잘 인식되지 않는다. Gingerbread
(Android 2.3)

HttpsURLConnection,

DefaultHttpClient

SSL 인증 시 SNI(Server Name Identification)를 지원하지 않아 인증 실패 에러(javax.net.ssl.SSLException: Not trusted server certificate)가 발생한다. Gingerbread
(Android 2.3)
URLConnection DIGEST 인증에 실패한다. Gingerbread
(Android 2.3)
AndroidHttpClient HTTPS로 첫 번째 POST 요청에서 응답이 느리다. Ice Cream Sandwich
(Android 4.0)
HttpURLConnection Gzip 압축과 HEAD 메서드를 동시에 사용하면 에러(java.io.IOException: unexpected end of stream)가 발생한다. Jelly Bean
(Android 4.1)

 

 

인증

 

HTTP 인증은 웹 서버 및 브라우저가 사용자 이름 및 비밀번호와 같은 신임 정보를 안전하게 교환하는 방법을 사용한다. HTTP 인증 또는 HTTP 프로토콜을 통해 MD5 암호화 해싱 인코딩 기술 및 사전 정의 된 방법 / 표준을 따르는 다이제스트(DIGEST) 인증으로 호출할 수 있다.

 

Basic 인증

 

클라이언트의 사용자 이름과 암호가 Base64로 인코딩된 문자열을 보낸다. Base64는 암호화 형식이 아니므로 사용자 이름 및 암호를 일반 텍스트로 보내는 것과 동일하다고 간주해야한다. 리소스를 보호해야 하는 경우 Basic 인증이 아닌 다른 인증 방법을 사용하는 것을 권고한다.

 

Digest 인증

 

Basic 인증을 대체하기 위한 인증 방법이다. 서버에서는 nonce라는 난수 데이터 문자열을 클라이언트에게 보낸다. 클라이언트에서는 추가 정보 중에서 사용자 이름, 암호 및 nonce를 포함하는 해시를 사용하여 응답한다. 이러한 교환 과정에서 복잡성 및 데이터 해시 때문에 Digest 인증 방법을 사용하는 사용자의 자격 증명을 도용하거나 재사용하기가 힘들다.

 

  • 비밀번호를 네트워크를 통해 평문으로 전송하지 않음
  • 인증 체결을 가로채서 재현하지 못함
  • 구현 방법에 따라 메세지 내용 위조 방지 가능