Xamarin.iOS의 앱 전송 보안

ATS(앱 전송 보안)는 인터넷 리소스(예: 앱의 백 엔드 서버)와 앱 간에 보안 연결을 적용합니다.

이 문서에서는 앱 전송 보안이 iOS 9 앱에서 적용하는 보안 변경 내용과 Xamarin.iOS 프로젝트에 대한 의미, ATS 구성 옵션에 대해 설명하며 필요한 경우 ATS ATS를 옵트아웃하는 방법을 설명합니다. ATS는 기본적으로 사용하도록 설정되어 있으므로 비안전 인터넷 연결은 iOS 9 앱에서 예외를 발생합니다(명시적으로 허용하지 않는 한).

앱 전송 보안 정보

위에서 설명한 대로 ATS는 iOS 9 및 OS X El Capitan의 모든 인터넷 통신이 보안 연결 모범 사례를 준수하여 앱 또는 사용하는 라이브러리를 통해 직접 중요한 정보가 실수로 공개되지 않도록 합니다.

기존 앱의 경우 가능하면 언제든지 프로토콜을 HTTPS 구현합니다. 새 Xamarin.iOS 앱의 경우 인터넷 리소스와 통신할 때만 사용해야 HTTPS 합니다. 또한 고급 API 통신은 TLS 버전 1.2를 사용하여 암호화해야 합니다.

NSUrl커넥트ion, CFUrl 또는 NSUrlSession으로 이루어진 모든 연결은 iOS 9 및 OS X 10.11(El Capitan)용으로 빌드된 앱에서 기본적으로 ATS를 사용합니다.

기본 ATS 동작

ATS는 iOS 9 및 OS X 10.11(El Capitan)용으로 빌드된 앱에서 기본적으로 사용하도록 설정되므로 NSUrl커넥트ion, CFUrl 또는 NSUrlSession을 사용하는 모든 연결에는 ATS 보안 요구 사항이 적용됩니다. 연결이 이러한 요구 사항을 충족하지 않으면 예외로 실패합니다.

ATS 커넥트ion 요구 사항

ATS는 모든 인터넷 연결에 대해 다음 요구 사항을 적용합니다.

  • 모든 연결 암호는 앞으로 비밀을 사용해야 합니다. 아래의 허용된 암호화 목록을 참조하세요.
  • TLS(전송 계층 보안) 프로토콜은 버전 1.2 이상이어야 합니다.
  • 2048비트 이상의 RSA 키 또는 256비트 이상의 ECC(타원 곡선) 키가 있는 SHA256 지문은 모든 인증서에 사용해야 합니다.

다시 말하지만, ATS는 iOS 9에서 기본적으로 사용하도록 설정되어 있으므로 이러한 요구 사항을 충족하지 않는 연결을 시도하면 예외가 throw됩니다.

ATS 호환 암호

다음 전달 비밀 암호 유형은 ATS 보안 인터넷 통신에서 허용됩니다.

  • 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

iOS 인터넷 통신 클래스 작업에 대한 자세한 내용은 Apple의 NSURL커넥트ion 클래스 참조 또는 NSURLSession 클래스 참조를 참조하세요.

Xamarin.iOS에서 ATS 지원

ATS는 iOS 9 및 OS X El Capitan에서 기본적으로 사용하도록 설정되므로 사용하는 Xamarin.iOS 앱이나 라이브러리 또는 서비스가 인터넷에 연결되면 일부 작업을 수행해야 합니다. 그렇지 않으면 연결에 예외가 throw됩니다.

기존 앱의 경우 Apple은 가능한 한 빨리 프로토콜을 HTTPS 지원할 것을 제안합니다. 지원하지 않는 타사 웹 서비스에 연결할 수 없거나 지원이 HTTPSHTTPS 비실용적이면 ATS를 옵트아웃할 수 있습니다. 자세한 내용은 아래 ATS 옵트아웃 섹션을 참조하세요.

새 Xamarin.iOS 앱의 경우 인터넷 리소스와 통신할 때만 사용해야 HTTPS 합니다. 다시 말하지만, 타사 웹 서비스 사용과 같은 상황이 있을 수 있으며, 이 경우 ATS를 옵트아웃해야 합니다.

또한 ATS는 TLS 버전 1.2를 사용하여 고급 API 통신을 암호화하도록 강제합니다. 자세한 내용은 위의 ATS 커넥트ion 요구 사항ATS 호환 암호화 섹션을 참조하세요.

TLS(전송 계층 보안)에 익숙하지 않을 수도 있지만 SSL(Secure Socket Layer)의 후속 작업이며 네트워크 연결을 통해 보안을 적용하는 암호화 프로토콜 컬렉션을 제공합니다.

TLS 수준은 사용하는 웹 서비스에 의해 제어되므로 앱의 제어 범위를 벗어났습니다. 둘 다 서버에서 HttpClientModernHttpClient 지원하는 가장 높은 수준의 TLS 암호화를 자동으로 사용해야 합니다.

통신하는 서버에 따라(특히 타사 서비스인 경우) 앞으로 비밀을 사용하지 않도록 설정하거나 더 낮은 TLS 수준을 선택해야 할 수 있습니다. 자세한 내용은 아래 ATS 옵션 구성 섹션을 참조하세요.

