2015년 9월 3일 목요일

iOS 9 / OS X 10.11 앱 네트워크 보안 정책

iOS 9과 OS X 10.11 에 앱 네트워크 보안(App Transport Security) 이라는 정책이 새롭게 추가되었다. 이로 인해서 구글에서도 애드센스 관련해서 뭔가 말이 많았던것 같은데, 나도 개발 도중에 문제를 겪었기에 메모하는 겸 블로그로 정리해 본다. 아 참고로 이 내용은 애플에서도 개발중인 내용이라 추후에 변경될 가능성이 있다고 한다.

혹시나 앱 실행 도중 아래와 같은 경고팝업이 뜨면서 네트워크에 제한이 걸린다면 이 보안정책에 따라 발생한 것이라고 생각하자.
... the resource could not be loaded because the app transport security policy requires the use of a secure connection ...
iOS 9 에서는 아래와 같이 메시지가 변경된 것 같다:
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.

이 문제를 해결하기 위해 Info.plist 파일을 수정해야 한다. 아래 내용은 Info.plist에 넣을 키 구조이다.
  • NSAppTransportSecurity (Dictionary)
    • NSAllowsArbitraryLoads (Boolean)
    • NSExceptionDomains (Dictionary)
      • 예외로 처리할 도메인 이름(domain-name-for-exception-as-string) (Dictionary)
        • NSExceptionMinimumTLSVersion (String)
        • NSExceptionRequiresForwardSecrecy (Boolean)
        • NSExceptionAllowsInsecureHTTPLoads (Boolean)
        • NSIncludesSubdomains (Boolean)
        • NSThirdPartyExceptionMinimumTLSVersion (String)
        • NSThirdPartyExceptionRequiresForwardSecrecy (Boolean)
        • NSThirdPartyExceptionAllowsInsecureHTTPLoads (Boolean)
NSAppTransportSecurity 라는 항목이 메인 항목이다.

그리고 여기 아래에는 두 가지 종류의 키 중 하나가 올 수 있다. 하나는 NSAllowsArbitraryLoads 라는 단순무식한(?) 설정이 있고, 나머지 하나는 NSExceptionDomains라고 개별 도메인별로 설정을 할 수 있는 항목이 있다.

두 가지 중 하나의 방향을 골라서 설정해보자.

NSAllowsArbitraryLoads


Boolean 값인 이 설정을 YES로 세팅하면 앱 내의 모든 통신에 제한을 가하지 않게 된다. 즉, 이전 iOS / OS X버전들과 동작이 동일해 진다.

물론 애플에서 일부러 보안기능을 기본적으로 켜 놓은 것을 보면 분명 중요한 이슈일지도 모르겠지만, 급하다면 이 키 하나만 YES로 넣으면 문제는 해결된다는 말이다.

만약 (그럴 일은 별로 없겠지만) 상세한 보안 설정이 필요하다면 이어지는 내용도 참고하자.

NSExceptionDomains


이 사전형 키에 사이트 별로 예외라던가 보안 요구사항 등을 설정할 수 있다. 일종의 Whitelist 라고 생각하자.

이 키 안에는 바로 사이트 도메인 이름(예를 들어 애플 홈페이지라면 www.apple.com)으로 구성된 하나 이상의 사전형 키들이 존재하고, 각 키 아래에는 보안설정이 들어간다:
  • NSExceptionMinimumTLSVersion: TLS 최소 버전을 문자열로 입력한다. 아래 값들 중 하나를 넣을 수 있거나 생략할 수 있다.
    • TLSv1.0
    • TLSv1.1
    • TLSv1.2 (생략할 경우의 기본값)
  • NSExceptionRequiresForwardSecrecy: forward secrecy 라는 비밀키 암호화와 관련된 설정인데 설명하긴 너무 크니 생략한다. 어쨌거나 이걸 쓰려면 YES로 설정하자. 어차피 기본값이 YES다.
  • NSExceptionAllowsInsecureHTTPLoads: HTTPS(SSL) 연결이 아니더라도 통신을 허용할 것인가를 YES 혹은 NO로 설정 할 수 있다. NO가 기본값으로 HTTPS를 강제하게 된다.
  • NSIncludesSubdomains: 이 사이트의 하부도메인들에도 이 설정을 적용할 것인가를 YES 혹은 NO로 설정 할 수 있다. 기본값은 NO이다. 하지만 아마도 YES가 많이 쓰이겠지 -_-
  • NSThirdPartyExceptionMinimumTLSVersion: 써드파티 TLS 버전을 입력 할 수 있다. 아마도 별로 설정 할 필요는 없을 것이다. 무시하자.
  • NSThirdPartyExceptionRequiresForwardSecrecy: 역시 써드파티 Forward Secrecy 설정. 별 일 없다면 무시하자.
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads: 역시나 써드파티 HTTPS 연결 강제를 설정하는 거다. 역시 별 일 없다면 무시하자.
보안에 민감하다면 이런 세세한 설정을 검토해 보는 것도 좋을 것 같다.

[관련링크] App Transport Security Technote

댓글 없음 :