[inflearn] 모든 개발자를 위한 HTTP 웹 기본 지식 (2)
웹 브라우저 요청 흐름
웹 브라우저 -> 구글 서버 [예]
: 구글 서버를 찾기 위해 DNS를 조회. (https 경우 port 443 생략)
: HTTP 요청 메시지 존재
1. 웹 브라우저가 HTTP 메시지 생성.
2. SOCKET 라이브러리 통해 전달
( OS의 TCP/IP 계층에 전달 )
3. TCP/IP 패킷 생성, HTTP 메시지 포함.
-> 수많은 인터넷 노드를 통해 해당 IP 주소로 전달.
서버에서 HTTP 메시지를 확인해서 HTTP 응답 메시지를 만들어냄.
-> 응답 패킷 전송
: HTTP 메시지를 렌더링 함. 결과를 보게 됨.
HTTP (HyperText Transfer Protocol)
거의 모든 것을 HTTP에 담아서 전송. (JSON, XML, 이미지, 파일, HTML, 서버 간 데이터를 주고 받을 때 등...)
(TCP로 통신하는 경우 거의 없음.)
HTTP의 역사
- HTTP/1.1 : 가장 많이사용. 가장 중요한 버전.
( 대부분의 기능 포함. 그 이후 버전은 성능 개선. )
특징
- 클라이언트 서버 구조
- Request(요청) Response(응답) 구조
- 클라이언트는 서버에 요청을 보내고, 응답을 대기
- 서버가 요청에 대한 결과를 만들어서 응답.
: 클라이언트와 서버를 분리.
비즈니스 로직을 서버로 / uxui, 디자인은 클라이언트에
각 분야에 집중할 수 있음.
- 무상태 프로토콜 (stateless ↔ stateful : 상태 유지)
- 서버가 클라이언트 상태를 보존 X.
- 장점 : 서버 확장성 높음 (스케일 아웃) : 수평 확장 유리
- 단점 : 클라이언트가 추가 데이터 전송.
: 모든 것을 무상태로 설계할 수 없는 경우도 있음. (ex 로그인)
(단순 서비스 소개 화면 같은 경우는 무상태로 설계 가능)
비연결성
- HTTP는 기본적으로 연결을 유지 하지 않은 모델
- 초 단위 이하의 빠른 속도로 응답
- 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음.
(ex 웹 브라우저에서 계속 연속해서 검색 버튼을 누르지는 않는다.)
- 서버 자원을 매우 효율적으로 사용할 수 있음.
: 연결이 유지 되지 않은 것이 서버의 가용성(자원)을 높일 수 있음.
비연결성의 한계와 극복
- TCP/IP 연결을 새로 맺어야 함. (3 way handshake 시간 추가)
- 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 JavaScript, CSS, 추가 이미지 등 많은 자원이 한꺼번에 다운로드
- 지속연결(persistent connections) 로 문제 해결
: 하나 받을 때 까지는 지속 연결로 유지. 응답을 받고 나서 종료.
- http/2, http/3 (UDP 프로토콜을 사용하여서 더 빨라짐)에서 더 많은 최적화.
- HTTP 메시지
요청 메시지와 응답 메시지는 조금 다름.
[메시지 구조]
시작 라인(start-line). 헤더(header). 공백 라인(empty line CRLF 무조건 있어야 함.). message-body.
요청 : body 본문 가질 수 있음.
응답 : header에서 조금 다름.
- 시작 라인
start-line = request-line / status-line
request-line = METHOD(GET, POST, PUT...) SP(공백) request-target SP(공백) HTTP-version CRLF(엔터)
request-target : 요청 대상, absolute-path (절대 경로) 로 시작
status line = HTTP-version SP status-code SP reason-phrase CRLF
HTTP 상태 코드 : 요청 성공, 실패
- HTTP 헤더
header-field = field-name ":" OWS field-value OWS (OWS: 띄어쓰기 허용)
field-name은 대소문자 구분 없음.
용도
HTTP 전송에 필요한 모든 부가 정보 포함 (필요한 메타 데이터 거의 모두 포함 : 메시지 바디 내용, 크기, 압축, 클라이언트 정보, 서버 애플리케이션 정보 등..)
표준 헤더가 너무 많음.
필요시 임의 헤더 추가.
- HTTP 메시지 바디
실제 전송할 데이터
HTML, 이미지, 영상, JSON 등..
- 단순함, 확장 가능