IP통신
노드(컴퓨터)에 할당된 IP주소에 패킷(packet) 통신단위로 데이터를 전달한다.
Packet
패킷은 pack + bucket 으로 합쳐진 단어이다. 소포라고 볼 수 있다.
IP패킷은 우체국 송장처럼 출발지 IP, 전송지 IP같은 내용을 포함한다.


IP프로토콜의 문제점
- 비연결성
- 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송
- 비신뢰성
- 중간에 패킷이 사라질 수 있다.
- 패킷의 순서를 보장할 수 없다.
TCP & UDP
네트워크 계층 구조

패킷 전달 구조

TCP/IP 패킷

TCP(Transmission Control Protocol)
- 연결 지향 - TCP 3 way handshake(가상 연결)
- 데이터 전달 보증
- 순서 보장
- 신뢰할 수 있는 프로토콜
3 way handshake

통신 시작 전 거치는 인증 과정
종료 과정은 4 way handshake라고 따로 있다.
TCP 장점
- 데이터 전달 보증
- 데이터 전송이 성공적으로 이루어지면 이에 대한 응답을 돌려주기 때문에 IP패킷의 한계인 비연결성을 보완할 수 있다.
- 순서 보장
- 패킷이 순서대로 도착하지 않았을 때 TCP세그먼트에 있는 정보를 토대로 다시 패킷 전송을 요청 할 수 있다.
- 이를 통해 IP 패킷의 한계인 비신뢰성(순서를 보장하지 않음)을 보완할 수 있다.

UDP
- UDP는 IP 프로토콜에 PORT, 체크섬 필드만 추가된 단순한 프로토콜이다.
- TCP와 비교하여 신뢰성은 낮지만 3 way handshake를 사용하지 않기 때문에 속도가 빠르다.
UDP특징
- 비 연결 지향 - TCP 3 way handshake 사용 x
- 데이터 전달 보증 x
- 순서 보장 x
- 데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠름
- 신뢰성보다는 연속성이 중요한 서비스 (e.g. 실시간 스트리밍)에 자주 사용된다.
HTTP

HTTP 특징
- 클라이언트 서버 구조

- 무상태 프로토콜(Stateless)
- 장점 : 서버 확장성 높음(스케일 아웃)
- 단점 : 클라이언트 추가 데이터 전송
- 로그인 같이 상태가 유지되어야 하는 요소는 쿠키, 세션, 토큰 등의 방식을 이용한다.
- 비연결성(Connectionless)
- 연결성과 비연결성(Connection Oriented vs Connectionless model)
- HTTP는 기본이 연결을 유지하지 않는 모델
- 일반적으로 초 단위 이하의 빠른 속도로 응답
- 1시간 동안 수천명이 서비스를 이용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작다.


- 비연결성의 한계
- 요청, 응답 마다 TCP/IP 연결을 새로 맺어야 한다. - 3 way handshake
- 웹 브라우저로 사이트를 요청하면 HTML뿐만 아니라 자바스크립트, CSS, 추가 이미지 등 수많은 자원이 함께 다운로드
- 현재 HTTP 지속 연결(Persistent Connections)로 문제 해결
- HTTP/2, HTTP/3에서 더 많은 최적화
- HTTP/2는 TCP기반 HTTP/3은 UDP기반


HTTP 헤더
표현 헤더, 콘텐츠 협상 헤더로 나뉜다. 또한 요청 메세지와 응답 메세지에서 사용되는 헤더가 틀리다.
헤더의 형식은
<field-name> : <field-value>
와 같고 field-name은 대소문자 구분이 없다.
- 표현 헤더(Representation Header) : 메시지 본문(message body, payload)의 전달할 데이터를 해석할 수 있는 정보를 제공하는 헤더
- Content-type : 표현 데이터의 형식
- Content-Encoding : 표현 데이터의 압축 방식
- Content-Language : 표현 데이터의 자연 언어
- Content-Length : 표현 데이터의 길이
- 콘텐츠 협상 헤더(Content Negotiation Header) : 요청 메세지에서만 사용됨, 클라이언트가 선호하는 표현을 지정하는 헤더이다.
- Accept : 클라이언트가 선호하는 미디어 타입 전달
- Accept-Charset : 클라이언트가 선호하는 문자 인코딩
- Accept-Encoding : 클라이언트가 선호하는 압축 인코딩
- Accept-Language : 클라이언트가 선호하는 자연 언어
- 받는 표현 타입이 여러개일때 우선순위를 지정해 줄 수 있다.
- 0~1 까지 클수록 높은 우선순위, 1은 생략 가능 ‘ ;q=숫자 ’ 형식으로 우선순위 지정
- e.g. Accept-Language : ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
- 요청 메세지에서 많이 사용되는 헤더
- From : 유저 에이전트의 이메일 정보
- Referer : 이전 웹 페이지 주소
- 현재 요청된 페이지의 이전 웹 페이지 주소
- 이걸 써서 유입경로 수집 가능
- referer는 referrer의 오타인데 이걸로 굳어짐
- User-Agent : 유저 에이전트 애플리케이션 정보
- 클라이언트의 애플리케이션 정보(웹 브라우저 정보 등등)
- 통계 정보
- 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능
- Host : 요청한 호스트 정보(도메인)
- 필수 헤더
- 하나의 서버가 여러 도메인을 처리해야 할 때 호스트 정보를 명시하기 위해 사용
- Origin : 서버로 POST 요청을 보낼 때, 요청을 시작한 주소를 나타냄
- 요청을 보낸 주소와 받는 주소가 다르면 CORS에러가 발생한다.
- 응답 헤더의 Access-Control-Allow-Origin과 관련
- Authorization : 인증 토큰(e.g. JWT)을 서버로 보낼 때 사용하는 헤더

- 응답 메세지에서 많이 사용되는 헤더
- Server : 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보
- Date : 메세지가 발생한 날짜와 시간
- Location : 페이지 리디렉션
- Allow : 허용 가능한 HTTP메서드
- Retry-After : 유저 에이전트가 다음 요청을 하기까지 걸리는 시간
HTTP 헤더 - 캐시
e.g.
- Cache-Control : max-age=60 (60초동안 페이로드 클라이언트의 캐시에 저장, 응답에서 사용)
- max-age
- no-cache : max-age = 0과 동일
- no-store : 민감한 데이터라 캐시저장을 아예안하는 옵션
- Last-Modified : 2021년 3월 3일 08:00:00 (데이터가 마지막으로 수정된 시간, 요청에서 사용)
- If-Modified-Since : 2021년 3월 3일 08:00:00 (이전에 Last-Modified로 보내놨으면 캐시가 만료됐어도 조건부 요청 가능, 만일 변경이 없었으면 304 Not Modified로 응답)