네트워크 프로토콜 스택과 iOS에서의 네트워크 통신 방식
네트워크 프로토콜은 네트워크 통신을 위한 약속이다.
데이터의 형식, 순서, 시스템과의 조율 등 다양한 역할을 수행한다.
프로토콜 스택은 TCP/IP 4계층과 OSI 7계층 모델이 있으며, 각기 다른 역할로 사용된다.
TCP/IP 모델은 실제 네트워크 작동 방식으로 사용되며 OSI는 교육 혹은 개념적인 모델로 사용된다.
OSI 7계층
- Application: 사용자와 연결, 응용 SW를 도와주는 계층으로 하위 계층에 사용자 정보를 전달하거나 반대로 하위 계층에서 전송한 데이터를 사용자에게 전달한다.
- Presentation: 송신측과 수신측 사이에 데이터 형식을 정한다.
- Session: Port 번호를 연결
- Transport: 실제 데이터를 전송하기 위한 동작을 담당, 사용되는 프로토콜에는 TCP와 UDP가 있으며 처리되는 데이터는 Segment라고 한다.
- Network: 데이터에 경로 선출과 선출된 경로를 이용하여 데이터를 전송한다. 처리되는 데이터는 Packet이라고 한다.
- Data Link: 로컬 환경 내에서 전송을 담당, 처리되는 데이터는 Frame이라고 한다.
- Physical: 통신하는 네트워크 장비로 데이터를 전기적인 신호로 출력한다. 처리되는 데이터는 Bit라고 한다.
TCP/IP 4계층
- Application: 웹 브라우징, 파일 전송, 이메일 등 애플리케이션에서 사용되는 프로토콜 (HTTP, FTP, DNS 등)
- Transport: 프로세스를 식별하는 Port 번호를 사용하여 데이터 전송, TCP와 UDP 같은 프로토콜을 사용하여 신뢰성을 보장
- Internet: 큰 데이터를 작은 Packet으로 나누어 전송하거나 도착한 Packet을 다시 조립하는 역할, 서로 다른 네트워크를 연결하고 데이터를 라우팅하기 위해 IP 주소를 사용
- Network Interface: 네트워크 매체(이더넷 케이블, 무선 LAN)에서 데이터 전송, MAC 주소를 사용하여 데이터 전송을 제어
HTTP와 HTTPS의 차이점, iOS에서의 보안 통신 방법
HTTP는 웹 브라우저와 웹 서버 간 데이터 전송을 위한 프로토콜로 사용자의 요청과 서버의 응답을 주고 받는다.
HTTPS는 Secure이 추가된 것으로 데이터 전송을 보호하는 프로토콜이다.
SSL/TLS 프로토콜을 사용하여 통신을 암호화 하여 개인정보 유출을 방지한다.
사용자가 HTTPS에 접속하면 서버에서 인증서를 보내고 인증서가 유효하다면 신뢰할 수 있다고 판단한다.
안전한 통신을 위해 암호화 키를 교환하며 모든 데이터를 암호화하여 전송한다.
Apple은 ATSApp Transport Security라는 네트워킹 기능이 개인 정보 보호 및 데이터 무결성을 향상시킨다.
네트워크 통신을 HTTPS로 강제화한다. HTTPS라도 최소 보안 사양을 충족하지 못하면 연결을 차단한다.
필요한 경우에는 예외를 등록할 수 있지만, 보안을 저하시키는 문제가 있다.
TCP와 UDP 차이점
데이터를 보내기 위해 사용하는 프로토콜이다.
TCP는 1:1 통신방식으로 연결지향적이다. 연결지향적은 두 개체 간 연결 상태를 유지하고 교환이 가능한 것으로 논리적으로 이루어진 것이다. 쉽게 이야기하면 양측 협상으로 설정하고 데이터를 교환하고 연결을 종료한다. 신뢰성이 높지만 속도가 느리다.
TCP/IP로 쓰이며, IP가 데이터의 배달을 처리한다면 TCP는 Packet을 추적하고 관리한다.
UDP는 비연결형 서비스로 순서화되지 않은 데이터그램 방식을 제공한다. 정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않는다. TCP보다 속도가 빠르지만 신뢰성이 낮다. 1:1 뿐만 아니다 N:M 등으로 연결될 수 있다.
여기서 데이터 그램은 Packet의 동의어이다.
HTTP 는 버전이 존재하며, 2022년에는 HTTP/3가 출시되었다.
HTTP/2에서는 TCP로 전송이 되었다면 HTTP/3에서는 Quick UDP Internet Connections(QUIC)로 대체된다.
더 빠르고 짧은 지연시간의 데이터 전송을 위해 UDP를 활용하게 되었다.
하지만 아직까지 사용되는 사이트는 많지 않다. Google이 개발했으니 H3를 사용하지만 아직 네이버도 H2이다.
소켓 통신
네트워크에서 두 개의 프로그램 간 양방향 데이터 전송을 가능하게 하는 통신 방식이다.
클라이언트-서버 모델을 기반으로 작동하며, TCP/IP에서 Transport에 해당한다.
파일 전송, 온라인 게임, 채팅, 원격 제어 등 다양하게 활용된다.
Socket을 생성하고 IP주소와 Port 번호를 가지고 통신하게 된다. 서버 측에서는 연결을 수락하고 데이터를 받은 뒤 연결을 끊는다.
REST API와 iOS에서의 네트워크 요청 및 응답 처리 방법
RESTREpresentational State Transfer 아키텍처 스타일의 디자인 원칙을 준수하는 API이다. 이러한 이유로 RESTful API라고도 한다.
HTTP 요청을 통해 통신함으로써 리소스 내에서 레코드(CRUD)의 작성, 읽기, 업데이트 및 삭제 등의 표준 데이터베이스 기능을 수행한다. GET 요청을 사용하여 레코드를 검색하고 POST로 요청을 PUT으로 업데이트를 DELETE로 레코드를 삭제한다.
요청 헤더와 매개변수 역시 메타데이터, 권한 부여, URI, 캐싱, 쿠키 등의 식별자 정보를 포함하기에 REST API 호출에서 중요하다.
요청 헤더와 응답 헤더는 일반적인 HTTP 상태 코드와 함께 사용된다.
iOS에서는 URLSession으로 네트워크를 할 수 있으며, httpMethod의 기능들도 사용할 수 있다.
리소스로 표현되는 것은 JSON 혹은 다른 데이터 형식으로 인코딩 및 디코딩하여 내부 데이터를 확인할 수 있다.
HTTP 상태 코드
클라이언트 요청에 대한 서버에서 보내는 응답이다.
상태 코드 | 분류 |
1xx | 요청이 수신되고 이해된 것으로 처리가 계속되는 동안 임시로 발행 |
2xx | 요청이 성공적으로 수신되고 수락된 상태 |
3xx | 요청이 완료되려면 추가 조치가 필요한 상태 |
4xx | 요청에 잘못된 구문이 포함되거나 처리할 수 없는 상태 |
5xx | 서버가 명백히 유효한 요청을 이행하지 못한 상태 |
상태 코드 200이라면 성공적인 HTTP 요청에 대한 응답으로 GET 요청이라면 요청된 리소스에 해당하는 엔티티가 포함된다.
일반적으로는 상태 코드에 맞춰서 동작을 해야하지만 따르지 않는 경우도 있다.