애플에서 제공하거나 .. 애플에서 무언가를 한다면 .. 항상 느끼는 것은 애플의 보안성은 정말 ... 좋구나 .. 조금 더 안좋게 말하면 .. 엄청 폐쇄적이구나 .. 라는 것을 느낄 수 있다
애플의 경우 기본적으로 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 |