본문 바로가기
42/42cursus

[webserv] 1. HTTP(HyperText Transfer Protocol)란?

by jaemjung 2022. 8. 10.

본 글은 An overview of HTTP를 읽고 제가 이해하기 쉽게 요약한 글입니다. 이상한 부분이 있을 수 있는데 있으면 알려줘잉~

자료 : https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview

 

An overview of HTTP - HTTP | MDN

HTTP is a protocol for fetching resources such as HTML documents. It is the foundation of any data exchange on the Web and it is a client-server protocol, which means requests are initiated by the recipient, usually the Web browser. A complete document is

developer.mozilla.org

 


HTTP는 HTML 문서와 같은 리소스를 전송하기 위한 프로토콜임.

웹에서 이루어지는 데이터 교환의 바탕이 되는 프로토콜이며 클라이언트와 서버 사이의 프로토콜임.

즉, 클라이언트(주로 웹 브라우저)가 서버에 특정한 요청(Request)를 보내면 서버는 이에 알맞는 정보를 HTTP에 맞추어 클라이언트로 보내주게 되고, 클라이언트는 수신한 데이터(텍스트, 레이아웃 설정, 이미지, 비디오 등)를 재구축(Reconstruct)하여 우리가 보는 웹페이지를 만들게 되는 것.

 

클라이언트와 서버는 메시지를 통해 통신하는데, 클라이언트가 보내는 메시지는 Request, 서버가 보내는 응답 메시지는 Response라고 부름.

 

HTTP는 OSI 계층의 최 상단인 Application 계층에서 동작하는 프로토콜. 즉 하위 계층에서 HTTP에 대해 신경쓰지 않아도 되며, HTTP 역시 TCP/IP 등의 하위 계층에서 어떤 일이 일어나는지 신경쓰지 않아도 됨.

 

클라이언트가 서버로 Request를 전송하면 서버는 이에 알맞는 response를 보내주어야 함. request를 보내는 클라이언트는 주로 웹브라우저이지만 크롤러, 그 외 기타 등등이 될 수 있음. 클라이언트와 서버는 직접 연결되기도 하지만 중간에 여러 프록시(Proxy)를 거쳐 연결되는 경우도 있다...

 

request는 반드시 클라이언트에 의해서만 보내질 수 있음. 서버는 절대 request를 보내지 않음(그런데 시대가 지나며 몇몇 서버가 보내는 메시지가 생기긴 했음)

 

HTTP의 특징

 

1. HTTP는 간결하고 읽기 쉬움. 기본적으로 인간이 읽기 쉽게 디자인 되어있다. 개발자가 테스트하기 편하고, 처음 배우는 사람이 쉽게 접근할 수 있음.

 

2. HTTP는 stateless이지만 sessionless는 아님.

* stateful과 stateless란? : https://wooono.tistory.com/366

HTTP에서는 두 개의 request 사이의 연결이 없음. 이 것은 특정한 페이지에서 연속적으로 상호작용하고자 하는 클라이언트에게서 문제가 될 수 있음. 그러나 HTTP는 기본적으로 stateless 연결을 지향하므로, 이러한 연속적인 상호작용은 쿠키를 통해 이루어짐. header를 통한 확장성 기능을 이용해 context 혹은 state를 공유할 수 있음.

 

3. HTTP와 연결

연결은 기본적으로 전송계층에서 제어되므로 HTTP가 신경쓸 것이 아님. 그러나 기본적으로 HTTP는 메시지가 중간에 누락되거나 손실되는 것을 가정하고 만들어지지 않았으므로 TCP에 의존하고 있음.

 

클라이언트와 서버가 HTTP request/response를 교환하기 전 TCP 커넥션이 성립되어있는지 확인해야함. 

HTTP/1.1에서는 pipelining과 persistent connection을 도입하였음. TCP connection은 connection 헤더를 이용하여 부분적으로 컨트롤 가능(?)

 

HTTP의 흐름

 

클라이언트가 서버와 통신을 원하면, 최종 서버 혹은 중간 프록시가 다음의 과정을 따라 연결을 실행함.

 

1. TCP 커넥션을 개방 : TCP 커넥션은 request를 보내고 response를 받는데 사용됨. 클라이언트는 새로운 커넥션을 열거나, 기존 커넥션을 재활용하거나, 서버에 여러 개의 TCP 커넥션을 요청할 수 있음.

 

2. HTTP 메시지를 전송 : 클라이언트는 다음과 같은 메시지를 전송한다.

GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr

 

3. 서버로부터 받은 response를 해석

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 come the 29769 bytes of the requested web page)

4. 커넥션을 닫거나 추후 추가적인 request에서 재활용한다.

 

HTTP pipelining이 활성화되어있다면, 첫 번째 request의 응답을 기다릴 필요 없이 여러 개의 request를 연속적으로 보낼 수 있음.

 

HTTP 메시지

HTTP/1.1에서의 메시지는 인간이 읽기 쉬움. 2는 살짝 어려움. 그래도 원리는 같다.

 

Request

HTTP request의 예시

request는 다음과 같은 요소로 구성되어있음.

HTTP method : 보통 GET, POST와 같은 명사로 되어있는 명령. 클라이언트가 실행하고자 하는 명령을 의마한다. 보통 클라이언트는 특정한 자원을 불러오거나 (GET), HTML form의 post를 요청함 (POST).

 

Path : 불러올 자원의 경로. 프로토콜이나 도메인, 혹은 TCP 포트 없이.

 

프로토콜의 버전

 

header : 서버에 요청하는 추가적인 정보를 전달

body

 

Response

 

response의 예시

HTTP의 버전

Status code : request의 결과에 대한 코드

status message: status code에 대한 짧은 설명

header : response의 정보에

body : optional, 받아온 자원을 포함하는 body.

 

 

나중에 더 이해가 되면 내용 추가해서 정리할 것임.. ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

댓글