공식 문서를 참고하여 작성한 글입니다.
잘못된 내용은 댓글로 남겨주시면 감사하겠습니다.😎
URLSession
을 이용한 네트워크 통신을 구현하는 중 다음 에러를 보게 됨.
App Transport Security has blocked a cleartext HTTP connection since it is insecure. Use HTTPS instead or add Exception Domains to your app's Info.plist.
이는 서버와 HTTPS
연결이 아닌 HTTP
연결을 시도하면 ATS
가 보안상의 이유로 연결을 차단(block) 시키는 문제.
이를 해결하기 위해서는 https 연결을 시도하거나, ATS
에 예외를 추가해야 함.
그전에 ATS
가 뭔지 간단히 알아보면..
App Transport Security(ATS)
는 Apple platform에서 앱에 대한 개인 정보 및 무결성을 향상 시키는 네트워크 보안 기능.
ATS
는 URL을 이용한 통신에서 HTTP
연결 대신 HTTPS
연결을 강제시킴.
iOS 9.0, macOS 10.11 이상 버전의 앱부터 지원됨. 이전 버전의 앱들은 ATS
를 지원하지 않음
ATS
에 예외를 추가하는 경우, 앱 스토어 심사 지침에서 정당한 이유를 제공해야 하기 때문에 꼭 필요한 이유가 아니면 무조건 ATS
에 예외를 추가하지 않는 것이 좋음
TLS
프로토콜 버전 1.2 이상 사용해야 함.(현재 기준)
예외를 추가하는 방법은 크게 3가지가 있다.
NSAllowsArbitraryLoads
값 설정
NSAllowsArbitraryLoadsInWebContent
값 설정
Exception Domain
지정
3가지 방법 모두 info.plist
파일에서 아래와 같이 App TransPort Security Settings
키를 추가해야 함
info.plist 대신에, xml파일을 수정하는 방법도 존재합니다. 그러나 이 방법은 따로 설명하지 않겠습니다.
설정 방법
NSAllowsArbitraryLoads
는 모든 네트워크 연결에 대해 ATS
의 활성화 여부를 나타내는 Bool
값으로, 기본값은 NO
이다. YES
로 할당한 경우, 모든 도메인에 대해 ATS
를 적용하지 않는다. 단 NSExceptionDomains
에서 추가한 도메인은 예외.
해당 값을 YES
로 할당한 경우 App store에서 정당한 이유를 제공해야 함. 또한 YES
로 값을 할당하면, 앱의 보안을 크게 저하시키기 때문에 서버를 업그레이드하거나(HTTPS로) 또는 예외 도메인 지정과 같은 더 좁은 범위의 예외를 사용하는 것을 권장.
NSAllowsArbitraryLoads
키는 버전에 따라 차이가 있는데..
iOS 9.0 or macOS10.11: 다른 global exception
이 설정되어 있더라도 무시하며 NSAllowsArbitraryLoads
의 기본 값을 NO
로 set.
iOS 10.0 or macOS 10.12 이상 버전: 아래 3가지의 키값이 info plist
파일에 있는 경우, NSAllowsArbitraryLoads
의 키값을 무시하고 기본적인 값 NO
set.
다른 global exception key 값 (자세한 내용은 링크 참조)
설정 방법
NSAllowsArbitraryLoadsInWebContent
는 더 좁은 범위의 예외로 이 값을 YES
로 설정하면 WKWebView
의 인스턴스와 같이 웹 보기 내에서 이루어진 호출에 대해 ATS
제한을 비활성화 함
이 값도 마찬가지로 YES
로 설정한 경우, App store 검토에서 근거를 제공해야 한다.
설정 방법(swiftapi.rubypaper.co.kr 도메인을 허용하는 경우)
이 방법은 ATS
제한(예외)를 단일 도메인으로 제한하는 것이다. 만약 안전하지 않은 서버인 http:example.com
에 접근해야 하는 경우 해당 domain에 대해 NSExceptionAllowsInsecureHTTPLoads
값을 YES
로 설정한다.
NSExceptionAllowsInsecureHTTPLoads
key는 안전하지 않은 HTTP를 허용할지 나타내는 Bool
값이다. 기본값은 NO(0)
이며 Opitonal이다.
Exception Domain
에 추가한 도메인은 다른global exception
에 영향을 받지 않음.
이 값도 마찬가지로 YES
로 설정한 경우, App store 검토에서 근거를 제공해야 한다.
ATS
에 예외를 추가하는 방법 모두 앱 스토어에 정당한 근거를 제공해야 한다(앱 출시를 하는 상황). 그러므로 특별한 경우가 아니고서는 예외를 추가하지 말자.
https://developer.apple.com/documentation/security/preventing_insecure_network_connections#3138036