일기

HTTP 정리

Realuda72 2025. 4. 22. 21:24

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