Developer/iOS

[iOS] iOS9 App Transport Security 설정법

블로blow 2015. 12. 17. 16:52
728x90

iOS9으로 업데이트 되면서, HTTP로 접속을 하거나, 인증되지 않은 HTTPS

즉, 정상적인 SSL이 아닌 곳으로 이동이나 webView를 띄우면 아래와 같은 에러가 나게 됩니다.

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)


자세한 내용은 아래에 링크에서 확인하면 됩니다. 아래는 WWDC 2015 발표되었던 ATS에 관해 잘 설명하고 있는 링크입니다.


http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/



App Transport Security에 대해 자세히 설명해보겠습니다.



App Transport Security는?


App Transport Security(이후 ATS)는 iOS 9.0또는 OS X 10.11 이상 유효하며, 응용프로그램과 웹 서비스간의 안전한 연결을 위해 사용할 수 있습니다.


ATS가 활성화되면 HTTP를 통해 통신을 할 수 없습니다. 또한 Apple에서 권장하는 요구 사항을 충족하지 않는 연결은 강제로 연결 실패 처리됩니다. 예를 들어, Apple 권장 요구 사항을 충족하지 않는 Web 페이지를 WKWebView 에서 열려고 하면 페이지로드는 실패합니다. 그 때의 NSError의 내용은 다음과 같습니다.


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 = {_ WKRecoveryAttempterErrorKey =, NSErrorFailingURLStringKey = http : //www.hoge.jp/, NSErrorFailingURLKey = http : //www.hoge.jp/, NSLocalizedDescription = The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.}



이와 같이 에러가 나므로 ATS를 사용하지 않으려면 info.plist에 예외설정을 해야합니다.



Info.plist에 예외 설정하는 방법



Info.plist용 키를 확인하면 다음과 같습니다.



NSAppTransportSecurity (Dictionary)

  • NSExceptionDomains (Dictionary)
    • NSAllowsArbitraryLoads (Bool)
    • <domain-name-for-exception-as-string> (Dictionary)
      • NSExceptionMinimumTLSVersion (String)
      • NSExceptionRequiresForwardSecrecy (Bool)
      • NSExceptionAllowsInsecureHTTPLoads (Bool)
      • NSRequiresCertificateTransparency (Bool)
      • NSIncludesSubdomains (Bool)
      • NSThirdPartyExceptionMinimumTLSVersion (String)
      • NSThirdPartyExceptionRequiresForwardSecrecy (Bool)
      • NSThirdPartyExceptionAllowsInsecureHTTPLoads (Bool)


2개의 방법이 있는데, 

전체의 HTTP를 허용하는 방법과 도메인마다 설정해서 허용하는 방법이 있습니다.


1. 전체의 HTTP를 허용하는 방법(비추천이라고 합니다)

<key> NSAppTransportSecurity </ key> <dict> <key> NSAllowsArbitraryLoads </ key> <true /> </ dict>





2. ATS를 제외시킬 도메인을 Info.plist에 기재하는 방법


<key> NSAppTransportSecurity </ key> <dict> <key> NSExceptionDomains </ key> <dict> <key> www.xxx.com </ key> <dict> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </ key> <true /> </ dict> </ dict> </ dict>





몇가지 더 설정을 알아 보겠습니다.


  • NSExceptionMinimumTLSVersion: TLS 최소 버전을 문자열로 입력합니다. 아래 값들 중 하나를 넣을 수 있거나 생략할 수 있습니다.
    • TLSv1.0
    • TLSv1.1
    • TLSv1.2 (생략할 경우의 기본값)
  • NSExceptionRequiresForwardSecrecy: forward secrecy 라는 비밀키 암호화와 관련된 설정입니다.
  • NSExceptionAllowsInsecureHTTPLoads: HTTPS(SSL) 연결이 아니더라도 통신을 허용할 것인가를 YES 혹은 NO로 설정 할 수 있습니다.
  • NSIncludesSubdomains: 이 사이트의 하부도메인들에도 이 설정을 적용할 것인가를 YES 혹은 NO로 설정 할 수 있습니다.
  • NSThirdPartyExceptionMinimumTLSVersion: 써드파티 TLS 버전을 입력 할 수 있습니다.
  • NSThirdPartyExceptionRequiresForwardSecrecy: 역시 써드파티 Forward Secrecy 설정할 수 있습니다.
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads: 역시나 써드파티 HTTPS 연결 강제를 설정합니다.




아래는 다음과 관련된 애플의 링크입니다.

https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html




728x90