iOS9 App Transport Security 설정법
출처 : http://blowmj.tistory.com/entry/iOS-iOS9-App-Transport-Security-설정법
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 연결 강제를 설정합니다.
아래는 다음과 관련된 애플의 링크입니다.