ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ATS (App Transport Security) 톺아보기
    iOS 2023. 11. 14. 10:04

    안녕하세요. 그린입니다 🍏

    이번 포스팅에서는 App Transport Security라고 불리는 ATS에 대해 알아보고 우리 프로젝트에서 설정하는 학습을 해보겠습니다 🙋🏻

     

    우선 ATS가 무엇인지 공식문서를 통해 학습해볼까요?


    ATS?

    하나 먼저 알고 넘어가면 좋을것이 있습니다.

    바로 서버와 통신할때 HTTP로 통신을 하면 전송 보안 이슈때문에 연결이 되지 않습니다!

    이것을 ATS가 관여하는건데요.

     

    즉, 애플 플랫폼에서 ATS라는 네트워킹 기능은 모든 앱과 앱 확장 프로그램에 대해 개인 정보 보호와 데이터 무결성을 향상시켜줍니다.

     

    쉽게 말해보면 애플의 네트워크 보안 기능이라고 볼 수 있습니다 🔒

     

    ATS에선 앞서 말했듯이 URLSession 클래스를 사용하는 즉, 모든 URL 로딩 시스템에서는 모든 HTTP 연결 대신 SSL 보안 계층이 추가된 HTTPS를 사용해야 합니다.

     

    또한, TLS라고 불리는 Transport Layer Security, 전송 계층 보안 프로토콜이 규정하는 기본 서버 신뢰 평가를 보완하는 확장된 보안 검사를 추가로 적용합니다.

     

    결국 이러한 네트워크 보안 기능으로 ATS는 최소 보안 규격을 충족하지 못한 연결들을 차단하게 됩니다.

     

    ATS의 역할을 그림으로 나타내면 이렇습니다.

     

     

    ATS는 iOS 9.0, macOS 10.11 이상에 연결된 앱에 대해서는 기본적으로 동작합니다.

    완전히 안전하지 않은 서버에 연결해야 하고 보안을 강화하기 위해 재구성할 수 없는 경우 예외를 추가하여 일부 ATS 요구 사항을 완화할 수도 있습니다.

     

    그럼 HTTP로 통신을 하게 되어 ATS에 걸리면 실제로 어떻게 에러가 나타날까요!?

    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.

     

    ATS가 연결을 막아버린다면 콘솔에 이렇게 ATS가 막았다~ HTTP로는 안됨 ㄴㄴ
    만약 HTTP 사용하고 싶은거 있으면 Info.plist 파일에 임시적으로 등록하던가 하셈 ㅇㅇ

     

     

    이런식으로 친절하게 잘 알려줍니다.

     

    그럼 네트워크 서버가 따라야 할 ATS가 검증하는 최소 요구 사항은 어떤게 있을까요?


    ATS에 걸리지 않으려면~?

    우선 보안 서버는 X.509 디지털 인증서를 사용하여 ID를 설정합니다.

    연결 클라이언트는 이 인증서를 검사하여 기본 서버 신뢰 평가를 수행합니다.

    여기에는 인증서가 다음 항목과 같은지 확인하는것이 포함됩니다!

     

    1️⃣ 인증서가 변조되지 않았음을 보여주는 온전한 디지털 서명 존재해야함

    2️⃣ 만료되지 않아야함

    3️⃣ 서버의 DNS 이름과 일치하는 이름이 있어야함

    4️⃣ 다른 유요한 인증서로 서명되고, 다시 다른 인증서로 서명되며, 인증기관(CA)에서 발급해야 하는 신뢰할 수 있는 앵커 인증서로 다시 서명됩니다. 앵커 인증서는 iOS에서 사용 가능한 신뢰할 수 있는 루트 인증서 목록에 표시된 대로 클라이언트 운영체제의 일부이거나 사용자 또는 시스템 관리자가 클라이언트에 설치해야함

     

    다음으로 ATS는 다음 사항을 모두 요구하며 확장된 보안 검사를 진행합니다.

    1️⃣ 서버 인증서는 최소 2048bit의 RSA 키 또는 최소 256bit의 ECC키로 서명되어야함

    2️⃣ 인증서는 다이제스트 길이가 최소 256bit(SHA-256 이상)인 SHA-2를 사용해야함

    3️⃣ 연결은 TLS 프로토콜 버전 1.2 이상을 사용해야함

    4️⃣ 데이터는 AES-128 또는 AES-256 대칭 암호를 사용하여 교환되어야함

    5️⃣ 링크는 ECDHE 키 교환을 통해 PFS를 지원해야함

     

    이렇게 자동으로 서버 신뢰 평가를 처리하지만 프로세스를 사용자 정의할 수도 있습니다.

    예를 들어, 앱에 내장된 자체 서명 인증서로 신뢰를 확장하거나 인증서 만료를 우회할 수 있습니다.

    ATS가 활성화되면 더 이상 그런 방식으로 신뢰 평가 요구 사항을 완화할 수 없지만 인증서 고정 구현 등을 위해 여전히 요구 사항을 강화할 수 있습니다.

    요 부분은 더 자세히 알아보려면 수동 서버 신뢰 인증 수행 파트를 참고해보면 좋을것 같아요!

     

    Performing manual server trust authentication | Apple Developer Documentation

    Evaluate the server’s security credentials in your app.

    developer.apple.com

     

    후....... 갑자기 머리가 하얘지시죠..?ㅎㅎ

     

    괜찮습니다!

    일단 핵심을 다시 짚어보자면 URLSession으로 네트워크 통신을 할 경우 애플에서 ATS라는 네트워크 보안 기능을 통해서 검증합니다.

    만약 보안에 문제가 있다면 연결을 끊어버리고 정상적이면 연결을 진행합니다.

     

    요것만 일단 알면됩니다!

     

    그런데 우리는 사실 어떤 프로젝트를 하다보면 클라 개발자들이 서버까지 만드는것은 아니잖아요?

    그렇기에 호옥시나 HTTP로 서버 통신을 해야할 수도 있고 웹뷰로 띄우더라도 HTTP 페이지가 있을수 있습니다.

     

    그럴때는 사실 서버를 수정하는것이 가장 적합하긴 하나 우리 iOS에서도 예외 처리를 허용하는 방법은 알아야 합니다.

     

    그래서 한번 ATS에 걸리지 않게 예외 처리를 설정해보겠습니다.


    ATS 예외처리를 설정해보자!

    일단 다시 한번 말씀드리지만, 예외처리 하는것은 앱의 보안을 저하시키기에 가장 최후의 수단으로 사용해야 합니다 🚫

    즉, ATS 기능을 전체적으로 비활성화 하던가 아니면 특정한것에 예외처리 하던가 등의 작업입니다.

     

    앱 프로젝트의 Info.plist 파일이 있습니다.

    해당 파일에서 NSAppTransportSecurity 키 설정을 해줘야 합니다.

     

    우선 해당 NSAppTransportSecurity 키의 구조는 딕셔너리 형태로 이렇습니다.

     

    NSAppTransportSecurity : Dictionary {
        NSAllowsArbitraryLoads : Boolean
        NSAllowsArbitraryLoadsForMedia : Boolean
        NSAllowsArbitraryLoadsInWebContent : Boolean
        NSAllowsLocalNetworking : Boolean
        NSExceptionDomains : Dictionary {
            <domain-name-string> : Dictionary {
                NSIncludesSubdomains : Boolean
                NSExceptionAllowsInsecureHTTPLoads : Boolean
                NSExceptionMinimumTLSVersion : String
                NSExceptionRequiresForwardSecrecy : Boolean
                NSRequiresCertificateTransparency : Boolean
            }
        }
    }

     

    여기서 필요한 항목들을 설정해주면 됩니다.

     

    1️⃣ 모든 연결에 대해 ATS 기능 비활성화

     

     

    Allow Arbitrary Loads 키를 YES로 변경하면 모든 연결에 대해 ATS 기능을 비활성화 시켜 HTTP 통신들 포함하여 모든 연결을 시켜줍니다.

    즉 가장 위험할 수 있는 방법이자 가장 편한 방법이죠 사실ㅎㅎ

     

    2️⃣ WKWebView로 띄운 웹뷰에서만 ATS 기능 비활성화

     

     

    Allow Arbitrary Loads in Web Content 키를 YES로 변경하면 웹뷰 연결에 대해서만 ATS 기능을 비활성화 해줍니다.

     

    3️⃣ 특정 도메인 ATS 기능 비활성화

     

     

    ATS 예외를 이렇게 특정 단일 도메인으로만 제한해야 할 경우도 있습니다.

    Exception Domains에 해당 예외할 도메인을 넣고 NSExceptionAllowsInsecureHTTPLoads를 YES로 설정하여 그 구현을 해줄 수 있습니다.

     

    이렇게 다양하게 ATS 예외를 Info.plist 파일에 추가하며 앱에 정당성을 제공해야지만 심사 리젝을 먹지 않으며 정상적으로 네트워크 통신이 됩니다.

     

    App Store가 검토하는 예외 정당화 목록은 아래와 같이 있습니다.

     

     

    고려할 수 있는 정당성의 몇가지 예를 공식문서에서 소개하고 있습니다.

     

    1️⃣ 앱이 보안 연결을 지원하지 않는 다른 엔티티에서 관리하는 서버에 연결해야할 경우

    2️⃣ 앱이 보안 연결을 사용하기 위해 업그레이드 할 수 없고 공개 호스트 이름을 사용해 액세스해야 하는 장치에 대한 연결을 지원해야 하는 경우

    3️⃣ 앱이 다양한 소스에서 포함된 웹 콘텐츠를 표시해야 하지만 웹 콘텐츠 예외에서 지원하는 클래스를 사용할 수 없는 경우

    4️⃣ 앱이 암호화되어 있고 개인화된 정보가 포함되지 않은 미디어 콘텐츠를 로드하는 경우

     

    이런 정당성을 이유로 사용하는 경우가 많으며 꼭 앱 스토어에 심사 제출 시 앱이 기본적으로 보안 연결을 설정할 수 없는 이유를 확인할 수 있도록 꼭 잘 소명하는것이 좋습니다.

     

    다시 한번 또 강조 강조하지만! 예외를 최대한 쓰지 않도록 해야 합니다 🧙🏻‍♀️


    마무리

    ATS를 간단히 설정만 해보자~ 라고 했다가 심사와 맞물려 있는 귀중한것도 얻고 갔습니다!

    ATS 비활성화 하는것을 사실 거의 사용할 일은 없지만 그럴 경우 여러 우회법들이 있음을 파악해봤습니다.

     


    레퍼런스

     

    NSAppTransportSecurity | Apple Developer Documentation

    A description of changes made to the default security for HTTP connections.

    developer.apple.com

     

     

    Preventing Insecure Network Connections | Apple Developer Documentation

    Enforce secure network links in your app by relying on App Transport Security.

    developer.apple.com

     

    'iOS' 카테고리의 다른 글

    자동 문자 결합 방지하기  (40) 2023.11.30
    CI & DI에 대해 알아보기 🔑  (44) 2023.11.20
    인앱리뷰(In-App Review) 연동하기  (49) 2023.11.09
    Event Capturing  (38) 2023.10.26
    Event Bubbling  (44) 2023.10.23
Designed by Tistory.