HTTP란?
HTTP(HyperText Transfer Protocol)는 인터넷에서 데이터를 주고받기 위한 통신 규약 중 하나다. 웹 브라우저와 웹 서버 간에 HTML, 이미지, 동영상 등의 데이터를 주고받을 때, 이 데이터는 HTTP 프로토콜을 통해 전송된다. HTTP는 클라이언트와 서버 간의 요청과 응답 방식으로 동작한다. 클라이언트가 서버로 요청을 보내면, 서버는 그 요청에 대한 응답을 보내준다. 이때 요청과 응답에는 각각의 헤더(header)와 본문(body)이 있다. 헤더는 요청/응답에 대한 부가 정보를 담고 있고, 본문은 전송할 데이터를 담고 있다.
HTTP의 역사
HTTP는 1991년에 처음으로 개발되었다. 이 당시 팀 버너스 리가 근무하던 CERN에서 제안되었으며, 당시는 "HyperText Transfer Protocol"라는 이름으로 불렸다. 그 후, HTTP/0.9(1991), HTTP/1.0(1996), HTTP/1.1(1999), HTTP/2(2015), HTTP/3(2020)과 같은 버전이 개발되었다. HTTP/1.0부터는 HTTP 헤더, 상태 코드, 쿠키 등의 기능이 추가되었고, HTTP/1.1에서는 Keep-Alive 연결, 파이프라인 요청, 분할 전송 등의 기능이 추가되었다. HTTP/2에서는 다중화(multiplexing), 헤더 압축(header compression), 서버 푸시(server push) 등의 기능이 추가되었으며, HTTP/3에서는 전송 계층 보안(TLS) 위에서 QUIC 프로토콜을 사용하는 등의 기능이 추가되었다. 현재는 대부분의 웹 페이지 및 API에서 HTTP/1.1, HTTP/2, HTTP/3이 사용되고 있다.
HTTP의 구조
HTTP 메시지는 다음과 같은 구조를 가집니다.
- 시작 라인(Start Line): 요청(Request) 또는 응답(Response) 메시지의 첫 줄이다. 요청의 경우, 메소드(Method), 요청 URL(Request URL), HTTP 버전 정보가 포함된다. 응답의 경우, HTTP 버전, 상태 코드(Status Code), 상태 메시지(Status Message)가 포함된다.
- 헤더(Header): 메시지의 부가적인 정보를 담고 있다. 헤더는 키-값 쌍의 형태로 구성되어 있다. 요청과 응답 모두에 헤더가 존재한다. 일반 헤더, 요청 헤더, 응답 헤더, 엔티티 헤더 등 다양한 종류의 헤더가 있다.
- 본문(Entity Body): 요청(Request) 또는 응답(Response) 메시지의 본문이다. 본문은 생략될 수 있다. 요청의 경우, 서버로 보내는 데이터를 포함한다. 응답의 경우, 요청에 대한 결과 데이터를 포함한다.
다음은 HTTP 요청 메시지의 예제이다.
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: https://www.google.com/
Cookie: _ga=GA1.2.1234567890.1611659421; _gid=GA1.2.9876543210.1617491769; session=abcdefg1234567890
위의 예제는 GET 메소드를 사용하여 www.example.com의 index.html 파일을 요청하는 HTTP 요청 메시지이다.
- 첫 번째 줄(Start Line) : 요청 메소드(GET), 요청 URL(/index.html), HTTP 버전(HTTP/1.1)이 포함된다.
- Host 헤더 : 요청을 받을 호스트 이름이다.
- User-Agent 헤더 : 클라이언트 측 브라우저 정보를 담고 있다.
- Accept 헤더 : 클라이언트가 지원하는 데이터 타입에 대한 정보다.
- Accept-Language 헤더 : 클라이언트가 지원하는 언어에 대한 정보다.
- Accept-Encoding 헤더 : 클라이언트가 지원하는 인코딩 방식에 대한 정보다.
- Connection 헤더 : 클라이언트와 서버 간의 커넥션 유지 방식에 대한 정보다.
- Referer 헤더 : 이전 웹 페이지의 URL이다.
- Cookie 헤더 : 클라이언트 측의 쿠키 정보를 담고 있다.
HTTP 요청 메시지는 위와 같이 요청 메소드, 요청 URL, 헤더, 본문 등의 정보를 포함한다. 이 정보를 서버에서 파싱하여 요청에 대한 적절한 처리를 수행한다.
다음은 HTTP 응답 메시지의 예제이다.
HTTP/1.1 200 OK
Date: Fri, 09 Apr 2023 03:02:43 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.2.30
Last-Modified: Mon, 05 Apr 2023 09:45:12 GMT
ETag: "3850-5a8cf33e4b377"
Accept-Ranges: bytes
Content-Length: 14480
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html>
<head>
<title>Example Website</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<h1>Welcome to Example Website</h1>
<p>This is an example website for HTTP response message.</p>
</body>
</html>
위의 예제는 www.example.com의 index.html 파일에 대한 HTTP 응답 메시지이다.
- 첫 번째 줄(Start Line) : HTTP 버전(HTTP/1.1), 응답 코드(200 OK)가 포함된다.
- Date 헤더 : 응답이 생성된 날짜와 시간이다.
- Server 헤더 : 웹 서버의 소프트웨어와 버전 정보다.
- Last-Modified 헤더 : 해당 리소스가 마지막으로 수정된 날짜와 시간이다.
- ETag 헤더 : 해당 리소스의 고유한 버전 정보를 포함한 문자열이다.
- Accept-Ranges 헤더 : 서버가 지원하는 바이트 레인지 요청에 대한 정보다.
- Content-Length 헤더 : 응답 본문의 크기다.
- Content-Type 헤더 : 응답 본문의 타입과 문자 인코딩 방식이다.
- 본문 : 클라이언트에게 전송되는 응답 본문이다. 위 예제는 HTML 코드로 이루어진 index.html 파일의 내용이다.
HTTP 응답 메시지는 서버에서 클라이언트에게 전송되는 응답 정보를 포함한다. 이 정보를 클라이언트에서 파싱하여 사용자에게 보여준다.
HTTP의 사용분야
HTTP는 World Wide Web에서 데이터 통신을 위한 프로토콜이므로, 주로 웹 어플리케이션 분야에서 사용된다. 예를 들어, 웹 브라우저와 웹 서버 간에 데이터를 주고받는 데에 HTTP 프로토콜이 사용된다. 이 외에도 RESTful API 등 다양한 웹 기술에서 HTTP가 사용된다.
HTTP의 전망
HTTP는 현재도 널리 사용되고 있는 인터넷 프로토콜 중 하나이며, 웹을 비롯한 인터넷 서비스에서 핵심적인 역할을 담당하고 있다. 최근에는 HTTP/2와 HTTP/3의 등장으로 기존의 HTTP/1.1보다 빠른 성능과 보안 향상을 제공하며, 앞으로도 계속해서 발전하고 발전할 것으로 전망된다. 특히, 인터넷 of Things (IoT)와 같은 새로운 분야에서 HTTP가 어떻게 발전할지도 관심을 가지고 있다. 또한, HTTP를 이용한 RESTful API를 이용하는 서비스들이 증가하고 있어서, 이 분야에서도 HTTP의 역할이 더욱 중요해질 것으로 예상된다.