• NSURLSession: HTTP 통신을 위한 API
  • App Transfort Security
    • HTTP는 평문이기 때문에 중간자가 내용을 들여다 볼 수 있음
    • 그래서 HTTPS 프로토콜을 통해서 양자 간 암호화를 해야 한다.
      • 그 외에도 무결성 검증, 인증 등을 할 수 있다.
    • 그래서 HTTP 통신을 기본으로 막아주고 HTTPS를 기본으로 쓰기 위한 ATS를 적용하게 됐다.
      • ATS는 Info.plist를 통해 예외적으로 해제 가능
    • ATS 에러 검출
      • iOS 9 이상이면 ATS 자동으로 활성화
      • NSURLSession의 에러를 로깅하라
      • 환경 변수CFNETWORK_DIAGNOSTICS를 1로 설정하면 로깅을 자동으로 해준다.
  • HTTP/2(RFC 7540)
    • URLSession을 쓰면 자동으로 해준다.
    • 왜 새로운 프로토콜이 필요한가?
      • HTTP 1.1의 문제점들
        • One Outstanding request: 한번에 하나의 요청만 대기할 수 있다.
          • HTTP Pipelining으로 해결할 수 있지만, 대부분의 브라우저에서 기본적으로 Disabled되어 있다.
          • Multiple Connection으로도 해결해볼 수 있다.
        • 텍스트 방식의 프로토콜이기 때문에 오버헤드가 크다. -> 적절한 압축이 없으면 네트워크 트래픽이 커진다.
          • 덕분에 클라이언트와 서버 모두 처리해야할 부담이 커진다.
      • HTTP/2의 발전 -> 당시 기준 지난달에 확정, 하지만 애플은 바로 지원
      • HTTP/2의 특징
        • 오직 하나의 연결만 사용
        • 멀티플렉싱 -> 서버의 반응을 마냥 기다리지 않아도 된다.
          • 파이프라인을 하면 기다리지 않고 보내지만, 리스폰이 순서대로 들어온다는 것은 변하지 않는다.
          • 멀티플렉싱을 쓰게 되면, 데이터를 동시 다발적으로 받게 되며, 우선순위도 가지게 된다. -> 물론 연결은 하나이므로 데이터 대역을 나눠서 들어오게 된다.
        • FIFO에서 우선순위큐로의 변화
        • 바이너리 헤더
        • 헤더 압축(HPACK)
          • 정적 테이블과 동적 테이블로 나뉨
          • 정적 테이블은 응답이 정해진 경우에 사용
          • 동적 테이블은 정적 테이블에 담을 수 없는 동적인 데이터를 추가적으로 담는 데 사용
  • URLSession을 쓰면 HTTP/2 지원을 자동으로 해준다.
    • 필요한건 HTTP/2 서버뿐
    • HTTP/2를 지원하지 않는다면 자동으로 1.1을 쓴다.
    • 암호화된 연결만 지원한다.
    • 서버는 ALPN(Application-Layer Protocol Negotiation)이나 NPN(Next Protocol Negotiation)을 지원해야 한다.
  • HTTP/2를 사용하는 곳(그 당시)
    • HomeKit 원격 접근(iCloud를 통한)
    • 구글과 트위터
    • 오픈소스 웹서버
    • CDN 프로바이더들
  • WatchOS에서도 URLSession 사용이 가능하다.
    • 가장 큰 차이는 와치는 폰을 통한 통신과 와이파이 통신 중에서 가장 좋은 것을 선택한다는 것이다.
    • 에셋 다운로드는 최소화하라
      • 화면도 작고
      • 대역폭도 작고
      • 컴퓨팅 파워도 높지 않다.
    • 앱은 굉장히 짧은 시간만 돌것이다. 그리고 기본 세션은 앱이 켜져 있을 때만 동작한다.
      • 데이터 보내는 것은 최소화
      • 큰 데이터를 송수신 할거면 백그라운드 태스크를 써라. -> 2014년 네트워킹 영상을 볼 것
  • NSURLConnection은 deprecated됨
    • Watch는 아예 미지원하니, 빨리 옮겨라
    • 다행히 옮기는 것은 쉽다.
  • URLSession의 새로운 API
    • app과 extension간의 쿠키 공유
      • 기본적으로는 비활성화되어 있다.
      • NSHTTPCookieStorage를 사용해서 config에 지정한다.
    • NSURLSessionStreamTask - NSInputStream과 NSOutputStream의 대체제
      • HTTP외의 다른 연결을 원할 때 사용
      • 비동기 읽기/쓰기 인터페이스
      • HTTP 프록시 지원 -> DataTask를 StreamTask로 변환 가능
      • 레거시 NSStream 지원 -> captureStream()
      • TCP/IP 지원
      • NSURLSessionConfiguration과 delegate를 그대로 사용
      • Secure TLS 지원. 연결된 이후에도 설정 가능!