프로그래밍

[Backend-RoadMap] HTTP에 대한 모든 것 - (1)

손가든 2024. 7. 31. 16:39

Backend 개발자의 커리어를 체계적으로 쌓아가기 위해 백엔드라면 당연히 알아야 할 지식에 대해 차곡차곡 학습하려 한다.

 

오늘은 HTTP에 대해 학습한 것에 대한 포스팅을 작성하겠다.

 


HTTP란?

HTTP는 클라이언트와 서버가 서로 통신하는 방식을 표준화하는 TCP/IP 기반 어플리케이션 계층 통신 프로토콜이다.

 

HTTP는 콘텐츠가 인터넷을 통해 요청되고 전송되는 방식을 정의한다.

 

 

이때, 어플리케이션 계층 프로토콜이란?

 

호스트(클라이언트와 서버. 즉 통신 송/수신 주체)가 통신하는 방식을 표준화하는 단순한 추상화 계층을 의미한다.

 

HTTP 자체는 클라이언트와 서버 간의 요청과 응답을 얻기 위해 TCP/IP에 의존한다.

 

기본적으로 TCP 포트 80번을 사용되고, HTTPS는 443번 포트를 사용한다.

 


 

HTTP/1.0

HTTP가 처음 나온 버전은 HTTP/0.9 버전이다.

 

하지만 GET 메서드만 가진 간단한 프로토콜로 HTTP 등장의 시작일 뿐, 실제 우리에게 친숙한 HTTP 프로토콜은 1.0부터이다.

 

HTML 응답만을 위해 설계된 0.9버전과 달리 1.0은 이미지, 비디오 파일, 일반 텍스트 등과 같은 여러 콘텐츠 유형도 처리할 수 있게 되었다.

 

또한 더 많은 메서드(POST, HEAD 등)가 추가되었고, 요청/응답 형식에 HTTP 헤더가 추가되고, 응답을 식별하기 위한 상태 코드가 추가되는 등의 주요한 변경사항이 생겨났다.

 

1.0 버전의 요청 및 응답의 샘플 데이터를 보자

 

/* 요청 */

GET / HTTP/1.0
Host: cs.fyi
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*


/* 응답 */

HTTP/1.0 200 OK 
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84

(response body)
(connection closed)

 

요청을 보면 요청과 함께 클라이언트는 개인 정보, 필요한 응답 유형 등도 헤더를 통해 보낼 수 있게 되었다.

 

또한 응답에서는 상태 코드 외에도 데이터에 대한 메타 데이터를 헤더로 제공할 수 있게 되었다.

 

 

HTTP/1.0 의 단점

HTTP/1.0 버전의 주요 단점 중 하나는 연결 당 여러 요청을 할 수 없다는 것이다.

 

즉, 클라이언트가 서버에게 요청할 때마다 새 TCP 연결을 열어야 하며, 해당 단일 요청이 충족되면 연결이 닫힌다.

 

매 요청마다 새로운 TCP를 열어야 하는 것이 왜 단점일까?

 

만약 새로운 웹 페이지를 방문하여 여러가지의 파일들을 요청하는데,

파일 별로 새로운 TCP를 연결하여 각각 요청에 Three-way Handshake 통신을 수행하는 것을 상상해보면 이유를 알 수 있다.

 

이는 상당한 성능 저하로 이어진다. 

 

HTTP/1.0의 일부 구현은 Connection:keep-alive 라는 새로운 헤더를 도입(SSE 통신 방식이 이에 해당한다.)하여 이 문제를 극복 하려고 시도했다. 하지만 여전히 널리 지원되지 않아 문제는 여전히 지속되고 있다. 

 

게다가 서버는 클라이언트에 대한 정보를 유지하지 않으므로 각 요청은 서버에 대한 메타 데이터가 포함된 모든 정보들을 새로 읽는 바보같은 행위가 반복된다. 이는 클라이언트가 열어야 하는 연결 수가 많은 문제 외에도 와이어로 중복 데이터를 보내야 하므로 대역폭 사용량이 증가한다.

 

Three-way Handshake 란?

3-way handshake 는 TCP 연결이 3 방향의 통신으로 시작하는 행위를 말한다.

 

클라이언트와 서버는 어플리케이션 데이터를 공유하기 전에 일련의 패킷을 공유한다.

 

- SYN : 클라이언트가 임의의 숫자(ex : x)를 골라 서버로 전송한다.

- SYN/ACK : 서버는 클라이언트에게 ACK 패킷을 다시 보내 요청을 확인한다. ACK 패킷은 서버에서 수집한 난수(ex : y)와 클라이언트에서 보낸 숫자(클라이언트에서 보낸 숫자에 +1 한 x+1)로 구성된다. 

- ACK : 클라이언트는 서버로부터 수신한 숫자(y)를 +1 증가시킨 시퀀스 넘버를 포함시켜 ACK 패킷을 다시 보낸다.

 

 

3way handshake가 완료되면 클라이언트와 서버 간의 데이터 통신을 시작할 수 있다.

 

클라이언트는 마지막 ACK 패킷을 전송하자마자 어플리케이션 데이터를 보내지만, 서버는 ACK 패킷을 수신 받은 이후부터 데이터를 수신할 수 있다.

 


 

다음 포스팅은 HTTP/1.0을 보완하기 위해 3년만에 등장한 HTTP/1.1과 HTTP/2 버전에 대해 학습하고 그외의 다른 여러 실험적으로 대두된 프로토콜에 대해서도 포함하여 포스팅하겠다.