개요 목적
이번 시간에는 HTTP 프로토콜의 개념과 Request Response 메세지 구성 요소에 대해서 알아본다.
초기와 달리 다양한 기능을 제공하는 HTTP(1.0, 1.1, 2., 3) 버전 별 특징과 차이에 대해서도 알아본다.
HTTP 프로토콜 이해
HTTP는 HTML 문서와 같은 리소스들(json, image 등등)을 가져올 수 있도록 해주는 프로토콜이다.
HTTP는 웹에서 이루어지는 모든 데이터를 주고 받을 수 있게 하는 통신 규칙을 의미한다.
위 사진처럼 웹페이지를 출력하기 위해서 다양한 데이터가 통신 전달된 것을 확인할 수 있다.
image 파일, 웹페이지를 나타내는html 등 다양한 데이터가 Client 웹 브라우저에 전달되었다.
image 파일, 웹페이지 모두 0과 1로 이루어진다. HTTP 프로토콜(헤더와 바디)로 데이터를 구성하여 Server가 의도한대로 데이터를 전달할 수 있다.
위와 같은 규칙과 양식이 없다면, Client 요청과 Server의 응답 데이터가 어떤 데이터인 지 파악할 수 없다.
HTTP 프로토콜 구성 요소인 Request Message와 Response Message가 어떤 양식과 규칙을 가지고 있는 지 알아보자.
Request Message
Request Message는 클라이언트가 특정 데이터를 서버에게 요청할 때 보내는 Message이다.
<request messgae format>
- 리퀘스트 라인 - 서버에게 하는 요청메소드(GET, POST,DELETE 등)와 사용하는 프로토콜 버전
- 다양한 리퀘스트 헤더 ( 요청 메세지 설명하는 다양한 정보)
- Host- 우리가 요청하는 서버의 도메인
- User-Agent - 어떤 운영체제와 어떤 브라우저를 사용하는 지.
- Accept_Econding - 데이터 압축 방식(이런 방식으로 압축해서 보내줘라고 요청함)
- 바디 - 클라이언트가 서버에게 보내는 실제 데이터
ex)로그인 정보를 바디에 넣어서 전송한다.
Response Message
클라이언트 요청에 대응하는 응답 Message이다.
Reponse Message는 클라이언트가 받고 싶어하는 데이터 일 수도 있고, 통신 실패를 알리는 메세지일 수 도 있다.
<ResponseMessage format>
- status - 프로토콜 버전과 응답 결과(200-OK, 404-BAD-REQUEST 등)를 알려준다.
- 다양한 리스폰스 헤더 (리스폰스에 대한 설명과 함축적 정보를 담는다.)
- Content-Encoding - 데이터가 어떤 방식으로 압축되었는 지 알려준다.
- Content-Lenght - 데이터 길이를 알려준다.
- Content-Type - 데이터가 어떤 종류의 데이터인지 jpg, html등등 인지 알려준다.
- 메세지 바디 -메세지 바디에는 클라이언트가 요청하는 실제 데이터가 들어 있다.
HTTP 헤더 자세히 알아보기
바디는 본문이라고 할 수 있으며 서버에서 보내고자 하는 컨텐츠 본문인 JSON, html, image 등이 담기고. 헤더는 바디를 설명하는 정보를 포함해서 여러가지 정보가 담긴 정보묶음이다.
헤더는 key-value 형태로 저장된다. HTTP 요청을 하면 일반 헤더, 요청 헤더, 리스폰스 헤더, 엔티티 헤더가 생성된다.
- 일반 헤더
리퀘스트 메세지와 리스폰스 메세지 둘 다 사용되는 헤더이다.
일반 헤더 필드로는 Date(메세지 생성 날짜), Cache-Control(캐싱 동작 지정), Via(프록시 서버 관한 정보) 등이 있다.
- 요청 헤더
클라언트의 리퀘스트 메세지에 사용되는 헤더로 리퀘스트의 부가적 정보와 클라이언트 정, 리스폰스 콘텐츠에 관한 순 순위 등을 설정한다.
사용 필드로는 Accept(처리 가능한 미디어 타입 명시), Accept-Encoding(콘텐츠 인코딩 우선 순위), User-Agent(클라이언트의 정보)등이 있다.
- 응답 헤더
서버의 리스폰스 메세지에 사용된 헤더로 리스폰스 정보, 서버 정보, 클라이언트 추가 정보 요구 등을 설정한다.
사용 필드로는 Accept-Ranges(바이트 단위의 요구를 수신할 수 있는지 없는지 여부), Age(리소스 지정 경과 시간), Location(클라이언트를 지정한 URI에 리다이렉트 정보)등이 있다.
- 엔티티 헤더
리퀘스트 메세지와 리스폰스 메세지에 포함된 엔티티에 사용되는 헤더로, 콘텐츠 갱신 시간 등 엔티티에 관한 정보를 부가한다.
사용 필드로는 Allow(리소스가 제공하는 HTTP 메소드), Content-Encoding(엔티티 바디에 적용되는 콘텐츠 인코딩)등이 있다.
HTTP 프로토콜 버전 별 특징
HTTP 1.0이전
GET /mypage.html
<HTML>
A very simple HTML page
</HTML>
HTTP 1.0
- 리스폰스 메세지 시작 부분에 status상태라인을 붙여서, request에 대한 성공과 실패의 결과를 알 수 있게 되었다.
- 헤더 Conetent-Type의 사용으로 html외에 다른 종류의 데이터 전송이 가능해졌다.
- 프로토콜 버전 정보가 메세지에 추가되었다.
- 이미지스프라이트(여러 이미지를 한개의 이미지로 합쳐서 보내고 브라우저에 나누어서 사용), 코드압축(html css 정보를 개행문자를 전부 지우고 한줄로 표현), Base64(이미지를 문자열 변환)을 통해 더 짧은 응답시간을 제공했다.
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>
<한계점>
한번의 연결에 한나의 컨텐츠만 통신이 가능했다.
위와 같은 html 데이터를 통신하면, TCP통신이 끊기게 되고, 다른 image데이터를 통신하려면, TCP통신을 연결해야 했다.
HTTP 1.1
- keep alive 설정을 통해서, 추가적 요청을 할 수 있다.
한번의 TCP통신 연결로 여러가지 콘텐츠들 교환이 가능해졌다.
ex) 웹페이지에 포함된 html 과 다양한 image,css데이터가 연결이 끊지고 않고, 연속적으로 데이터 전달이 이루어진다.
→ 신뢰성 있는 TCP연결에 들어가는 자원과 시간을 아낄 수 있게 되었다.
- 파이프라이닝 기능 추가되었다.
요청을 하면, 응답을 기다린 후에, 다시 요청을 하는 것이 아니라, 요청을 연속적으로 보내는 것이 가능해졌다.
→ 응답 지연으로 인한 시간을 아낄 수 있게 되었다.
- 호스트 헤더에 url정보를 입력할 수 있게 되었다.
그래서 같은 ip주소라도, url정보를 통해 같은 ip 다른 웹사이트를 구분할 수 있게 되었다.
→ 한정적인 ip에 여러 개의 도메인을 운영할 수 있게 되었다.
(도메인이란, 사람이 기억하기 힘든 ip주소에 문자 이름을 붙인 것이다)
- 강력한 인증 절차
특별한 사용자에게만 콘텐츠를 보여주고 싶은 경우가 있다.
HTTP1.0에서 있는www-authentication 를 사용 할 수 있지만,
클라이언트와 서버 사이에 프록시가 위치하는 경우 프록시가 사용자의 인증을 요구할 수 있는 방법이 없었다.
그래서 HTTP1.1에 추가된 기능이 proxy - authentication proxy - authorization 이다.
HTTP 2
HTTP1.1에서 해결할 수 없었던 문제점 HOL Blocking(네트워크 같은 큐에서 앞에 있는 패킷이 지연되면 전체가 지연되는 현상)
HTTP2의 SPDY 프로토콜에서 파생한 멀티 플렉싱(여러 개의스트림 이용),
헤더 압축(러프만 코딩 압축 알고리즘을 사용하는 HPACK 압축 형식 사용),
서버 푸시(클라이언트가 요청하지 않더라도 서버가 리소스를 푸시할 수 있다),
요청의 우선순위 처리 를 지원해서 HOL문제를 해결했다.
Reference
https://withbundo.blogspot.com/2021/02/http-http-10-http-11.html
https://www.youtube.com/watch?v=t7ASgtJoVz4
https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
'Web Sever 개발과 CS 기초 > 네트워크 지식' 카테고리의 다른 글
URI와 URL 차이와 구조 (0) | 2022.12.19 |
---|---|
HTTP Client CP, DB외에 Connection Pool을 사용하는 곳 (0) | 2022.12.11 |
REST API, RESTFUL이란 (0) | 2022.09.18 |
리퀘스트 메소드와 HTTP 상태 코드 (0) | 2022.08.21 |
OSI, TCP/IP 참조 모델 쉽게 이해하기 (0) | 2022.07.24 |