본문 바로가기

학습 노트/iOS (2021)

204. App Transport Security (ATS)

App Transport Security (ATS)


ATS는 iOS9에서 도입된 보안 요소다.
TLS, AES, SHA-2의 보안 프로토콜을 활용하는 HTTP 프로토콜의 개선 프로토콜인 HTTPS가 2000년 RFC 2818 표준으로 등재되면서
2015년 업데이트된 iOS9 이상에서는 HTTPS 프로토콜을 사용하도록 적극적으로 유도했고,
최신 버전에서는 특별한 경우가 아니라면 HTTPS만 사용하도록 권장하고 있다.

HTTP는 모든 데이터가 일반 text의 형태로 전달되며,
HTTPS는 TLS 프로토콜을 활용해 암호화된 형태로 전달하는 것이 특징이다.

현재는 거의 대부분의 환경이 HTTPS를 사용하도록 만들어져 있지만,
만약 충족할 수 없다면 앱의 ATS 설정을 변경해 HTTP 프로토콜을 사용하도록 허용할 수 있다.
단 해당 사항이 '비권장' 되는 것은 변함없다.

      let apple = UIAlertAction(title: "Apple", style: .default) { (action) in
         self.go(to: "http://www.apple.com")
      }
      menu.addAction(apple)
      
      let daum = UIAlertAction(title: "Daum", style: .default) { (action) in
        self.go(to: "http://www.daum.net")
      }
      menu.addAction(daum)
      
      let testPage = UIAlertAction(title: "test", style: .default) { (action) in
        self.go(to: "http://***.ipdisk.co.kr/dav")
      }
      menu.addAction(testPage)

위와 같이 http 프로토콜을 사용하는 url로 각각 접속해 본다.


결과


Apple 홈페이지와 Daum 홈페이지는 잘 접속이 되지만
NAS로 연결되는 주소로는 어떤 반응도 나타나질 않는다.

이는 Apple과 Daum의 경우 HTTP로 접속을 시도할 시 HTTPS로 리다이렉션 하도록 구현됐기 때문으로,
그런 설정 따위 없는 내 NAS의 경우 HTTP 주소 자체를 차단한다.

info.plist 파일에서
'App Transport Security Settings'를 추가한 뒤

'Allow Arbitrary Loads'를 하위에 추가하고,
값을 'YES'로 바꿔준다.


결과


HTTP 주소로 접속을 시도하고, 실패하는 것을 확인할 수도 있다.

위의 설정 법은 앱의 ATS 자체를 무력화시키는 방법인데,
이는 당연하게도 비권장 방법의 비권장 형식이다.

Apple에서는 ATS를 우회할 경우 완전히 무력화하는 것보다는
WhiteList를 사용해 변수를 통제하도록 권장하고 있다.

방금 추가했던 'Allow Arbitrary Loads'를 'Exception Domains'로 변경하고,
Type을 Dictionary로 변경한다.

이후 접속을 허용할 Domain을 입력하고
'NSExceptionAllowsInsecureHTTPLoads'와 'NSIncludesSubdomains' 두 개의 키를 추가한다.
첫 번째 키는 HTTP 접속을 허용하는 옵션이고, 두 번째 키는 모든 서브도메인을 허용하는 옵션이다.
두 번째 키로 인해 'www'나 'm'이나 여러 도메인으로 접속을 시도해도 해당 규칙을 적용할 수 있게 된다.

이렇게 설정하게 되면 지정한 Domain을 사용하는 url만 HTTP 연결을 허용할 수 있어 상대적으로 안전하다.

 

NSAppTransportSecurity

  • NSAllowsArbitraryLoads
    ATS의 활성화 상태를 설정한다.
    True 바꾸면 ATS를 무력화한다.
  • NSAllowsArbitraryLoadsForMedia
    Media에 대한 안전하지 않은 연결을 제한적으로 허용한다.
    AVFoundation 프레임워크를 사용해야 하고, 미디어 파일 자체가 Fairplay 혹은 HLS 암호화가 되어있어야 한다.
  • NSAllowsArbitraryLoadsInWebContent
    WebViewer에서 HTTP 연결을 활성화한다.

위의 세 가지 키는 전역 설정으로 사용이 비 권장된다.

  • NSAllowsLocalNetworking
    Local Network 연결이 필요할 때 사용한다.
  • NSExceptionDomains
    개별 도메인에 대해 설정한다.

 

NSExceptionDomains

개별 설정이며, 위에서 설정한 다른 키들의 전역 설정과는 별개로 취급한다.

  • NSIncludesSubdomains
    해당 도메인의 Subdomain 포함 여부를 설정한다.
  • NSExceptionAllowsInsecureHTTPLoads
    해당 도메인의 HTTP 연결을 허용한다.
  • NSExceptionMinimumTLSVersion
    해당 도메인의 연결 보안 사항이다.
  • NSExceptionRequiresForwardSecrecy
    해당 도메인의 연결 보안 사항이다.
  • NSRequiresCertificateTransparency
    해당 도메인의 연결 보안 사항이다.

ATS는 이전에도 실습을 진행하다 겪은 적이 있다.

 

'app transport security has blocked a cleartext http' 오류 해결하기

서론 iOS를 공부하면서 보통은 실습 파일을 그대로 쓰는 것이 아닌 실습 파일 보고 새 프로젝트를 생성하는 식으로 진행한다. 이번엔 URL을 통해 image를 받아와 cell에 표시하는 예제가 있었는데,

chillog.page

이 때는 처음 소개했던 ATS 자체를 꺼버리는 방식으로 해결했는데,
실제로 프로젝트에 적용할 때는 두 번째로 소개한 WhiteList로 관리하는 것이 바람직하다.

'학습 노트 > iOS (2021)' 카테고리의 다른 글

207. URL Loading System  (0) 2022.08.20
205~ 206. JSON  (0) 2022.07.13
203. Display Web Contents  (0) 2022.07.06
202. Networking  (0) 2022.07.06
201. Migration  (0) 2022.07.06