HTTP
작성일
HTTP란?
HTTP란 HyperText Transfer Protocol의 줄임말로 과거에는 HyperText(문서간의 링크를 통해 연결한 HTML)를 전송하기 위한 프로토콜이였으나 현재는 거의 모든 형태의 데이터를 HTTP 메시지로 전송 가능하다. (HTML, TEXT, IMAGE, 음성, 영상, 파일, JSON, XML(API) 등)
HTTP 버전은 HTTP/1.1을 가장 많이 사용한다. HTTP/1.1이 제일 중요한데 그 이유는 HTTP/1.1에 거의 모든 기능이 들어있고 HTTP/2, HTTP/3은 성능 개선에 초점이 맞춰져 있다.
HTTP/1.1과 HTTP/2는 TCP 기반 프로토콜이며 HTTP/3은 UDP 기반 프로토콜이다.
참고
TCP 프로토콜 위에 HTTP 프로토콜이 있고 현재는 TCP 프로토콜은 거의 사용하지 않고 HTTP 프로토콜을 사용한다.
HTTP 특징
HTTP의 특징은 4가지가 있다. 그 중에서 HTTP 메시지가 가장 중요하다.
1. 클라이언트 - 서버 구조
HTTP는 Requst, Response 구조이다. 클라이언트는 서버에 요청을 보내고 응답을 대기하고, 서버는 요청에 대한 결과를 만들어서 응답한다.
클라이언트와 서버를 분리
한게 중요하다. 비즈니스 로직과 데이터는 서버에 처리하고, 클라이언트는 UI, 사용성에 집중한다. 이러한 설계 구조는 클라이언트와 서버가 각각 독립적으로 진화를 할 수 있다는 장점이 있다.
2. 무상태 프로토콜(stateless)
HTTP의 중요한 특징 중 하나는 무상태 프로토콜
을 지향한다는 것이다.
무상태 프로토콜
이란 특징 때문에 서버가 클라이언트의 상태를 보존하지 않으므로 서버 확장성이 높다는 장점이 있다. 무한한 서버 증설이 가능하므로 스케일 아웃에 유리하다. 따라서, 대용량 트래픽이 발생해도 서버를 많이 증설하여 대응할 수 있는 부분이 많아진다. 반면, (stateless 하기 때문에) 클라이언트가 추가적으로 보낼 데이터가 많다는 단점도 있다.
서버가 클라이언트의 상태를 보존하지 않는 형태로 설계하도록 노력해야 하고 상태를 유지해야 하는 경우엔 쿠키, 세션, 토큰과 같은 방법을 사용한다.
웹 애플리케이션 설계는 최대한 무상태
로 설계하고 정말 어쩔수 없는 경우에 한해서 상태유지를 하도록 설계해야 한다.
비 연결성 (connectionless)
HTTP는 기본이 연결을 유지하지 않는 모델이다. 클라이언트가 서버에 요청을 하고 응답을 받으면 바로 TCP/IP 연결을 끊어 연결을 유지하지 않는다. 따라서, 서버의 자원을 효율적으로 관리하고 수 많은 클라이언트의 요청에 대응할 수 있게 한다.
하지만, 매번 TCP/IP 연결을 새로 맺어야 하므로 3 way handshake(SYN, SYN+ANK, ANK)에 대한 시간이 소요된다는 한계점도 가지고 있다. 이러한 한계점을 극복하기 위해 HTTP/2, HTTP/3에서는 HTTP 지속 연결(Persistent Connections)을 통해 최적화했다.
참고 비연결성 vs Stateless
비연결성은 TCP/IP 커넥션 연결을 지속하지 않는다 는 뜻이고 Stateless는 클라이언트와 서버 사이에 상태를 유지하지 않는다 는 뜻이다.
참고 클라이언트와 서버간의 연결 과정
- 브라우저에서 URL을 입력하고 엔터를 누른다.
- DNS 서버에서 해당 URL의 아이피를 조회한다.
- 아이피에 해당하는 서버와 TCP 연결을 한다. 이때, 3 way handshake를 통해 연결한다.
- 이후 HTTP 요청/응답을 한다.
참고 TCP, HTTP
TCP의 특징으로 연결 지향이 있다. 그리고 HTTP를 사용하면 TCP도 사용하게 되는데 HTTP의 특징이 왜 비연결성일까? TCP의 연결지향과 HTTP의 비연결성은 결이 다르다. TCP의 연결지향적 특징으로 3 way handshake가 있는데 TCP는 UDP와 다르게 먼저 내가 요청 보낼 곳과 연결할 수 있는지를 체크하는 로직이 있다는 점에서 연결지향적이다. 반면, HTTP는 기본적으로 SOCKET 통신과 달리 요청과 응답을 받고 나면 연결을 끊고, 요청이 필요할 때마다 연결을 하는 비연결성을 보인다.
3. HTTP 메시지(⭐ 매우 중요)
HTTP 메시지는 start line, headers, blank line(공백), body(message body)로 구분된다.
HTTP 요청 메시지와 HTTP 응답 메시지의 start-line은 다르게 생겼다.
start-line(시작 라인)
HTTP 요청 메시지
start-line은 request-line이라고도 한다. request-line은 다음과 같게 작성한다.
**method** SP(공백) **request-target** SP **HTTP-version** CRLF(엔터)
- HTTP 메서드(method)
- 종류: GET, POST, PUT, DELETE…
- 서버가 수행해야 할 동작 지정
- GET: 리소스 조회
- POST: 요청 내역 처리
- 요청 대상(request-target)
- /search?q=hello&hl=ko
- absolute-path[?query] (절대경로[?쿼리])
- 절대경로 = “/” 로 시작하는 경로
- 참고: *, http://…?x=y와 같이 다른 유형의 경로지정 방법도 있다
- HTTP Version(HTTP-version)
- HTTP/1.1
HTTP 응답 메시지
start-line(시작 라인)
- start-line = status-line
- status-line =
HTTP-version
SP(공백)status-code
SPreason-phrase
CRLF(엔터)
- HTTP 버전(HTTP-version)
- HTTP 상태 코드(status-code)
- 요청 성공, 실패를 나타냄
- 200: 성공
- 400: 클라이언트 요청 오류
- 500: 서버 내부 오류
- 요청 성공, 실패를 나타냄
- 이유 문구(reason-phrase)
- 사람이 이해할 수 있는 짧은 상태 코드 설명 글
header 헤더
**field-name** "**:**" OWS **field-value** OWS (OWS: 띄어쓰기 허용)
# 예제
Host: www.google.com
HTTP 헤더 용도
HTTP 전송에 필요한 모든 부가 정보가 있다. (메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보 등) 필요 시 임의의 헤더도 추가 가능하다. (helloworld: hihi)
메시지 바디
실제 전송할 데이터가 있다. HTML 문서, 이미지, 영상 JSON 등등 byte로 표현할 수 있는 모든 데이터를 전송 할 수 있다.
4. 단순하고, 확장 가능
HTTP는 단순하다. HTTP 메시지도 매우 단순하다. 크게 성공하는 표준 기술은 단순하지만 확장 가능한 기술이다.