http 메세지에 모든 것을 담아서 전송할 수 있다.
HTTP/0.9 -> HTTP/1.0 -> HTTP/1.1 -> HTTP/2 -> HTTP/3
TCP: HTTP/1.1, HTTP/2
UDP: HTTP/3
예시) 크롬 브라우저에서 개발자 도구 Network에서 protocol 확인하기
h2는 HTTP/2를 말한다.
각각 독립적으로 발전하기 위해 클라이언트 서버 개념을 분리하는 것이 중요하다.
UI
, 사용성
비지니스 로직
, 데이터
HTTP는 무상태 프로토콜을 지향한다.
서버가 클라이언트의 상태를 보존하지 않는다.
상태 유지(Stateful), 무상태(Stateless) 차이
상태 유지(Stateful)
항상 같은 서버가 유지되어야 한다.
최소한으로 사용하는 것이 좋다.
일반적으로 쿠키 세션을 사용해서 상태를 유지한다.
예시) 로그인
무상태(Stateless)
상태 유지X, 응답 서버를 쉽게 바꿀 수 있다.
클라이언트가 요청을 할 때 필요한 정보를 다 담아서 보내기 때문에 서버가 바뀌어도 된다.
갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다.
스케일 아웃(서버를 늘리는 것, 수평 확장) 유리하다.
전송된 데이터가 상태 유지(Stateful)에 비해 많다.
HTTP는 기본이 연결을 유지하지 않는 모델이다.
서버는 연결을 유지하지 않고 요청이 필요할 때 연결한다.
TCP/IP 연결 ->
클라이언트의 요청 -> 서버 응답 -> 연결 종료
특징
서버는 최소한의 자원으로 유지할 수 있다.
일반적으로 초 단위의 이하의 빠른 속도로 응답한다.
수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 작다.
한계와 극복
TCP/IP 연결을 새로 맺어야 한다(3 way handshake 시간 발생).
브라우저로 사이트 요청을 하면 수많은 자원(HTML, Js, css 등)이 함께 다운로드 된다.
지금은 지속 연결(Persistent Connections)로 문제를 해결하였고, HTTP/2, HTTP/3에서 더욱 최적화 되었다.
지속 연결이란
클라이언트 요청 후 서버와 연결한다.
필요한 자원을 각각 요청 후 모두 응답 받고 그 후 연결이 종료하는 것을 말한다.
HTML 요청 -> 서버 응답 -> //각각 연결된 상태
CSS 요청 -> 서버 응답 ->
JS 요청 -> 서버 응답 ->
연결 종료
연결을 계속 유지하는 모델이라면?
서버는 연결을 계속 유지하고, 서버 자원이 소모된다.
서버는 사용하지 않은 클라이언트도 연결을 계속 유지해야 한다.
TCP/IP 연결 ->
클라이언트1의 요청 -> 서버 응답 ->
클라이언트2의 요청 -> 서버 응답 ->
클라이언트3의 요청 -> 서버 응답
start-line 시작 라인
header 헤더
empty line 공백 라인(CRLF)
message body
header(헤더)
메세지 바디 내용, 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보
HTTP 전송에 필요한 모든 부가 정보를 담고 있다.
표준 헤더가 많다.
필요할 경우 임의의 헤더를 추가할 수 있다.
message body(바디)
실제 전송할 데이터
html 문서, 이미지, 영상, JSON 등 byte로 표현할 수 있는 모든 데이터를 전송할 수 있다.
시작라인(GET /search~)
헤더(Host:www~)
예시)
GET /search?q=hello HTTP/1.1
Host:www.google.com
HTTP 메서드
SP(공백) 요청 대상
SP HTTP 버전
CRLF(엔터)시작라인(HTTP/1.1 200 0k)
헤더(Content-Type~)
공백
바디
HTTP 버전
SP 상태 코드
이유 문구
CRLF