HTTP 개요
1. HTTP란 무엇인가?
HTTP(HyperText Transfer Protocol)는 웹 브라우저와 서버 간에 문서(리소스)를 주고받기 위한 비연결성(stateless) 기반의 애플리케이션 계층 프로토콜이다. 클라이언트가 요청(Request)을 보내고, 서버가 응답(Response)을 반환하는 요청-응답 구조로 동작한다.
- 기본 포트: 80 (HTTPS는 443)
- 프로토콜 버전: HTTP/1.0, HTTP/1.1, HTTP/2, HTTP/3 등이 존재
2. HTTP의 요청과 응답 구조
HTTP 통신은 크게 **요청(Request)**과 **응답(Response)**으로 구성된다. 요청과 응답 메시지는 각각 요청라인/상태라인, 헤더, 본문으로 구성된다.
요청 메시지 구조
<요청라인>
<헤더 필드들>
(빈 줄)
<본문 (옵션)>
- 요청라인: 메서드(GET, POST 등), 경로, HTTP 버전 (예: GET /index.html HTTP/1.1)
- 헤더 필드: 요청 메타정보 (예: Host, User-Agent, Accept 등)
- 본문: POST, PUT 요청 시 전송하는 데이터 (예: JSON)
요청 예시 (GET 요청)
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
응답 메시지 구조
<상태라인>
<헤더 필드들>
(빈 줄)
<본문>
- 상태라인: HTTP 버전, 상태 코드, 상태 메시지 (예: HTTP/1.1 200 OK)
- 헤더 필드: 응답 메타정보 (예: Content-Type, Content-Length 등)
- 본문: 요청한 리소스 (HTML, JSON 등)
응답 예시 (200 OK)
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 305
<html> ... </html>
3. HTTP의 특징
- 비연결성(Stateless): 요청과 응답 이후 연결을 유지하지 않음. 각 요청은 독립적으로 처리됨.
- 요청-응답 구조: 클라이언트가 요청을 보내야만 서버가 응답함.
- 유연한 메서드 지원: GET, POST, PUT, DELETE, PATCH 등 다양한 메서드 제공.
- 헤더 기반 확장성: 메타정보를 담는 다양한 HTTP 헤더를 통해 확장 가능.
- 텍스트 기반 프로토콜: 사람이 읽을 수 있는 형태로 요청과 응답이 구성됨.
4. HTTP/1.1 vs HTTP/2 vs HTTP/3
항목 | HTTP/1.1 | HTTP/2 | HTTP/3 |
연결 방식 | 단일 연결, 순차 처리 | 멀티플렉싱, 하나의 연결로 다중 요청 처리 | QUIC 프로토콜 기반, 멀티플렉싱 |
헤더 압축 | 없음 | HPACK (헤더 압축 지원) | QPACK (더 나은 헤더 압축) |
성능 | 느림 (헤드 오브 라인 블로킹) | 빠름 | 더 빠름 (지연 감소) |
사용 프로토콜 | TCP | TCP | UDP |
문제점 | 헤드 오브 라인 블로킹, 연결 재활용 어려움 | 패킷 손실 시 전체 연결 지연 | UDP 호환성 문제 (방화벽, 프록시) |
5. Express로 작성한 RESTful API 예시
서버:
import express from 'express';
const app = express();
app.use(express.json());
// GET: 유저 목록 조회
app.get('/api/users', (req, res) => {
res.json([{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]);
});
// POST: 유저 생성
app.post('/api/users', (req, res) => {
const newUser = req.body;
res.status(201).json({ message: 'User created', user: newUser });
});
app.listen(3000, () => console.log('REST API server running on port 3000'));
클라이언트 (Fetch):
// 유저 목록 조회
fetch('http://localhost:3000/api/users')
.then(response => response.json())
.then(data => console.log('GET /api/users:', data));
// 유저 생성
fetch('http://localhost:3000/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id: 3, name: 'Charlie' })
})
.then(response => response.json())
.then(data => console.log('POST /api/users:', data));
6. HTTP의 동작 원리와 TCP와의 관계
계층 구조와 역할
- HTTP는 애플리케이션 계층 프로토콜, TCP는 전송 계층 프로토콜로 역할이 다름.
- TCP는 연결을 유지하며 데이터를 안전하게 전달.
- HTTP는 그 위에서 동작하며, 요청-응답을 처리하는 방식(규약)을 담당.
HTTP가 비연결성인 이유
- 비연결성(stateless): HTTP는 요청-응답 이후 상태를 서버에 저장하지 않음.
- 확장성: 서버가 클라이언트 상태를 기억하지 않으므로 수많은 클라이언트를 효율적으로 처리.
- 단순성: 서버가 상태를 관리하지 않아 구조가 단순, 장애 발생 시 복구가 용이.
- 초기 웹 환경에 최적화: HTTP는 정적인 문서 전송을 위해 설계되었기 때문에 요청 후 상태를 유지할 필요가 없었음.
- 필요한 경우 쿠키, 세션, 토큰 등으로 상태를 별도로 관리하여 비연결성 설계와 상태 유지가 공존.
7. 핵심 요약
- HTTP는 요청-응답 기반 비연결성 프로토콜로, 웹의 표준 통신 방식이다.
- TCP 위에서 동작하며, 데이터 전송은 TCP가 담당하고 HTTP는 통신 규약을 담당한다.
- 비연결성(stateless) 구조로 설계되어 서버가 클라이언트 상태를 저장하지 않고, 확장성과 단순성을 확보한다.
- HTTP/1.1 → HTTP/2 → HTTP/3로 버전이 발전하면서 멀티플렉싱, 헤더 압축, QUIC 프로토콜 등으로 성능이 개선되었다.
- 실무에서는 fetch, axios, curl 등을 사용해 HTTP 요청을 처리하며, Express와 같은 서버 프레임워크를 통해 RESTful API를 구성한다.
- HTTP는 웹 페이지 로딩, REST API 호출, 파일 전송 등 거의 모든 웹 기반 통신에서 사용된다.
*이 글은 ChatGPT 캔버스로 작성함
'일기' 카테고리의 다른 글
커널 (0) | 2025.04.23 |
---|---|
운영체제 (0) | 2025.04.22 |
WebSocket 정리 (0) | 2025.04.22 |
탐색 알고리즘 (0) | 2025.04.14 |
자동 전투 게임 - 로비 UI 만들기 (0) | 2025.03.17 |