HTTP?
HTTP란 HyperText Transfer Protocol로 문서 간의 링크를 전송하는 프로토콜이다.
HTML 메시지에 HTML 뿐만 아니라 텍스트나 이미지, 음성, 영상 JSON 등 거의 모든 형태의 데이터가 전송이 가능하며 서버간의 데이터 전송 시에도 대부분 HTTP를 사용한다.
현재 주로 사용하는 HTTP/1.1과 HTTP/2는 TCP를 기반으로 하고 있다.
HTTP의 특징
1️⃣ 클라이언트 서버 구조
- Request Response 구조
- 클라이언트가 서버에 요청을 보내고 응답을 대기
- 서버가 요청에 대한 결과를 만들어 응답
- 비즈니스 로직과 데이터는 모두 서버가 처리하고 UI 등은 클라이언트가 처리한다
- 클라이언트와 서버의 분리를 통해 클라이언트와 서버가 각각의 성장이 가능!
2️⃣ Stateless (무상태 프로토콜)
서버가 클라이언트의 상태를 보존하지 않기 때문에 클라이언트는 이어지는 요청이라도 반복해서 보내야 한다
예) 햄버거 주문 → 햄버거 세트 주문 → 햄버거 세트 2개 주문 → 햄버거 세트 2개, 신용카드로 결제
❓ Stateful(상태 유지)라면?
햄버거 주문 → 세트 → 2개 → 신용카드 결제
하지만 결제 진행 중 오류가 발생하면 클라이언트는 처음부터 다시 요청을 시작해야 한다
만약 중간에 서버가 변경된다면 다른 서버에게 상태 정보를 전달해야 한다
장점 : 데이터를 저장해두지 않아도 되기 때문에 응답 서버를 쉽게 바꿀 수 있으며 서버의 확장성이 높다
단점 : 클라이언트가 너무 많은 데이터를 보내게 된다
3️⃣ 비연결성(Connectionless)
- HTTP는 기본이 연결을 유지하지 않는 모델
- 1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작다
- 사람들이 연속적으로 검색 버튼을 누르지 않는다
- 서버의 자원을 매우 효율적으로 사용할 수 있다
- BUT, 요청마다 TCP/IP 연결을 새로 맺어야 하기 때문에 3 way handshake 시간이 추가된다
- 웹 브라우저 사이트를 요청하면 HTML, JS, CSS, 이미지 등 수많은 자원이 함께 다운로드 된다
- 현재는 HTTP 지속 연결(Persistent Connections)로 문제를 해결
연결을 계속 유지한다면?
서버의 자원이 계속 소모되고 한 번 연결을 해두면 클라이언트가 요청을 이어가지 않더라도 계속 연결을 유지해야 한다...
연결을 유지하지 않는다면?
요청이 완료되면 연결을 끊고 새로운 요청을 할 때마다 연결을 새로 맺는다
HTTP 메시지
요청 메시지
start-line
request-line(method SP(공백) request-target SP HTTP-version CRLF(공백 라인))
method(메소드)
GET, POST, PUT, DELETE 등으로 서버가 수행해야 할 동작을 지정한다
request-target(요청 메시지, 요청 대상)
absolute-path[?query] : 절대경로(/로 시작하는 경로)
응답 메시지
start-line
status-line(HTTP-version SP status-code SP reason-phrase CRLF)
header
header-field : field-name: OWS(공백 허용) field-name OWS
- field-name은 대소문자 구분❌
- Body를 제외하고 HTTP 전송에 필요한 모든 부가정보를 포함
- 메시지 바디의 내용, 바디의 크기, 압축, 인증, 요청 클라이언트 정보 등
- 필요시 임의의 헤더를 추가 가능하다
message-body
- 실제 전송할 데이터
- HTML 문서, 이미지, 영상 JSON 등 Byte로 표현 가능한 모든 데이터를 전송 가능
📚 Reference
[인프런] 모든 개발자를 위한 HTTP 웹 기본 지식
'CS > HTTP' 카테고리의 다른 글
🌐 TCP와 UDP 정리 (0) | 2021.02.05 |
---|---|
HTTP 메소드의 종류와 특징, 속성 (0) | 2021.01.13 |
주소창에 URL을 입력하면 일어나는 일 (0) | 2020.12.31 |
URI vs URL vs URN (0) | 2020.12.31 |