원문(블로그이전)
시리즈 | 🚀 iOS 네트워킹 정복하기 - averycode.log
요즘은 블로그대신 github 에 학습내용을 정리를 하게 되었는데,오랜만에 velog로 돌아와 iOS 네트워킹을 정복 시리즈를 작성해봅니다.iOS를 공부한지 몇개월이 지났는데 바쁘다는 핑계(?)로 네트워
velog.io
App Transport Security
📔 관련 공식문서
ATS란?
ATS는 애플리케이션과 웹 서비스 사이에 통신 시 보안 향상을 위한 기능으로
- iOS 9.0, macOS 10.11 이상의 앱에서 모든 인터넷 통신 시 안전한 프로토콜을 사용하도록 보장하는 것으로 사용자의 민감한 정보가 유출되는 것을 방지한다
- ATS 가 적용되면, 기존에 iOS 앱에서 사용하던 암호화되지 않은 HTTP 통신은 OS 내부에서 강제적으로 차단되게 된다.
- 완전히 보안되지 않은 서버에 연결해야 하고, 보안을 강화하기 위해 재구성할 수 없는 경우 예외를 추가하여 ATS 요구 사항 중 일부를 완화할 수 있다
ATS 등장 배경
다양한 종류의 애플리케이션이 개인의 여러 가지 정보(연락처, 사진, 건강정보, 메시지, 메일 등)를 다루게 되면서 사용자 정보보호에 대한 중요성이 한층 부각되었다. 그런데 기존의 보안/암호 기술은 오래되어 공격에 취약해졌지만, 컴퓨터 성능은 점점 발전하면서 새롭게 등장하는 네트워크 공격이 강력해지자 이에 대응하기 위해 2015년 ATS를 도입하게 되었다.
2016년부터 새롭게 만들어지는 애플리케이션은 반드시 ATS를 사용해야 하며, 기존에 개발된 애플리케이션은 ATS를 사용할 수 있도록 네트워크 보안을 강화해야 합니다.
ATS 동작
URLSession
,CFURL
그리고NSURLConnection
API를 이용해 데이터를 주고받을 때 ATS 기능을 기본적으로 사용하게 됩니다.
표준 URL Loading System을 사용하면 시스템이 자동으로 ATS를 적용된다.
URL 세션의 인스턴스는 서버에서 사용할 수 있는 가장 안전한 연결을 자동으로 선택하게 된다.
앱에서는 https로 시작하는 보안 URL을 사용하며, 그렇지 않으면 ATS가 연결을 거부하고 콘솔 메시지를 프린트 하게 된다.
- ATS가 활성화되어있을 때는 HTTP 통신을 할 수 없으며 애플에서 권장하는 아래 요구 사항을 충족하지 않은 네트워크는 연결에 실패할 수 있습니다.
- 서버는 TLS(Transport Layer Security) 프로토콜 버전 1.2 이상을 지원해야 합니다.
- 적어도 2048비트 이상의 RSA 키 또는 256비트 이상의 ECC(Elliptic-Curve) 키가 있는 SHA256을 인증서에 사용해야 합니다.
- 암호 연결은 아래 허용된 암호 목록으로 제한합니다.
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
용어 정리
- 전송 계층 보안 (Transport Layer Security - TLS)
- 암호 프로토콜 : 서버와 클라이언트 애플리케이션이 네트워크로 통신하는 과정에서 도청, 간섭, 위조를 방지하기 위해서 정보를 암호화해서 송수신한다
- HTTPS (Hypertext Transfer Protocol Secure)
- TLS를 사용해 암호화된 연결을 하는 HTTP(Hypertext Transfer Protocol)를 HTTPS라고 합니다.
TLS는 다양한 종류의 보안 통신을 하려는 프로토콜이고, HTTPS는 TLS 위에 HTTP 프로토콜을 얹어 보안된 HTTP 통신을 하는 프토로콜입니다.
예외사항
- 애플리케이션이 ATS가 요구하는 사항을 충족하기 힘든 경우, ATS 기능을 비활성화할 수 있는데, 아래는 ATS 기능을 사용하지 않을 수 있는 예외사항이다.
- AVFoundation 프레임워크를 통한 스트리밍 서비스
- WebKit을 통한 콘텐츠 요청
- 로컬 네트워크 연결
- 그 외에는 서버가 최신 TLS 버전으로 업그레이드할 때까지 애플리케이션의 유지 보수를 위해 일시적으로 ATS 기능을 사용하지 않는 것이 가능하며, App Store 심사 시 정당한 이유를 설명하는 문서가 필요할 수도 있다.
HTTP 통신을 하려면? ATS를 비활성화 해야한다
해당 프로젝트의 info.plist 파일에서 설정할 수 있다
- 모든 HTTP 통신 허용 : 암호화 하지 않은 통신이므로 불가피한 때 외에는 사용하지 않는 것이 좋다.
- 유즈케이스에 따라 더 좁은범위의 예외를 제공할 수 있다
- 예를 들어
NSAllowsArbitraryLoadsInWebContent
을 YES로 설정하면 WKWebView의 인스턴스와 같이 웹 뷰 내에서 이루어지는 호출에 대한 ATS 제한을 비활성화할 수 있다.
- 예를 들어
- ATS에서 제외할 특정 도메인 지정하는 법은 아래와 같다
References
'이전 블로그 > iOS Dev' 카테고리의 다른 글
🚀 iOS 네트워킹 정복하기 (4) CodingKeys / Custom 인코딩과 디코딩 (0) | 2022.11.02 |
---|---|
🚀 iOS 네트워킹 정복하기 (3) Codable Protocol ( JSON Encoding / Decoding) (1) | 2022.11.02 |
🚀 iOS 네트워킹 정복하기 (2) URLSession (1) | 2022.11.02 |
🚀 iOS 네트워킹 정복하기 (1) Kick Off (0) | 2022.11.02 |
[Swift] Struct와 Class (feat. 값타입과 참조타입) (0) | 2022.11.02 |