Important

앱 전송 보안은 관리형 HTTPClient 구현을 사용하는 Xamarin 앱에는 적용되지 않습니다. CFNetwork HTTPClient 구현 또는 NSURLSession HTTPClient 구현만 사용하는 연결에 적용됩니다.

HTTPClient 구현 설정

iOS 앱에서 사용하는 HTTPClient 구현을 설정하려면 솔루션 탐색기 Project 를 두 번 클릭하여 프로젝트 옵션을 엽니다. iOS 빌드로 이동하고 HttpClient 구현 드롭다운에서 원하는 클라이언트 유형을 선택합니다.

iOS 빌드 옵션 설정

관리되는 처리기

관리되는 처리기는 이전 버전의 Xamarin.iOS와 함께 제공된 완전 관리형 HttpClient 처리기이며 기본 처리기입니다.

장점:

  • Microsoft .NET 및 이전 버전의 Xamarin과 가장 호환됩니다.

단점:

  • iOS와 완전히 통합되지 않았습니다(예: TLS 1.0으로 제한됨).
  • 일반적으로 네이티브 API보다 훨씬 느립니다.
  • 더 많은 관리 코드가 필요하고 더 큰 앱을 만듭니다.

CFNetwork 처리기

CFNetwork 기반 처리기는 네이티브 CFNetwork 프레임워크를 기반으로 합니다.

장점:

  • 더 나은 성능과 더 작은 실행 파일 크기를 위해 네이티브 API를 사용합니다.
  • TLS 1.2와 같은 최신 표준에 대한 지원을 추가합니다.

단점:

  • iOS 6 이상이 필요합니다.
  • watchOS를 사용할 수 없습니다.
  • 일부 HttpClient 기능 및 옵션을 사용할 수 없습니다.

NSUrlSession 처리기

NSUrlSession 기반 처리기는 네이티브 NSUrlSession API를 기반으로 합니다.

장점:

  • 더 나은 성능과 더 작은 실행 파일 크기를 위해 네이티브 API를 사용합니다.
  • TLS 1.2와 같은 최신 표준에 대한 지원을 추가합니다.

단점:

  • iOS 7 이상이 필요합니다.
  • 일부 HttpClient 기능 및 옵션을 사용할 수 없습니다.

ATS 문제 진단

iOS 9의 웹 보기에서 직접 또는 인터넷에 연결하려고 하면 다음과 같은 양식에 오류가 발생할 수 있습니다.

