에러
android app 을 개발하면서 glide4 라이브러리를 사용하여
http protocol 의 이미지 resource 를 load 하던 중
아래와 같은 에러를 만나게 되었습니다.
W/Glide: Load failed for http://postfiles2.naver.net/20110128_97/opineo_1296174613378E0Ouo_JPEG/%BD%C5%BC%BC%B0%E6.jpg?type=w3 with size [1080x1080]
class com.bumptech.glide.load.engine.GlideException: Failed to load resource
There was 1 cause:
java.io.IOException(Cleartext HTTP traffic to postfiles2.naver.net not permitted)
call GlideException#logRootCauses(String) for more detail
Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class java.io.InputStream, REMOTE
There was 1 cause:
java.io.IOException(Cleartext HTTP traffic to postfiles2.naver.net not permitted)
call GlideException#logRootCauses(String) for more detail
Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetch failed
There was 1 cause:
java.io.IOException(Cleartext HTTP traffic to postfiles2.naver.net not permitted)
call GlideException#logRootCauses(String) for more detail
Cause (1 of 1): class java.io.IOException: Cleartext HTTP traffic to postfiles2.naver.net not permitted
I/Glide: Root cause (1 of 1)
java.io.IOException: Cleartext HTTP traffic to postfiles2.naver.net not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:124)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:462)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
at com.bumptech.glide.load.data.HttpUrlFetcher.loadDataWithRedirects(HttpUrlFetcher.java:100)
at com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:56)
at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100)
at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.startNextOrFail(MultiModelLoader.java:164)
at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.onLoadFailed(MultiModelLoader.java:154)
at com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:62)
at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100)
at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:63)
at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:310)
at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:279)
at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:431)
원인
처음에는 glide 버전을 업그레이드 하면서 생기는 이슈 인줄 알았지만.
정보를 검색해본 결과 Android 10.0 (API 29) 부터 강화된 네트워크 보안정책으로 인해 생기는 에러였습니다.
따로 설정을 하지 않을 경우 기본적으로 https 프로토콜 만을 허용하며, http 프로토콜은 사용 할 수 없습니다.
해결책
1. usesCleartextTraffic
cleartext HTTP 와 같은 cleartext 네트워크 트래픽을 사용할지 여부를 나타내는 flag 로
이 플래그가 false 로 되어 있으면 플랫폼 구성 요소(예 : HTTP 및 FTP 스택, DownloadManager, MediaPlayer)는
일반 텍스트 트래픽 사용에 대한 앱의 요청을 거부하게 됩니다.
AndroidManifest.xml 의 application 태그에 이 flag 를 설정하게 되면
모든 cleartext 트래픽은 허용처리가 됩니다.
<application
...
android:usesCleartextTraffic="true">
</application>
2. networkSecurityConfig
res/xml/network_security_config.xml 에 파일을 하나 만들고 아래와 같이 추가합니다.
cleartextTrafficPermitted = true 일 때
domain 태그에 등록된 도메인은 https 가 아니라도 허용이 됩니다.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">example.com</domain>
</domain-config>
</network-security-config>
cleartextTrafficPermitted = false 일 때
domain 태그에 등록된 해당 도메인만 항상 https 로 허용됩니다.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">example.com</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml 파일에 만들어준 network_security_config.xml 파일을 추가합니다.
networkSecurityConfig attr 에 추가하여 줍니다.
<application
...
android:networkSecurityConfig="@xml/network_security_config">
</application>
3. targetSandboxVersion
SandboxVersion 속성값이 높을수록 보안 수준이 높아지며, 2일 경우 usesCleartextTraffic 의 기본값은 false 입니다.
따라서 이 속성의 값을 1로 변경하면 문제를 해결할 수 있습니다.
다만 Android 8.0 (API 26) 이상을 타겟팅하는 Android Instant Apps 의 경우 이 속성을 2로 설정해야합니다.
참고로 앱이 설치되면 이 속성값을 더 높은 값으로 만 업데이트 할 수 있다고합니다.
이 속성값을 다운 그레이드하려면 앱을 제거후 재설치 해야합니다.
SandboxVersion 값이 높아질 수록 높은 수준의 보안을 의미 합니다.
기본값은 1 로 설정되어 있으며 2 까지 설정할 수 있습니다.
<manifest
...
android:targetSandboxVersion="1">
</manifest>
앱이 한번 설치되고 나면 이후부터는 속성값을 올릴 수만 있고
내리려면 앱을 삭제 후 재설치하여야 합니다.
Android 8.0 (API 26) 이상을 target 으로 하는 앱은 이 속성을 무조건 2 이상으로 설정하여야합니다.
속성 값이 2 이상 일 경우 usesCleartextTraffic 의 기본 값이 false 로 설정 됩니다.
이상으로 포스팅을 마치겠습니다.
봐주셔서 감사합니다.
'Develop > Error Box' 카테고리의 다른 글
[Android] - logcat: Unexpected EOF! Error (2) | 2021.03.02 |
---|---|
[Android] W/ExifInterface: Invalid image: ExifInterface got an unsupported image format.... (0) | 2020.10.20 |
[Android] SDK licence accepted 문제 (0) | 2020.04.07 |
[Android] New Gradle Sync is not supported due to containing Kotlin modules (0) | 2020.04.07 |
[Android] sendUserActionEvent() mView == null (0) | 2020.04.06 |