CS/웹

[HTTP] HTTP에 대한 이해

mabb 2023. 7. 22. 16:40
반응형

게시판 제작을 위한 API 설계 중 HTTP에 대해 이해해야 할 필요성을 느끼고 공부하였다.

HTTP(Hypertext Transfer Protocol)는 프로토콜이다. 프로토콜은 통신 규약, 통신을 위한 약속이라고 이해할 수 있다. 그렇다면 HTTP는 누구와 누구의 약속일까? 일반적으로는 클라이언트와 서버의 약속이다. 요즘은 서버와 서버 간에도 HTTP를 이용하여 통신한다고 한다. 통신이라는 것은 결국 '정보(data)'를 주고받는 것이다. 클라이언트의 애플리케이션과 서버의 애플리케이션이 정보를 주고받기 위해 약속한 것이 HTTP이다. 즉, 애플리케이션(응용 프로그램) 간에 데이터를 주고받기 위한 통신규약이자 약속인 것이다.

한편, HTTP는 TCP/IP 4계층에서 애플리케이션 계층 프로토콜에 해당한다. 각각의 계층에는 각각의 계층끼리의 약속이 있다. 애플리케이션 계층에서는 HTTP, HTTPS, FTP, SMTP, SSH, telnet 등의 약속이 있다. 그 아래의 전송 계층에서는 TCP, UDP 등의 약속이 있다. 그리고 그 아래의 인터넷 계층에는 IP, ARP, ICMP 등의 약속이 있으며 그 아래의 네트워크 연결 계층에서는 MAC주소를 활용하며 NIC(Network Interface Card)를 통해 실제로 1과 0의 데이터를 네트워크로 보내고 받는다. 데이터 전송이라는 목적을 위하여 각 계층에서는 정해진 프로토콜에 따라 맡은 바 역할을 수행한다.

< 데이터 전송 시 >
[ 데이터 ]             : 데이터를 HTTP라는 약속된 구조로 포장 - HTTP Message
[ [ 데이터 ] ]         : HTTP Message를 TCP라는 약속된 구조로 포장 - TCP세그먼트
[ [ [ 데이터 ] ] ]     : TCP세그먼트를 IP라는 약속된 구조로 포장 - IP패킷
[ [ [ [ 데이터 ] ] ] ] : IP패킷을 전송을 위한 약속된 구조로 포장 - Ethernet 프레임

< 데이터 수신 시 >
[ [ [ [ 데이터 ] ] ] ] : Ethernet프레임을 확인하고 포장을 까서 IP패킷 추출
[ [ [ 데이터 ] ] ]     : IP를 확인하고  포장을 까서 TCP세그먼트 추출
[ [ 데이터 ] ]         : TCP를 확인하고 포장을 까서 HTTP Message 추출
[ 데이터 ]             : HTTP의 데이터를 확인

응용프로그램인 브라우저는 운영체제의  소켓라이브러리라는 시스템콜을 이용하여 HTTP로 포장한 데이터를 아래의 전송 계층으로 보낸다. OS에서는 정해진 규칙에 따라 이를 NIC까지 내려보내 네트워크 세상으로 보낸다. 네트워크란 노드(컴퓨터, 스마트폰 등 IP를 갖는 기기) 들이 연결된 망을 뜻한다. 인터넷이라는 거대한 네트워크 안에서 특정 컴퓨터에서 실행되고 있는 특정 애플리케이션으로 정확하게 데이터를 보낼 수 있다는 것이 신기하다. 여기에는 IP주소와 Port, 그리고 프로토콜이 필수로 필요하다. IP로 서버(컴퓨터)를 식별하고, port로 port를 사용 중인 애플리케이션을 식별할 수 있으며 프로토콜이라는 약속을 통해 데이터를 정상적으로 주고받을 수 있다.

HTTP는 보통 TCP/기반이다. HTTP/1.1, HTTP/2 (h2) 는 TCP, HTTP/3 (h3)은 UDP 기반의 프로토콜이다. IP의 특징은  비연결성(연결 없이 패킷 전송), 비신뢰 (데이터 전송을 보장하지 않음), TCP의 특징은 연결지향, 전송제어, 순서제어 등이 있다. HTTP는 클라이언트와 서버가 주고받는 '요청'과 '응답'에 대한 약속이다. 웹은 하나의 서버가 수 천명, 수 만 명의 클라이언트의 요청에 응답을 해야 할 수 있다. 하나의 서버가 모든 클라이언트의 상태 정보를 확인하고 관리하기에는 한계가 있고 비 효율적이다. 그렇기 때문에 웹은 '무상태(Stateless)'를 지향해야 한다. 요청에 응답을 했으면 끝. 서버가 더 이상 클라이언트에 대해 알 필요가 없는 것이다. 이러한 무상태는 서버의 수평 확장 (Scale Out)에 용이하다. Stateful 한 경우 클라이언트의 상태를 알고 있는 서버 1 대신 클라이언트의 상태를 모르는 서버 2가 응답할 수 없지만, 애초에 서버가 클라이언트의 상태를 관리하지 않는다면 서버 2도 서버 1을 대신하여 클라이언트에게 응답해 줄 수 있다. 단, 로그인과 같이 서버가 클라이언트의 상태를 알아야만 하는 특정 기능들이 있다. 이 경우 클라이언트가 필요한 모든 정보를 서버로 전송해 주게 되는데 이때 쿠키 등을 사용한다.

HTTP의 구조는 다음과 같다.

시작라인 - HTTP의 규칙
헤더 -HTTP Message의 메타 정보
(공백) -HTTP의 규칙
[바디] -전송하는 데이터 (Payload)

구조가 단순하고 확장이 편리한 것이 큰 장점이다. 애플리케이션들이 HTTP 를 사용하는 가장 큰 목적은 서버 애플리케이션과 클라이언트 애플리케이션 간의 '데이터' 전송이며 데이터 전송 시 필요한 것은 다음과 같다.

1. 서로가 보낸 데이터가 무슨 의미인지 알아야 함 => Representation, 클라이언트, 서버에 대한 메타 정보
2. 데이터를 효율적으로 주고 받을 수 있어야 함 => 효율적인 웹기술 이용( Cookie, Cache 등)

이를 위해 HTTP method, HTTP State Code, Header 정보의 규칙을 사용한다.

반응형