모든 것이 HTTP
HTTP: HyperText Tranfer Protocol
초기에는 하이퍼텍스트 전송으로 시작했지만, 현재는 HTTP 메시지에 모든 것을 전송.
(심지어 서버간에 데이터를 주고 받을때도 사용)
실무에서 일 해보면 서버간 TCP 프로토콜 이용할 일 거의 없음 => 대부분 HTTP 프로토콜 이용
HTTP/1.1 1997년: 가장 많이 사용, 우리에게 가장 중요한 버전이다.
HTTP/2 , HTTP/3 : 성능 개선에 초점을 맞춤
TCP : HTTP1.1(현재 주로 사용), HTTP/2
UDP : HTTP/3
클라이언트 서버 구조
무상태 프로토콜(stateless), 비 연결성
HTTP 메시지
단순함, 확장가능
클라이언트 서버 구조
이전에는 분리되어 있지 않았던 클라이언트와 서버를 개념적으로 분리를한다.
비즈니스 로직과 데이터는 모두 서버에 집어넣는다.
UI와 사용성은 클라이언트가 집중한다.
=> 클라이언트와 서버가 각각 독립적으로 진화할 수 있다.
Stateful, Stateless
무상태 프로토콜을 지향한다 => 서버가 클라이언트의 상태를 보존하지 않는다
Stateful: 상태를 유지
Stateless: 상태를 유지하지 않음
무상태는 점원(서버)가 필요한 데이터를 고객(클라이언트)가 모두 넘겨준다
즉,
상태 유지는 중간에 점원(서버)이 바뀌면 안된다.
한계) 최소한으로 어쩔수 없이 사용함
무상태는 중간에 점원(서버)이 바뀌어도 된다.
한계 )데이터를 너무 많이 보냄
비 연결성(connetcionless)
HTTP는 기본적으로 연결을 유지하지 않는 모델이다.
초 단위의 속도로 응답하기 때문에 수천명이 동시에 서버에 접속해도 실제 동시 처리하는 요청은 수십개 이하로 매우 작음
서버 자원을 매우 효율적으로 사용할 수 있다.
비연결성의 단점
1. TCP/IP 를 새로 연결해야함 -> 3 way handshake 시간이 추가됨
2. 웹 브라우저로 요청하면 HTML뿐 아니라 JS, CSS, 추가 이미지 등 많은 자원이 함께 다운로드 된다.
지금은 HTTP 지속연결 (Pesistent Connections)로 문제를 해결
HTTP 메시지 (가장 중요)
start-line = request-line / status line 크게 두 개로 분류
요청 메시지 - HTTP 메서드
GET /search?q=hello&hi=ko HTTP/1.1
Host: www.google.com
종류: GET, POST, PUT ,DELETE
서버가 수행해야 할 동작을 지정해준다
GET: 리소스 조회 , POST: 요청 내역 처리
요청메시지 - 요청대상
GET/ search?q=hello&hi=ko HTTP/1.1
Host: www.google.com
absolute-path?query
절대경로 = "/" 로 시작하는 경로
=>절대경로로 시작한다 정도로만 이해하면 됨
요청 메시지 - HTTP 버전
GET/search?q=hello&hi=ko HTTP/1.1
Host: www.google.com
HTTP/1.1 200 OK
HTTP-version SP status-code SP reason-phrase CRLF
status-code
200: 성공
400: 클라이언트 요청 오류
500: 서버 내부 오류
HTTP 헤더 용도
HTTP 전송에 필요한 모든 부가정보
ex) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보
메시지 바디를 제외한 필요한 메타데이터가 모두 들어가 있다고 이해하자
실제 전송할 모든 데이터
HTMl 문서, 이미지, 영상, JSON 등등 byte로 표현할 수 있는 모든 데이터 전송 가능
HTTP와 HTTP 메시지도 매우 단순하다.
표준 기술들이 크게 성공하려면 단순하고 확장에 열려있어야 한다.
Reference
김영한 님 - 모든 개발자를 위한 HTTP 웹 기본 지식