HTTP는 하이퍼텍스트 전송 프로토콜(Hypertext Transfer Protocol)의 약자로, 웹 브라우저와 웹 서버 간에 하이퍼텍스트 문서(주로 HTML)를 전송하는 데 사용되는 애플리케이션 계층 프로토콜입니다. HTTP는 Stateless 즉, 무상태 프로토콜로, 각각의 요청과 응답이 독립적으로 처리되며 이전의 요청과 상태를 기억하지 않습니다.
HTTP는 클라이언트-서버 모델을 기반으로 동작합니다. 클라이언트(예: 웹 브라우저)가 서버에게 리소스(HTML, 이미지, 데이터 등)를 요청하고, 서버는 이에 대한 응답을 제공하는 구조입니다.
HTTP 요청은 클라이언트에서 서버로 보내는 메시지이며, 보통 다음과 같은 정보로 구성됩니다:
응답은 서버가 클라이언트에 보내는 메시지로, 다음과 같이 구성됩니다:
HTTP 메서드는 클라이언트가 서버에 특정 작업을 요청할 때 사용됩니다. 가장 일반적인 메서드는 다음과 같습니다:
HTTP 응답의 상태 코드는 요청이 성공했는지, 실패했는지, 또는 추가 작업이 필요한지에 대한 정보를 제공합니다. 상태 코드는 5개의 범주로 나뉩니다:
초기 HTTP 버전으로, 각 요청에 대해 별도의 TCP 연결을 설정하고 응답 후 연결을 닫습니다. 비효율적이며, 다수의 리소스를 요청할 때 성능 저하가 발생합니다.
1997년에 도입된 HTTP/1.1은 현재까지 가장 널리 사용되고 있는 버전입니다. HTTP/1.1에서는 연결을 재사용할 수 있도록 Persistent Connection(지속 연결)을 도입하여, 하나의 TCP 연결로 여러 요청과 응답을 처리할 수 있게 되었습니다. 이를 통해 성능이 크게 향상되었습니다. 또한 Chunked Transfer Encoding을 도입하여 응답을 한 번에 전송하지 않고, 데이터를 여러 개의 청크로 나누어 전송할 수 있습니다.
HTTP/2는 2015년에 도입된 버전으로, HTTP/1.1의 문제를 해결하고 더 나은 성능을 제공합니다. 주요 특징으로는 다음이 있습니다:
HTTP/3는 QUIC 프로토콜을 기반으로 하여 TCP 대신 UDP를 사용합니다. 이를 통해 더 빠른 연결 설정과 지연 시간을 줄일 수 있으며, HTTP/2의 헤드-오브-라인 차단(Head-of-Line Blocking) 문제를 해결합니다.
HTTPS는 HTTP에 SSL/TLS 암호화 계층을 추가한 버전으로, 보안이 강화된 프로토콜입니다. HTTPS는 클라이언트와 서버 간의 데이터 전송을 암호화하여 제3자가 데이터를 도청하거나 위변조하지 못하도록 보호합니다. 이를 통해 개인정보 보호, 데이터 무결성 및 인증을 보장할 수 있습니다.
HTTP는 클라이언트-서버 간의 단순한 요청-응답 모델로 설계되어 실시간 통신이나 양방향 데이터 전송에는 비효율적입니다. 예를 들어, 채팅 애플리케이션이나 실시간 게임과 같은 경우에는 Polling 또는 Long-Polling 기법을 사용해야 하지만, 이는 성능 저하와 네트워크 부하를 초래할 수 있습니다. 이를 해결하기 위한 대안으로 웹소켓(WebSocket)이 등장했습니다.
TCP는 전송 제어 프로토콜(Transmission Control Protocol)의 약자로, 인터넷 프로토콜(IP)과 함께 인터넷에서 데이터를 전송하는 데 중요한 역할을 하는 전송 계층 프로토콜입니다. TCP는 신뢰성 있는 데이터 전송을 보장하며, 패킷이 손실되거나 순서가 어긋나지 않도록 데이터를 전송하고 제어합니다. TCP는 연결 지향적 프로토콜로, 데이터를 주고받기 전에 반드시 연결이 성립되어야 합니다.
TCP는 데이터를 신뢰성 있게 전송하기 위해 세 가지 주요 기능을 제공합니다:
TCP는 데이터를 전송하기 전에 3-way handshake 과정을 통해 연결을 설정합니다.
이후 데이터 전송이 완료되면 4-way handshake를 통해 연결을 종료합니다.
TCP는 데이터 손실과 중복 전송을 방지하기 위해 다음과 같은 기능을 사용합니다:
TCP는 전송할 데이터를 세그먼트로 나누어 전송합니다. 각각의 세그먼트는 헤더(Header)와 데이터(Data)로 구성됩니다. 헤더에는 패킷의 순서 번호, 송신자와 수신자 포트, 오류 검출을 위한 체크섬 등 중요한 정보가 포함됩니다.
수신 측은 패킷의 순서 번호를 확인하여 원래 데이터로 재조립하고, 손실되거나 손상된 세그먼트가 있으면 재전송을 요청합니다.
흐름 제어는 송신 측이 너무 많은 데이터를 보내서 수신 측이 이를 처리하지 못하는 상황을 방지하는 기능입니다. TCP는 수신 측의 버퍼 용량을 고려하여 송신 측이 보낼 수 있는 데이터 양을 제한합니다.
혼잡 제어는 네트워크의 혼잡 상태를 감지하여 데이터 전송 속도를 조절하는 기능입니다. 네트워크가 혼잡해지면 패킷 손실이 발생할 수 있기 때문에, TCP는 전송 속도를 조절하여 이러한 상황을 방지합니다. 혼잡 제어는 네 가지 단계로 이루어집니다:
TCP는 OSI 7계층 모델의 전송 계층(4계층)에서 동작합니다. 이 계층에서는 애플리케이션 간의 데이터 전송을 관리하며, 데이터가 목적지에 신뢰성 있게 도달할 수 있도록 보장합니다. 전송 계층에서는 TCP 외에도 UDP(User Datagram Protocol)와 같은 프로토콜이 존재합니다. TCP는 연결 지향적이고 신뢰성 있는 전송을 제공하는 반면, UDP는 신뢰성보다 속도에 중점을 둔 비연결형 프로토콜입니다.
TCP는 신뢰성 있는 데이터 전송을 보장하지만, 실시간 애플리케이션에는 부적합할 수 있습니다. TCP는 연결 설정, 흐름 제어, 혼잡 제어 등의 메커니즘을 통해 안정적인 데이터 전송을 보장하지만, 이로 인해 오버헤드와 지연 시간이 발생합니다. 따라서 VoIP(인터넷 전화), 실시간 스트리밍과 같은 실시간 애플리케이션에서는 UDP나 QUIC와 같은 대안이 더 적합할 수 있습니다.
이와 같은 한계를 해결하기 위해 HTTP/3에서는 QUIC 프로토콜을 사용하여 TCP 대신 UDP 기반의 연결 지향적 프로토콜을 도입하였습니다. QUIC는 빠른 연결 설정과 낮은 지연 시간을 제공하며, TCP의 신뢰성 있는 데이터 전송 기능도 함께 제공합니다.
HTTP와 TCP는 인터넷에서 가장 널리 사용되는 프로토콜로, 이 둘은 밀접하게 연관되어 있습니다. HTTP는 웹 브라우저와 서버 간에 데이터를 전송하기 위한 애플리케이션 계층의 프로토콜인 반면, TCP는 전송 계층에서 데이터가 신뢰성 있게 전달되도록 보장하는 프로토콜입니다. 두 프로토콜은 OSI 7계층 모델에서 각각 다른 계층에서 동작하지만, HTTP는 TCP 위에서 동작하기 때문에 함께 설명될 필요가 있습니다.
OSI 7계층 모델에서 HTTP는 애플리케이션 계층(7계층)에 속하며, TCP는 전송 계층(4계층)에 속합니다. 각각의 역할은 다음과 같습니다:
즉, HTTP는 데이터가 어떻게 교환되는지를 규정하고, TCP는 그 데이터가 신뢰성 있게 전달되도록 보장하는 역할을 합니다.
HTTP는 비연결성(Stateless) 프로토콜입니다. 즉, HTTP는 요청-응답이 완료된 후 연결을 유지하지 않고 종료됩니다. 이러한 비연결성은 단순하고 빠른 처리를 가능하게 하지만, 신뢰성 있는 데이터 전송을 보장하지는 않습니다. 이때 TCP가 중요한 역할을 합니다.
TCP는 HTTP 요청과 응답 데이터를 세그먼트로 나누어 전송하고, 데이터가 손실되지 않고 순서대로 도착할 수 있도록 합니다. 또한, 데이터 전송 중 오류가 발생했을 때 재전송을 통해 데이터를 복구하고, 흐름 제어와 혼잡 제어 기능을 통해 네트워크 상태를 최적화합니다.
TCP는 3-way handshake를 통해 연결을 설정하며, 이 연결 위에서 HTTP 요청과 응답이 교환됩니다. 클라이언트는 TCP 연결을 통해 HTTP 요청을 서버에 보내고, 서버는 TCP 연결을 통해 응답을 다시 클라이언트에 보냅니다. 연결이 설정된 후, TCP는 데이터가 신뢰성 있게 전송되도록 관리합니다.
HTTP/1.1에서는 지속 연결(Persistent Connection) 기능이 도입되어, TCP 연결을 여러 요청에 대해 재사용할 수 있게 되었습니다. 즉, 한 번의 TCP 연결로 여러 개의 HTTP 요청을 처리할 수 있어, 연결을 반복적으로 설정하고 해제하는 비용을 줄일 수 있습니다.
이로 인해 HTTP/1.1은 이전 버전보다 훨씬 효율적으로 동작하며, 웹 페이지 로딩 속도와 네트워크 자원의 효율성을 크게 향상시킬 수 있습니다.
HTTP/2에서는 TCP 위에서 멀티플렉싱(Multiplexing) 기능이 도입되었습니다. 이는 하나의 TCP 연결로 여러 개의 HTTP 요청과 응답을 동시에 주고받을 수 있게 하는 기술입니다. HTTP/1.1에서는 하나의 TCP 연결로 한 번에 하나의 요청만 처리할 수 있었던 반면, HTTP/2에서는 이 제한이 제거되어 성능이 대폭 향상되었습니다.
TCP는 HTTP/2에서도 동일하게 신뢰성 있는 데이터 전송을 보장하며, 멀티플렉싱과 함께 네트워크 지연 시간과 병목 현상을 줄여줍니다.
HTTP/3는 기존의 TCP 대신 QUIC이라는 프로토콜을 사용하여, TCP의 일부 한계를 극복하고 있습니다. QUIC은 UDP 기반의 연결 지향적 프로토콜로, TCP의 장점인 신뢰성 있는 데이터 전송을 유지하면서도, 더 빠른 연결 설정과 지연 시간을 제공합니다.
TCP는 연결 설정 과정에서 지연 시간이 발생하고, Head-of-Line Blocking(헤드 오브 라인 차단) 문제가 발생할 수 있습니다. 하지만 QUIC은 이러한 문제를 해결하며, HTTP/3는 QUIC 위에서 더 빠르고 효율적인 데이터 전송을 가능하게 합니다.
HTTP와 TCP는 각기 다른 계층에서 작동하지만, 함께 동작하여 인터넷 상에서 신뢰성 있는 데이터 전송을 가능하게 합니다. HTTP는 데이터 교환의 형식을 규정하고, TCP는 그 데이터가 목적지에 정확히 도착하도록 보장합니다. 이 두 프로토콜은 긴밀히 연동되어 있으며, HTTP/1.1, HTTP/2, HTTP/3와 같은 최신 기술은 TCP 또는 그 대안인 QUIC을 통해 더욱 효율적인 통신을 가능하게 합니다.
웹소켓(WebSocket)은 단일 TCP 연결을 통해 양방향 통신을 가능하게 하는 프로토콜입니다. 웹소켓은 HTTP처럼 애플리케이션 계층에서 동작하지만, 중요한 차이점은 Full-Duplex(전이중) 통신을 제공한다는 점입니다. 즉, 클라이언트와 서버가 동시에 데이터를 주고받을 수 있습니다. 웹소켓은 실시간 애플리케이션에서 필요한 빈번한 데이터 교환을 더 효율적으로 처리하기 위해 개발되었습니다.
HTTP는 주로 요청-응답 모델로 동작하기 때문에, 클라이언트가 서버로부터 데이터를 받으려면 클라이언트가 지속적으로 요청을 보내야 합니다. 이는 폴링(Polling) 또는 롱 폴링(Long Polling) 기법을 사용하더라도, 실시간 애플리케이션에서는 성능 저하와 네트워크 부하를 초래할 수 있습니다. 예를 들어, 실시간 채팅, 주식 거래, 온라인 게임 등의 애플리케이션에서는 지속적인 업데이트가 필요하며, 기존 HTTP의 방식으로는 이러한 요구를 충족하기 어렵습니다.
이 문제를 해결하기 위해 웹소켓이 등장하였고, 클라이언트와 서버 간에 지속적인 연결을 유지하면서 실시간으로 데이터를 주고받을 수 있게 되었습니다.
웹소켓은 HTTP 요청을 통해 연결이 시작되지만, 일단 연결이 설정되면 TCP 기반의 전이중 통신으로 전환됩니다. 웹소켓의 동작 과정을 살펴보면 다음과 같습니다:
이전 장에서 HTTP와 TCP를 설명한 이유는 웹소켓이 이 두 가지 기술과 깊이 연관되어 있기 때문입니다. 웹소켓은 HTTP 프로토콜을 통해 연결이 설정되고, 이후 TCP 위에서 통신이 이루어집니다. 즉, 웹소켓은 HTTP와 TCP를 모두 활용한 하이브리드 방식의 통신 프로토콜입니다.
웹소켓은 주로 애플리케이션 계층(7계층)에서 동작하지만, 데이터 전송은 TCP(전송 계층, 4계층) 위에서 이루어집니다. 이로 인해 웹소켓은 애플리케이션 간의 실시간 통신을 가능하게 하면서도, TCP의 신뢰성 있는 데이터 전송 기능을 그대로 활용합니다.
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (ws) => {
console.log('클라이언트가 연결되었습니다.');
ws.on('message', (message) => {
console.log(`받은 메시지: ${message}`);
ws.send(`에코: ${message}`);
});
ws.on('close', () => {
console.log('클라이언트가 연결을 종료했습니다.');
});
});
위 예제에서는 Node.js의 WebSocket 라이브러리를 사용하여 간단한 웹소켓 서버를 구현합니다.
웹소켓은 HTTP와 TCP의 장점을 결합하여 실시간 양방향 통신을 제공하는 강력한 프로토콜입니다. 클라이언트와 서버 간의 실시간 데이터 전송을 요구하는 다양한 애플리케이션에서 웹소켓은 매우 유용하게 사용되며, 특히 성능과 효율성이 중요한 환경에서 그 진가를 발휘합니다. HTTP와 TCP의 기본 개념을 이해하면, 웹소켓의 동작 원리와 장점을 더욱 쉽게 파악할 수 있습니다.
웹소켓 프로토콜은 OSI 모델의 두 계층에서 주로 동작합니다:
OSI 모델의 맥락에서 웹소켓을 이해하면, 웹소켓이 더 넓은 네트워킹 스택에서 어떻게 맞아떨어지는지 쉽게 알 수 있습니다.