HTTP란?
먼저 위키피디아에서 제공하는 HTTP의 정의를 살펴보자.
https://ko.wikipedia.org/wiki/HTTP
HTTP(HyperText Transfer Protocol, 문화어: 초본문전송규약, 하이퍼본문전송규약)는 W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용한다.
이 정의를 나름대로 요약해보면, HyperText Transfer Protocol의 준말로 인터넷 상에서 데이터를 주고 받기 위한 프로토콜(규약, 약속)이다.
본래 네트워크상에서 교환하는 데이터는 주로 한 문서와 다른 문서를 연결하는 하이퍼링크를 포함하는 텍스트 문서의 형식이었는데, 이것의 이름이 HyperText이다. 다만 '주로' 교환하는 데이터 형식이 HTML같은 HyperText였을 뿐, 이론상으로는 JSON, mp4, mp3, 등등 모든 종류의 데이터를 교환할 수 있기 때문에,
기술이 발달하고 예전처럼 데이터 형식으로 문서만을 사용하지는 않는 요즘, 오늘날의 HTTP의 HyperText는 HyperMedia로 해석하는 것이 나을 듯 싶다.
특징
- OSI 7 계층 중, Application Layer 계층의 프로토콜로 주로 TCP/IP 위에서 작동한다.
- 서버/클라이언트 모델이다
- HTTP는 클라이언트가 서버에 요청을 하고, 서버는 그에 응답하는 단방향 모델이다.
- 클라이언트의 요청에 대한 서버의 응답은 요청 처리 결과에 따라 각기 다른 응답코드로 나뉜다. 따라서 응답코드 별로 처리 로직을 짜서 각 상황에 대응할 수 있다.
- 전송되는 데이터들을 암/복호화 하지 않기 때문에 보안이 취약하다
-> 제 3자가 데이터를 엿볼 가능성이 있다. 이를 보안하기 위한 것이 바로 HTTPS이다.
- 간단하다.
- 초반 HTTP/1의 경우, 사람이 읽어도 이해가 가능할 정도로 간단하게 고안되었다. HTTP/2에서 binary 코드가 더해짐에 따라 더 복잡해지기는 했지만, 캡슐화를 통해 간결함을 유지하였다.
- 확장가능하다.
- 클라이언트와 서버가 새로운 헤더의 시멘틱(semantic)에 대하여 합의만 한다면, 얼마든지 새로운 기능을 추가하여 확장하는 것이 어렵지 않다.
- 비연결성(Connectionless)
- 클라이언트와 서버가 한 번 연결을 맺은 후, 클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 연결을 끊어 버리는 성질을 말한다.
- 장점
- HTTP는 인터넷 상에서 불특정 다수의 통신 환경을 기반으로 설계되었는데, 만약 서버에서 다수의 클라이언트와 연결을 계속 유지해야 한다면, 이에 따른 많은 리소스가 발생하게 된다. 따라서 연결을 유지하기 위한 리소스를 줄이면 더 많은 연결을 할 수 있다.
- ⇒ 접속 유지를 최소한으로 하되, 더 많은 유저의 요청을 처리할 수 있다.
- 단점
- 서버는 클라이언트를 기억하지 못하므로 동일한 클라이언트의 모든 요청에 대해 매번 새로운 연결 시도/해제의 과정을 거쳐야한다.
- ⇒ 연결/해제에 대한 오버헤드(어떤 처리를 하기 위해 들어가는 간접적인 처리시간/메모리)가 발생한다.
- KeepAlive
- Connectionless의 단점(연결/해제 오버헤드)을 해결하기 위해 일시적으로 연결을 유지할 수 있는 옵션
- 무상태성(Stateless)
- Connectionless로 인해 파생된 특징. 연결이 끊어짐에 따라 서버는 클라이언트를 식별하지 못한다.
- 서버는 클라이언트의 상태를 저장하지 않는다. → 클라이언트가 이전에 했던 요청과 그 다음 요청은 아무런 연관이 없다. 즉, 서버의 응답은 연속된 요청에 대해 각각 독립적으로 반응한다.
- 장점
- 서버 확장에 대한 부담이 적다 → 서버가 많아질수록 서버 간에 정보를 공유하기 위한 비용이 비싸지기에 Stateless하게 사용하면 정보 공유를 위한 비용(시간, 메모리)등을 절약할 수 있다.
- 어느 서버가 요청을 받아도 응답이 빠르게 가능하다.
- 단점
↔
- Stateful
- 서버가 클라이언트의 상태를 저장하는 것을 Stateful이라고 한다.
흐름(Flow)
다음은 MDN사이트에 나와있는 HTTP의 흐름이다.
- TCP연결을 연다.
- HTTP 메시지를 전송한다.
```
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
```
- 서버에 의해 전송된 응답을 읽는다.
```
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
```
- 연결을 닫거나 다른 요청들을 위해 재사용한다.
HTTP 메세지
- 시작 줄(start-line)에는 실행되어야 할 요청, 또은 요청 수행에 대한 성공 또는 실패가 기록되어 있다. 이 줄은 항상 한 줄로 끝난다.
- 옵션으로 HTTP 헤더 세트가 들어간다. 여기에는 요청에 대한 설명, 혹은 메시지 본문에 대한 설명이 들어간다.
- 요청에 대한 모든 메타 정보가 전송되었음을 알리는 빈 줄(blank line)이 삽입된다.
- 요청과 관련된 내용(HTML 폼 콘텐츠 등)이 옵션으로 들어가거나, 응답과 관련된 문서(document)가 들어간다. 본문의 존재 유무 및 크기는 첫 줄과 HTTP 헤더에 명시된다.
요청(Request)
시작줄(Start line)
- HTTP Method
HTTP 요청 메서드 - HTTP | MDN
- GET : 정보를 요청하기 위해서 사용한다. (SELECT)
- POST : 정보를 밀어넣기 위해서 사용한다. (INSERT)
- PUT : 정보를 업데이트하기 위해서 사용한다. (UPDATE)
- DELETE : 정보를 삭제하기 위해서 사용한다. (DELETE)
- HEAD : (HTTP)헤더 정보만 요청한다. 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해서 사용한다.
- OPTIONS : 웹서버가 지원하는 메서드의 종류를 요청한다.
- TRACE : 클라이언트의 요청을 그대로 반환한다. 예컨데 echo 서비스로 서버 상태를 확인하기 위한 목적으로 주로 사용한다.
- 요청 타겟. 이는 URL, 또는 프로토콜, 포트, 도메인의 절대 경로로 나타낼 수도 있으며 요청 타겟 포맷은 HTTP 메소드에 따라 달라진다.
- origin 형식: 끝에
'?'
와 쿼리 문자열이 붙는 절대 경로이다. 이는 가장 일반적인 형식이며, GET
, POST
, HEAD
, OPTIONS
메서드와 함께 사용한다.
POST / HTTP 1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
- absolute 형식: 완전한 URL 형식이다. 프록시에 연결하는 경우 대부분
GET
과 함께 사용된다.
GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
- authority 형식: 도메인 이름 및 옵션 포트(
':'
)로 이루어진 URL의 authority component 이다. HTTP 터널을 구축하는 경우에만 CONNECT
와 함께 사용할 수 있다.
CONNECT developer.mozilla.org:80 HTTP/1.1
- asterisk 형식:
OPTIONS
와 함께 별표('*'
) 하나로 간단하게 서버 전체를 나타낸다.
OPTIONS * HTTP/1.1
- HTTP version
HTTP/1.0
헤더
HTTP 헤더 - HTTP | MDN
- General Header(공통 헤더)
요청 및 응답의 메시지 모두에서 사용되지만 컨텐츠에는 적용되지 않는 헤더
- Request Header(요청 헤더)
HTTP 요청에서 사용되지만 메시지의 컨텐츠와 관련이 없는 HTTP 헤더
보통 Fetch될 리소스나 클라이언트 자체에 대한 정보를 포함하여 서버로 보내진다.
- Entity Header(엔티티 헤더)
컨텐츠 길이나 MIME 타입과 같이 엔티티 바디에 대한 자세한 정보를 포함하는 헤더.
본문
요청의 마지막 부분에 들어가며, 모든 요청에 본문이 들어가지는 않는다.
응답(Response)
상태줄(Status line)
- 프로토콜 버전: 보통
HTTP/1.1
이다
- 상태 코드: 요청의 성공 여부를 나타낸다.
200
, 404
혹은 302
이다.
- 상태 텍스트: 짧고 간결하게 상태 코드에 대한 설명을 글로 나타내어 사람들이 HTTP 메시지를 이해할 때 도움이 된다.
예) HTTP/1.1 404 Not Found.
요청부분의 헤더와 매우 유사하다.
본문(body)
본문은 응답의 마지막 부분에 들어가며, 모든 응답에 본문이 들어가지는 않는다. 201, 204과 같은 상태 코드를 가진 응답에는 보통 본문이 없다.