ATS(App Transport Security) 예외 도메인을 적용했는데도 ATS 오류가 날 때 확인 방법

ATS?

WWDC 2016에서 발표된 ATS (App Transport Security) 도입은 iOS9부터 적용되었습니다.

SSL 통신을 해야하고 최소 TLSv1.2를 만족해야 하며, 인증서는 SHA256 이상의 해쉬 알고리즘으로 서명되어야 한다는 의미입니다.
하지만 이를 당장에 만족시키기에는 무리다보니 선택적으로 적용되었고 2016년 12월말까지는 필수 적용을 해야한다고 발표했습니다.
(그 후 연기가 되었고 지금은 어떤지 모르겠습니다..)

하지만 ATS를 설정한 이후에는 규칙과 예외 도메인을 관리해야하니 귀찮긴합니다…
설정하는 디테일 한 방법은 이 글에서 설명을 하진 않겠습니다.

오류 발생

ATS를 잘 정의했는데 관련 도메인의 추가 등의 이슈로 어느 순간 만날 수 있는 오류 메시지가 있습니다.

Connection failed: Error Domain=NSURLErrorDomain Code=-1022 “The
resource could not be loaded because the App Transport Security policy
requires the use of a secure connection.”
UserInfo={NSUnderlyingError=0x7fada0f31880 {Error
Domain=kCFErrorDomainCFNetwork Code=-1022 “(null)”},
NSErrorFailingURLStringKey=MyServiceURL,
NSErrorFailingURLKey=MyServiceURL, NSLocalizedDescription=The resource
could not be loaded because the App Transport Security policy requires
the use of a secure connection.}

The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

이 문구를 통해서 특정 도메인이 ATS를 통과하지 못하고 있구나란 걸 알 수 있겠죠.

문제는 어떻게 해결할 것인가 입니다.

검색을 해보면 다양한 방법들이 소개되고 있는데 사실 저에게는 대부분이 쓸모없는 방법들이었습니다.
(그 중 가장 최악은 NSAllowsArbitraryLoads 값을 true로 바꾼다인데 첨부터 이럴거였으면 굳이 이런 문제에도 부딪치지 않았겠죠?)

문제가 되는 도메인 찾기

여러 방법으로 workaround를 찾다가 한 애플 Technote를 발견했습니다.
이 문서에는 CFNetwork Diagnostic Logging 을 활성화 하는 방법을 소개하고 있습니다.
방법을 간략히 적어보자면, 프로젝트의 scheme에 환경 변수(Environment Variables)에 CFNETWORK_DIAGNOSTICS 를 추가하고 원하는 레벨을 0~3 사이의 숫자를 입력하고 디버깅을 하게되면 로그 화면에 네트워크 관련정보가 나타난다입니다.
(1정도로만 해도 많은 정보를 확인할 수 있습니다. 처음부터 3으로 하면 로그가 엄청나게 찍히더군요..)

이 때 중요한 건 ATS 예외 도메인에 없는 도메인을 찾는 것입니다.

ATS 규칙 수정하기

찾은 도메인이 https일 경우에는

/usr/bin/nscurl --ats-diagnostics --verbose [도메인]

을 통해 적절한 환경 값을 얻을 수 있으며,

http 일 경우에는

<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>

를 지정해주면 됩니다.
끝.

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.