TIL- 공부편/COMPUTER SIENCE
📌 TIL24: HTTP의 개념과 동작 원리
creator7087
2025. 3. 18. 20:03
1️⃣ HTTP(HyperText Transfer Protocol)란?
HTTP(하이퍼텍스트 전송 프로토콜)은 웹에서 데이터를 주고받기 위한 통신 규약입니다.
- HTML, 이미지, JSON, 파일 등 다양한 데이터를 전송할 수 있습니다.
- HTTP는 클라이언트(사용자)와 서버 간의 요청(Request) 및 응답(Response)을 처리하는 프로토콜입니다.
- 서버와 서버 간의 데이터 통신에도 사용될 수 있습니다.
💡 HTTP의 주요 버전
현재 가장 많이 사용되는 HTTP 버전은 HTTP/1.1(TCP 기반)입니다.
- 최신 기술에서는 HTTP/2, HTTP/3(UDP 기반) 사용이 증가하고 있습니다.
2️⃣ HTTP의 동작 방식
HTTP는 기본적으로 클라이언트-서버 모델을 기반으로 동작합니다.

- 클라이언트(웹 브라우저 등)가 요청(Request)을 보냅니다.
- 서버는 요청을 확인하고, 필요한 처리를 한 후 응답(Response)을 보냅니다.
💡 HTTP의 특징
- 무상태(Stateless)
- 서버는 클라이언트의 상태를 유지하지 않습니다.
- 그러다보니 Scale Out 수평 확장성이 높습니다.(서버 증설 편리)
- 하지만 요청마다 독립적으로 처리되므로, 클라이언트가 추가적인 데이터를 포함해야 합니다.
- 해결 방법: 쿠키(Cookie), 세션(Session), 토큰(Token) 사용
- 비연결(Connectionless)
- 요청을 처리한 후, 연결을 끊습니다.(검색 후 인터넷 연결이 끊겨도 현재 창 유지)
- 그러다보니 서버 자원을 효율적으로 사용할 수 있다
- 하지만 새로운 요청이 발생하면 다시 연결을 설정해야 되다보니 오래 걸립니다.
- 해결 방법: HTTP 지속 연결(Persistent Connection) → 여러 요청을 하나의 연결에서 처리
더보기

HTTP 지속연결(Persistent Connections)

