본문 바로가기

iOS

ATS(App Transport Security)

728x90

애플에서 제공하거나 .. 애플에서 무언가를 한다면 .. 항상 느끼는 것은 애플의 보안성은 정말 ... 좋구나 .. 조금 더 안좋게 말하면 .. 엄청 폐쇄적이구나 .. 라는 것을 느낄 수 있다

 

애플의 경우 기본적으로 http로 시작하는 URL에 대한 접근을 제한하고 있다.

따로 설정을 하지 않고 허용하지 않은 외부 도메인에 접근하려고 한다면?

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

위와 같은 오류메시지가 나타난다.

 

그래서 앞서 말한 것과 같이 Apple 측에서 앱 자체의 보안성을 위해 ATS(App Translate Security)라는 정책을 통해 기본적으로 https 통신을 하도록 유도하고 있다.

(그래서 만약 http를 갖고 있는 도메인으로 서버를 연결하려고 하거나 웹 뷰를 띄우고 싶다면, info.plist 파일에서 따로 허용 설정을 해주어야 한다. NSAppTransportSecurity의 NSAllowsArbitraryLoads 값을 true로 지정한다.)

 

ATS가 뭔데?

iOS 9 버전 이후부터 적용된 개인정보보호 기능이고 xcode 7 버전 이상에서 앱 생성 시 기본값으로 가져가게 되는 보안 정책이다.

 

모든 인터넷 통신 시 안전한 프로토콜을 사용하도록 보장하는 것으로 사용자의 민감한 정보가 유출되는 것을 방지한다. 응용 프로그램과 웹 서비스 간의 안전한 연결을 위해서 사용한다.

 

 

ATS 동작 원리

URLSession, CFURL 그리고 NSURLConnection API를 사용해 데이터를 주고 받을 때 ATS 기능을 기본적으로 사용하게 된다. ATS가 활성화 되어 있으면 HTTP 통신을 할 수 없으며 애플에서 권장하는 요구 사항을 충족하지 않는 네트워크는 연결을 할 수 없다.

 

애플에서 권장하는 요구 사항을 충족하지 않은 연결은 강제로 실패 처리가 된다.

예를 들어, 애플 권장 요구 사항을 충족하지 않은 웹 페이지를 WKWebView에서 열려고 하면 페이지로드는 실패한다. 그리고 그 때의 에러 메시지는 다음과 같다.

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를 허용하는 방법과 도메인마다 설정해서 허용하는 방법이 있다.

  • 전체 HTTP를 허용하는 방법

위와 같이 설정하면 된다.

모든 도메인에 대해서 허용하는 것으로, 간단하지만 (하나씩 설정하지 않아도 되므로) 추천하지 않는 방식이다.

 

  • ATS를 제외할 도메인을 Info.plist에 기재하는 방법

이렇게 예외 처리를 할 도메인을 직접 작성하는 방법이다. (= 특정 도메인만 선택적으로 HTTP 통신 허용)

 

- Exception Domain -> Type Dictionary로 수정 -> key에 도메인 주소를 입력하되, 맨 앞의 www는 제외

- NSExceptionAllowsInsecureHTTPLoads : 해당 도메인에 대해서 HTTP 접속을 허용할 지 여부를 결정하는 역할

- NSIncludesSubdomains : 해당 도메인의 서브 도메인까지 설정에 포함할 것인지 결정하는 역할 

 

 

'iOS' 카테고리의 다른 글

0729 Q&A 정리  (0) 2022.08.01
Custom Font를 적용하고 싶다면?  (0) 2022.08.01
UIResponder  (0) 2022.07.28
Delegate? DatsSource?  (0) 2022.07.28
UIViewPropertyAnimator  (0) 2022.04.29