목차
- HTTP 개요
- HTTP 역사
- HTTP 시스템 구성요소
- HTTP 1.1 vs HTTP/2 (Feat TCP, UDP, TLS)
- 요약
HTTP 개요
HTTP(HyperText Transfer Protocol)는 HTML과 같은 하이퍼미디어 문서를 전송하기 위한 Application Layer의 프로토콜입니다.
HTTP는 클라이언트의 요청을 받을때 까지 대기하는 Client to Server 모델을 따릅니다.
Client to Server는 수신자 측에 의해 요청이 초기화되는 구조를 말합니다.
그리고, HTTP는 서버가 두 요청간에 어떠한 데이터(상태)도 유지하지 않는 무상태 프로토콜입니다.
HTTP는 안정적인 Transport layer로 TCP/IP 기반 혹은 암호화된 TCP 연결인 TLS를 통해 연결합니다.
HTTP 역사
HTTP/0.9
HTTP 초기 버전에는 버전 번호가 없었습니다. HTTP/0.9는 이후에 차후 버전과 구별하기 위해 0.9로 불리게 됐습니다. HTTP/0.9의 요청은 단일 라인으로 구성되며 리소스에 대한 (프로토콜, 서버 그리고 포트는 서버가 연결되고 나면 불필요로 하므로 URL은 아닌) 경로로 가능한 메서드는 GET이 유일했습니다.
GET /mypage.html
<HTML>
A very simple HTML page
</HTML>
HTTP/1.0
HTTP/1.0은 브라우저와 서버 모두 좀 더 융통성을 가지도록 빠르게 확장되었습니다.
- 버전 정보가 각 요청 사이내로 전송되기 시작했습니다. (HTTP/1.0 이 GET 라인에 붙은 형태로)
- 상태 코드 라인 또한 응답의 시작 부분에 붙어 전송되어, 브라우저가 요청에 대한 성공과 실패를 알 수 있고 그 결과에 대한 동작(특정 방법으로 그것의 로컬 캐시를 갱신하거나 사용하는 것과 같은)을 할 수 있게 되었습니다.
- HTTP 헤더 개념은 요청과 응답 모두를 위해 도입되어, 메타데이터 전송을 허용하고 프로토콜을 극도로 유연하고 확장 가능하도록 만들어주었습니다.
- 새로운 HTTP 헤더(Content-Type)의 도움으로, 평이한 HTML 파일들 외에 다른 문서들을 전송하는 기능이 추가되었습니다.
html 요청 예시
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
A page with an image
<IMG SRC="/myimage.gif">
</HTML>
이미지 요청 예시
GET /myimage.gif HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK
Date: Tue, 15 Nov 1994 08:12:32 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/gif
HTTP 기반 시스템의 구성요소
HTTP는 Client to Server 프로토콜입니다. 보통 브라우저(Client)에 의해 전송되는 메시지를 요청(Requests)라고 부르고 이에 대한 서버에서 응답으로 전송하는 메시지를 응답(Responses)라고 합니다.
이러한 요청(Requests)과 응답(Responses) 사이에는 여러 개체들이 있습니다.
- 클라이언트(브라우저, 사용자 에이전트)
- 웹 서버
- 게이트웨이, 캐시 역할을 하는 프록시 등
클라이언트
클라이언트는 보통 브라우저가 해당 역할을 수행합니다. 클라이언트는 항상 요청을 보내는 개체입니다.
웹 서버
웹 서버는 클라이언트의 요청에 대한 응답을 보내는 개체입니다. 즉, 요청에 대한 문서를 제공하는 역할을 수행합니다.
서버는 논리적으로 단일 기계에 해당합니다. 로드 밸런싱 혹은 캐시, DB서버 등의 정보를 얻어 부분적으로 혹은 완전하게 문서를 생성하는 서버들의 집합일 수도 있기 때문입니다. 다시말해 서버 각각 개별의 역할(DB서버, 메모리 DB서버 등)을 수행하는 집합일 수도 있다는 의미입니다.
물론 서버가 반드시 단일 기계일 필요는 없습니다. 여러 개의 서버를 동일한 머신 위에서 호스팅 할 수는 있습니다.
HTTP/1.1과 Host 헤더를 이용하여 동일한 IP 주소를 공유할 수 있습니다.
프록시
웹 브라우저와 서버 사이에서는 수많은 개체들이 HTTP 메시지를 이어 받고 전달합니다. 여러 계층으로 이루어진 웹 스택 구조에서 이러한 개체들은 대부분 전송(Transport), 네트워크(Network) 혹은 물리(Physical) 계층 에서 동작합니다.
이러한 개체들 중에서도 Application Layer에서 동작하는 것들을 일반적으로 프록시라고 부릅니다. 프록시는 다양한 기능들을 수행할 수 있습니다.
- 캐싱(캐시는 공개 혹은 비공개가 될 수 있습니다.(ex: 브라우저 캐시))
- 필터링(바이러스 백신 스캔, 유해 컨텐츠 차단 기능)
- 로드 밸런싱(여러 서버들이 서로 다른 요청을 처리하도록 허용)
- 인증(다양한 리소스에 대한 접근 제어)
- 로깅(로그 정보를 저장)
요약
- HTTP는 Application Layer 프로토콜이다.
- HTTP는 Client to Server 모델이다.
- HTTP는 무상태 프로토콜이다.
- HTTP는 신뢰 가능한 전송을 위해 TCP/IP 혹은 TLS 기반으로 연결한다.