3️⃣ HTTP 메시지 구조
HTTP 메시지는 요청(Request) 메시지와 응답(Response) 메시지 두 가지 형태로 나뉩니다.
🔹 1. 요청(Request) 메시지 구조
- Start Line (요청 시작 줄)
- HTTP 메서드(Method): 요청의 목적을 정의 (GET, POST, PUT, DELETE 등)
- Request Target: 요청 대상 (/search?keyword=sparta)
- HTTP Version: HTTP 버전 정보 (1.1)
- Header (요청 헤더)
- 요청에 대한 추가 정보를 포함 (Host, User-Agent, Content-Type 등)
- Empty Line (공백 줄)
- 요청 헤더와 메시지 본문을 구분하는 역할
- Message Body (요청 데이터)
- 실제 전송할 데이터 (JSON, HTML, 이미지 등)
💡 예제 요청 메시지
더보기
GET /search?keyword=sparta HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
🔹 2. 응답(Response) 메시지 구조
- Start Line (응답 시작 줄)
- HTTP 버전 (1.1)
- 상태 코드(Status Code): 요청 성공/실패 여부 (200 OK, 404 Not Found 등)
- 상태 메시지(Status Text)
- Header (응답 헤더)
- 응답 데이터에 대한 추가 정보 (Content-Type, Server, Date 등)
- Empty Line (공백 줄)
- 헤더와 메시지 본문을 구분하는 역할
- Message Body (응답 데이터)
- 실제 전송되는 데이터 (HTML, JSON, 이미지 등)
💡 예제 응답 메시지
더보기
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<html>
<body>응답 데이터</body>
</html>
✅ 요약
- HTTP(HyperText Transfer Protocol)은 웹에서 데이터를 주고받는 통신 프로토콜입니다.
- HTTP는 무상태(Stateless), 비연결(Connectionless) 방식으로 동작하지만, 쿠키/세션과 지속 연결(Persistent Connection)을 통해 이를 보완할 수 있습니다.
- HTTP 메시지는 요청(Request)과 응답(Response)으로 구성됩니다.
- HTTP 메서드(Method)를 통해 서버와 다양한 방식으로 상호작용할 수 있습니다.
🍀 알쓸신잡 🍀-헤더편
더보기
1️⃣ HTTP 헤더란?
HTTP 헤더는 클라이언트와 서버가 요청(Request) 또는 응답(Response) 시 부가적인 정보를 포함하여 전송할 수 있도록 하는 데이터 블록입니다.
- 헤더는 HTTP 메시지의 시작 부분에 위치하며, 뒤에 오는 본문(Body)과 구분됩니다.
- 특정 프로토콜의 헤더는 해당 프로토콜의 기능을 제공하는 데 필요한 정보를 포함합니다.
💡 HTTP 헤더의 역할
- 클라이언트와 서버 간 통신에 필요한 메타데이터를 포함
- 요청 및 응답의 특성을 정의하고 데이터 처리를 도와줌
- 보안, 캐싱, 콘텐츠 압축 등 다양한 기능을 제공
2️⃣ HTTP 헤더의 종류
🔹 1. 종단간 헤더(End-to-End Headers)
- 최종 수신자(클라이언트 또는 서버)에게 반드시 전달되어야 하는 헤더입니다.
- 중간 프록시 서버는 헤더를 변경할 수 없으며, 반드시 저장해야 합니다.
🔹 2. 홉간 헤더(Hop-by-Hop Headers)
- 단일 네트워크 연결(클라이언트 ↔ 서버)에서만 의미를 가지는 헤더
- 프록시 서버를 거칠 때 다시 전달되지 않으며 캐시할 수 없습니다.
- 대표적인 홉간 헤더:
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Transfer-Encoding
- Upgrade
3️⃣ HTTP 헤더의 주요 카테고리
🔹 1. 일반 헤더(General Headers)
- 요청(Request)과 응답(Response)에서 공통적으로 사용되며, 특정 컨텐츠(Body)와는 관련이 없습니다.
헤더설명
Date | 현재 서버의 날짜 및 시간 |
Cache-Control | 캐싱 정책을 지정 (예: no-cache, max-age=3600) |
Pragma | HTTP/1.0에서 사용된 캐싱 제어 (HTTP/1.1에서는 Cache-Control 사용) |
Connection | 연결을 유지할지(keep-alive), 닫을지(close) 설정 |
🔹 2. 요청(Request) 헤더
- 클라이언트에서 서버로 요청할 때 추가 정보를 전달하는 헤더
헤더설명
Host | 요청 대상 서버의 도메인명 및 포트 |
User-Agent | 요청을 보내는 클라이언트 정보(브라우저, OS 등) |
Referer | 현재 페이지로 오기 전 방문한 URL 정보 |
Accept | 클라이언트가 받을 수 있는 콘텐츠 유형 (예: text/html, application/json) |
Accept-Language | 클라이언트가 선호하는 언어 |
Authorization | 클라이언트의 인증 정보 포함 |
Cookie | 클라이언트의 쿠키 정보 포함 |
🔹 3. 응답(Response) 헤더
- 서버가 클라이언트에게 응답할 때 포함하는 부가 정보
헤더설명
Server | 서버의 소프트웨어 정보 |
Location | 클라이언트를 특정 URL로 리디렉션 |
Set-Cookie | 클라이언트에 쿠키를 저장하도록 지시 |
ETag | 콘텐츠의 고유 식별자(변경 여부 확인) |
Expires | 캐시가 만료되는 날짜 지정 |
Last-Modified | 마지막으로 수정된 날짜 |
🔹 4. 엔터티 헤더(Entity Headers)
- HTTP 메시지의 본문(Body)과 관련된 정보를 포함
헤더설명
Content-Type | 본문의 MIME 타입 지정 (예: text/html, application/json) |
Content-Length | 본문의 크기(바이트) |
Content-Encoding | 콘텐츠 압축 방식 (gzip, deflate 등) |
Content-Language | 본문의 언어 지정 |
Content-Location | 콘텐츠의 실제 URL 지정 |