HTTP(Hypertext Transfer Protocol)는 응용 계층에서 정보를 주고받는 데 사용되는 프로토콜이다.
주요 특성으로는 4가지를 들 수 있다.
- request-response 기반 protocol
HTTP는 클라이언트-서버 구조 기반의 request-response protocol이다. 그리고 같은 HTTP 메시지일지라도 HTTP 요청 메시지와 HTTP 응답 메시지는 형태가 다르다.
- 미디어 독립적 protocol
HTTP는 주고받을 자원의 특성과 무관하게 그저 자원을 주고받을 수간(인터페이스)의 역할만을 수행한다. 실제로 HTTP를 통해서 HTML, JPEG, PNG, JSON, XML, PDF 파일 등 다양한 종류의 자원을 주고받을 수 있다.
HTTP에서 메시지로 주고받는 자원의 종류를 미디어 타입(media type)이라 부른다. MIME 타입(Multipurpose Internet Mail Extension Type)이라고도 부른다. 즉, HTTP는 주고받을 미디어 타입에 특별히 제한을 두지 않고 독립적으로 동작이 가능한 미디어 독립적인 프로토콜이라 할 수 있다.
미디어 타입은 기본적으로 슬래시를 기준으로 하는 '타입/서브타입(type/subtype)'형식으로 구성된다.
타입은 데이터의 유형을 나타내고, 서브타입은 주어진 타입에 대한 세부 유형을 나타낸다.(ex. text/plain, text/html, image/png, image/jpeg 등등) 또한 미디어 타입에는 부가적인 설명을 위해 선택적으로 매개변수가 포함될 수도 있다.(ex. type/html;charset=UTF-8)
- stateless protocol
HTTP는 상태를 유지하지 않는 stateless 프로토콜이다. 이는 서버가 HTTP 요청을 보낸 클라이언트와 관련된 상태를 기억하지 않는다는 의미이다. 때문에 클라이언트의 모든 HTTP 요청은 기본적으로 독립적인 요청으로 간주된다.
HTTP 서버는 일반적으로 많은 클라이언트와 동시에 상호 작용한다. 동시에 처리해야 할 요청 메시지의 수는 수없이 많아질 수 있다. 이러한 상황에서 모든 클라이언트의 상태 정보를 유지하는 것은 서버에 큰 부담이다.
또한, 서버는 하나가 아니라 여러 대로 구성될 수도 있다. 이런 상황에서 모든 서버가 모든 클라이언트의 상태를 유지할 경우 클라이언트는 여러 서버를 동시에 이용하기가 어려워진다. HTTP가 상태를 유지하는 프로토콜이었다면 클라이언트는 자신의 상태를 기억하는 특정 서버하고만 상호 작용할 수 있게 되어, 특정 클라이언트가 특정 서버에 종속될 수 있다. 이러한 상황에서 어느 한 서버에 문제가 발생하면 해당 서버에 종속된 클라이언트는 직전까지의 HTTP 통신 내역을 잃어버리는 상황이 발생할 수 있다.
HTTP가 처음 만들어졌을 때부터 오늘날까지 이어지는 중요한 설계 목표는 확장성(scalability)과 견고성(robustness)이다. 상태를 유지하지 않는 stateless한 특성은 필요하다면 언제든 쉽게 서버를 추가할 수 있기 때문에 확장성이 높고, 서버 중 하나에 문제가 생겨도 쉽게 다른 서버로 대체가 가능하기 때문에 견고성이 높다.
- 지속 연결 protocol
기본적으로 HTTP는 TCP상에서 동작하는데, HTTP는 비연결형 프로토콜이지만, TCP는 연결형 프로토콜이다. 따라서 초기의 HTTP 버전(HTTP 1.0 이하)은 three way handshake를 통해 TCP 연결을 수립한 후, 요청에 대한 응답을 받으면 연결을 종료하는 방식으로 동작했다. 추가적인 request-response를 하기 위해서는 다시 TCP 연결을 수립해야 했다. 이러한 방식을 비지속 연결이라고 한다.
하지만 최근 대중적으로 사용되는 HTTP 버전(HTTP 1.1 이상)은 지속 연결(persistent connection)이라는 기술을 제공한다. 다른 표현으로는 킵 얼라이브(keep alive)라고도 부른다. 이는 하나의 TCP 연결상에서 여러 개의 request-response를 주고받을 수 있는 기술이다. 지속 연결 기능을 지원하는 HTTP는 매번 새롭게 연결을 수립하고 종료해야 하는 비지속 연결에 비해 더 빠르게 여러 HTTP 요청과 응답을 처리할 수 있다.
HTTP 메시지는 시작 라인(start line), 필드 라인, 메시지 본문으로 이루어져 있다. 필드 라인은 없거나 여러 개 있을 수 있고, 메시지 본문은 없을 수 있다. 또한, 필드 라인과 메시지 본문 사이에는 빈 줄바꿈이 있다.
- start line
HTTP 메시지는 HTTP 요청 메시지일 수도 있고, HTTP 응답 메시지일 수도 있다. 이때, HTTP 메시지가 HTTP 요청 메시지일 경우 시작 라인은 '요청 라인'이 되고, HTTP 메시지가 HTTP 응답 메시지일 경우 시작 라인은 '상태 라인'이 된다.
HTTP 요청 라인(request line)의 형식은 다음과 같다.
메서드 (공백) 요청 대상 (공백) HTTP 버전 (줄바꿈)
메서드(method): 클라이언트가 서버의 자원(요청 대상)에 대해 수행할 작업의 종류를 나타낸다.
요청 대상(request target): HTTP 요청을 보낼 서버의 자원을 의미한다. 보통 이곳에는 (쿼리가 포함된) URI의 경로가 명시된다.
HTTP 버전(HTTP version): HTTP 버전을 의미힌다. ex)HTTP/1.1
HTTP 메시지가 HTTP 응답 메시지일 경우 시작 라인은 다음과 같은 상태 라인(status line)이 된다.
HTTP 버전 (공백) 상태 코드 (공백) 이유 구문* (줄바꿈)
ex) HTTP/1.1 200 OK
ex) HTTP/1.1 404 Not Found
HTTP 버전(HTTP version): HTTP 버전을 의미한다.
상태 코드(status code): 요청에 대한 결과를 나타내는 세 자리 정수이다.
이유 구문(reason phrase): 상태 코드에 대한 문자열 형태의 설명을 의미한다.
- field line
필드 라인에는 0개 이상의 HTTP 헤더(HTTP header)가 명시된다.(header line이라고도 한다)
HTTP 헤더란 HTTP 통신에 필요한 부가 정보를 의미한다. 필드 라인에 명시되는 각 HTTP 헤더는 콜론을 기준으로 헤더 이름(header name)과 하나 이상의 헤더 값(header value)으로 구성된다.
ex)
GET /example-page HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101
Firefox/118.0
Accept: text/html
- message body
HTTP request 혹은 response 메시지에서 본문이 필요한 경우 이는 메시지 본문(message body)에 명시된다. 메시지 본문은 존재하지 않을 수도 있고, 다양한 콘텐츠 타입이 사용될 수도 있다.(ex. JSON, HTML...)