- 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 지원. 연결된 이후에도 설정 가능!