앱 전송 보안은 안전하지 않으므로 일반 텍스트 HTTP(http://www.-the-blocked-domain.com) 리소스 로드를 차단했습니다. 앱의 Info.plist 파일을 통해 임시 예외를 구성할 수 있습니다.

iOS9에서 ATS(App Transport Security)는 인터넷 리소스(예: 앱의 백 엔드 서버)와 앱 간에 보안 연결을 적용합니다. 또한 ATS는 프로토콜을 사용하는 HTTPS 통신과 고급 API 통신을 사용하여 TLS 버전 1.2를 사용하여 암호화해야 합니다.

ATS는 iOS 9 및 OS X 10.11(El Capitan)용으로 빌드된 앱에서 기본적으로 사용하도록 설정되므로 모든 연결 NSURLConnectionCFURL 은 사용하거나 NSURLSession ATS 보안 요구 사항이 적용됩니다. 연결이 이러한 요구 사항을 충족하지 않으면 예외로 실패합니다.

Apple은 또한 컴파일(또는 필요에 따라 Xamarin 및 C#으로 트랜스코딩)하고 ATS/TLS 문제를 진단하는 데 사용할 수 있는 TLSTool 샘플 앱을 제공합니다. 이 문제를 해결하는 방법에 대한 자세한 내용은 아래 ATS 옵트아웃 섹션을 참조하세요.

ATS 옵션 구성

앱의 Info.plist 파일에서 특정 키에 대한 값을 설정하여 ATS의 여러 기능을 구성할 수 있습니다. 다음 키는 ATS를 제어하는 데 사용할 수 있습니다(중첩 방법을 표시하도록 들여쓰기).

NSAppTransportSecurity
    NSAllowsArbitraryLoads
    NSAllowsArbitraryLoadsInWebContent
    NSExceptionDomains
    <domain-name-for-exception-as-string>
        NSExceptionMinimumTLSVersion
        NSExceptionRequiresForwardSecrecy
        NSExceptionAllowsInsecureHTTPLoads
        NSRequiresCertificateTransparency
        NSIncludesSubdomains
        NSThirdPartyExceptionMinimumTLSVersion
        NSThirdPartyExceptionRequiresForwardSecrecy
        NSThirdPartyExceptionAllowsInsecureHTTPLoads

각 키에는 다음과 같은 형식과 의미가 있습니다.

  • NSAppTransportSecurity (Dictionary) - ATS에 대한 모든 설정 키와 값을 포함합니다.
  • NSAllowsArbitraryLoads(Boolean) - ATS를 사용하지 않도록 설정한 경우 YES 기본 NSExceptionDomains나열되지 않습니다. 나열된 do기본의 경우 지정된 보안 설정이 사용됩니다.
  • NSAllowsArbitraryLoadsInWebContent(Boolean) - ATS(Apple Transport Security) 보호가 앱의 나머지 부분에 대해 계속 활성화되어 있는 동안 웹 페이지가 올바르게 로드되도록 허용하는 경우 YES
  • NSExceptionDo기본s(Dictionary) - ATS가 지정된 작업에 사용해야 하는 기본 보안 설정의 컬렉션입니다기본.
  • <do기본-name-for-exception-as-string>(Dictionary) - 지정된 do기본(예: www.xamarin.com)에 대한 예외 컬렉션입니다.
  • NSExceptionMinimumTLSVersion(String) - 최소 TLS 버전(TLSv1.0TLSv1.1TLSv1.2 기본값)입니다.
  • NSExceptionRequiresForwardSecrecy(Boolean) - 할 경우 NO 기본 전달 보안이 포함된 암호화를 사용할 필요가 없습니다. 기본값은 YES입니다.
  • NSExceptionAllowsInsecureHTTPLoads (Boolean) - (기본값) 이 작업과의 모든 통신이 수행되면 NO 기본 프로토콜에 HTTPS 있어야 합니다.
  • NSRequiresCertificateTransparency(Boolean) - YES do기본 SSL(Secure Sockets Layer)에 유효한 투명도 데이터가 포함되어야 합니다. 기본값은 NO입니다.
  • NSIncludesSubdo기본s (Boolean) - 이러한 설정이 이 작업의 모든 하위 기본 재정의하는 경우 YES 기본. 기본값은 NO입니다.
  • NSThirdPartyExceptionMinimumTLSVersion(String) - do기본 때 사용되는 TLS 버전은 개발자가 제어할 수 없는 타사 서비스입니다.
  • NSThirdPartyExceptionRequiresForwardSecrecy(Boolean) - 타사에서 수행하는 경우 YES 기본 전달 비밀이 필요합니다.
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads(Boolean) - ATS가 타사와의 비보안 통신을 허용하는 경우 YES 기본.

ATS 옵트아웃

Apple은 프로토콜을 사용하고 HTTPS 인터넷 기반 정보에 대한 보안 통신을 권장하지만 항상 가능하지는 않을 수도 있습니다. 예를 들어 타사 웹 서비스와 통신하거나 앱에서 인터넷 배달 광고를 사용하는 경우입니다.

Xamarin.iOS 앱이 안전하지 않은 작업을 요청해야 하는 경우기본 앱의 Info.plist 파일을 다음과 같이 변경하면 ATS가 지정된 작업에 적용하는 보안 기본값이 비활성화됩니다기본

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.the-domain-name.com</key>
        <dict>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Mac용 Visual Studio 내에서 솔루션 탐색기 파일을 두 번 클릭하고 Info.plist 원본 보기로 전환한 다음 위의 키를 추가합니다.

지정된 키를 추가한 후 Info.plist 파일의 원본 뷰입니다.

앱이 비보안 사이트에서 웹 콘텐츠를 로드하고 표시해야 하는 경우 앱의 Info.plist 파일에 다음을 추가하여 ATS(Apple Transport Security) 보호가 앱의 나머지 부분에 대해 계속 사용하도록 설정되어 있는 동안 웹 페이지를 올바르게 로드할 수 있도록 합니다.

<key>NSAppTransportSecurity</key>
<dict>
    <key> NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

필요에 따라 앱의 Info.plist 파일을 다음과 같이 변경하여 모든 할 일기본 및 인터넷 통신에 ATS를 완전히 사용하지 않도록 설정할 수 있습니다.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Mac용 Visual Studio 내에서 솔루션 탐색기 파일을 두 번 클릭하고 Info.plist 원본 보기로 전환한 다음 위의 키를 추가합니다.

NSAllowsArbitraryLoadsInWebContent 및 NSAllowsArbitraryLoads를 지정한 후 Info.plist 파일의 원본 뷰입니다.

Important

애플리케이션에서 안전하지 않은 웹 사이트에 연결해야 하는 경우 ATS를 완전히 사용하지 NSAllowsArbitraryLoads않도록 설정하는 대신 예외로 NSExceptionDomains 항상 do기본를 입력해야 합니다. NSAllowsArbitraryLoads 은 극한의 응급 상황에서만 사용해야 합니다.

다시 말하지만, 보안 연결로 전환할 수 없거나 비실용적인 경우 ATS를 사용하지 않도록 설정하는 것은 최후의 수단으로만 사용해야 합니다.

요약

이 문서에서는 ATS(앱 전송 보안)를 도입하고 인터넷과의 보안 통신을 적용하는 방법을 설명했습니다. 먼저 iOS 9에서 실행되는 Xamarin.iOS 앱에 대한 ATS 요구 사항을 다루었습니다. 그런 다음 ATS 기능 및 옵션을 제어하는 방법에 대해 설명했습니다. 마지막으로 Xamarin.iOS 앱에서 ATS를 옵트아웃하는 것을 다루었습니다.