ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 네트워크 프로그래밍 HTTP 통신
    Android/Network 2019. 7. 18. 22:42

    흔히 우리가 안드로이드 네트워크 프로그래밍을 하면 소켓 통신, HTTP 통신 두가지를 떠올리고는 한다 ( FCM )?

     

    그 중 HTTP 통신은 REST API을 통해서 데이터를 서버와 클라우드가 주고 받는다.

    HTTP 통신을 하는 방법에는 여러가지가 있다

     

    - HttpURLConnection

    - HttpClient

    - Volley

    - Retrofit

     

    HttpURLConnection 와 HttpClient

     

    안드로이드 네트워킹 프로그래밍 관련된 게시글 들을 보면 HttpClient관련해서

    HttpURLConnection이 아닌 HttpClient를 사용한 예제들이 많이 보이는데

     

    HttpClient는 ApacheHttp 라이브러리 이다.

    안드로이드의 초기 HttpURLConnection 부분에서 내부적인 문제가 있어 표준 라이브러리에 포함되어 많이 사용하던 라이브러리 인데 Android 6.0에서는 Apache HTTP 클라이언트에 대한 지원을 제거 하였다.

     

    추가적으로 Android 0부터는 이 라이브러리가 bootclasspath에서 제거되고 기본적으로 앱에서 사용할 수 없다.

    하지만 완전히 사용할 수 없는 것이 아닌 Menifest에 아래 코드 한줄을 추가해주면 계속 사용할 수 있다.

     

    <uses-library android:name="org.apache.http.legacy" android:required="false"/>

     

    그러면 궁금증이 생기는 한가지!

    HttpURLConnection 클래스 버그는 분명히 수정되었을텐데 왜 사용하지 않을까?

    HttpClient또한 유틸 라이브러리 이며 기존에 사용하면 HttpClient 코드를 누가 다 바꿀 것인가..

    라는 생각에 궁금증은 바로 해결 되었다.

     

    Android 9.0 Http 제약

     

    많은 변화가 있는 Android 9.0 에서 네트워크 관련해서 한가지 보안 정책이 변경되었다..

     

    이전코드를 Android 9.0에서 테스트를 해본다면 아래와 같은 에러를 발견한다.

    com.android.volley.NoConnectionError: java.io.IOException Cleartext HTTP....

    바로 Android API 28 부터 네트워크 보안 정책이 변경되었다.

    https는 문제가 없는데 http인 경우에는 별도의 설정이 필요하게 되었다..

    아무래도 https 는 보안이 강화되어 있고 http 에서 https로 변경되는 추세이다 보니

    안드로이드에서도 보안을 강화 시킨것이 아닌가 싶다.

     

    위의 오류를 해결 하는 방법은 3가지가 있다..

     

    (1) http 사이트는 아에 허용하지 않는다.

    사실 이거는 말이 안된다...

     

    (2) usesCleartextTraffic 설정

    AndroidManifest.xml 파일의 <application> 부분에 android:usesCleartextTraffic="true" 로 설정 하면 된다.

     

    (3) network_security_config 설정

    res/xml/network_config.xml 파일을 생성해주고 아래와 같이 작성을 해준다

    <?xml version="1.0" encoding="utf-8"?>
    <!-- http 프로토콜을 허용하려면 등록해야 한다.-->
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">10.5.6.100</domain>
        </domain-config>
    </network-security-config>

    domain에는 허용할 사이트의 주소를 입력해주면 된다.

     

    그 후 AndroidManifest.xml 파일의 <application> 부분에 아래 와 같이 작성하면 된다.

    android:networkSecurityConfig="@xml/network_config"

     

    다음 포스팅에서는 HttpURLConnection을 이용한 통신을 해보도록 하겠다.

    'Android > Network' 카테고리의 다른 글

    Volley를 이용한 HTTP 통신  (0) 2019.07.23
    HttpURLConnection을 이용한 HTTP 통신  (0) 2019.07.22
    웹서버의 데이터를 받아오자! Retrofit2  (0) 2019.06.17

    댓글

Designed by Tistory.