HTTP(HyperText Transfer Protocol)
💡HTTP는 클라이언트와 서버가 데이터를 주고받기 위한 통신 규약입니다.
현재 HTTP는 단순한 HTML뿐만 아니라 이미지, 영상, 파일, API 데이터(JSON, XML) 등 거의 모든 데이터를 전송할 수 있습니다. 즉, 인터넷에서 주고받는 대부분의 데이터는 HTTP를 사용합니다.
심지어 브라우저와 서버뿐만 아니라 서버와 서버끼리의 통신에서도 많이 사용되며, 일반적인 웹 서비스는 HTTP 기반으로 동작합니다. 이론적으로는 TCP를 직접 사용할 수도 있지만, 특수한 경우가 아닌 이상 직접 사용하지는 않습니다.
✔️HTTP는 혼자 동작하는 것이 아닌 하위 프로토콜 위에서 동작합니다.
↳HTTP/1.1, HTTP/2 -> TCP기반, HTTP/3 -> UDP 기반
HTTP 특징
1. 클라이언트 - 서버 구조(Request - Response 구조)
💡HTTP는 항상 요청과 응답으로 동작하며, 클라이언트와 서버가 나뉘어져있다는 것이 중요
↳ 과거에는 클라이언트와 서버가 분리되어있지 않았음.
✔️HTTP 동작 흐름
- 클라이언트가 HTTP 메세지를 통해서 서버에 요청
- 클라이언트는 서버 응답 올떄까지 대기
- 서버 응답
역할 분리의 장점
✔️ 클라이언트 - 화면(UI), 사용자 경험(UX) 담당
✔️ 서버 - 비즈니스 로직, 데이터 처리, 핵심 기능 담당
| 장점 | 설명 |
| 독립적인 개발 가능 | 클라이언트 / 서버 따로 개발 가능 |
| 유지보수 용이 | UI 변경 -> 서버 영향 x 서버 로직 변경 -> UI 영향 최소 |
| 문제 발생시 대처 용이 | 서버 트래픽 초과시 서버만 확장하면 됨 |
🎈클라이언트 서버는 화면에 보여지는 역할을, 서버는 주요 로직 및 데이터를 처리하는 역할을 담당함으로써, 각각 자신의 역할에만 집중할 수 있게 함
2. 무상태 프로토콜(Stateless)
💡무상태란 서버가 클라이언트의 이전 상태를 기억하지 않는 방식이며, HTTP는 기본적으로 무상태 프로토콜을 지향함.
↳ 요청이 올 때마다 이전 요청과 완전히 독립적으로 처리
✔️ 특징 : 요청마다 필요한 정보 포함 -> 서버가 기억할 필요 없음
✔️ 장점 : 어떤 서버가 처리해도 상관없음 - 서버 증설 가능, 서버 장애에도 대응 가능(수평 확장 가능)
예시
고객: 노트북 가격 얼마에요?
점원 A: 100만 원입니다.
고객: 노트북 2개 구매할게요
점원 B: 어떤 거로 결제하시겠어요?
고객: 노트북 2개 카드로 결제할게요
점원 C: 결제 완료
✔️ 요청마다 필요한 정보 포함 -> 서버가 기억할 필요 x
✔️ 어느 직원이 처리해도 업무 유지 가능(장애 대응 및 서버 증설 가능)

장점
| 구분 | 설명 | 예시 |
| 서버 확장 용이 (스케일 아웃) |
요청이 들어오면 아무 서버나 처리 가능 *서버를 쉽게 증설 가능(구조) |
클라우드 서버 증설 시 자동 분산 |
| 장애 대응 | 특정 서버가 죽어도 다른 서버로 바로 처리 가능 | 서버 1 장애 발생 -> 서버 2 대신 처리 |
| 대규모 트래픽 처리 | 여러 서버가 동시에 요청을 나눠 처리 가능 (실제 상황에 대한 성능) |
1만명 동시 요청 -> 서버 100대가 나눠 처리 |
단점
✔️ 요청마다 모든 정보를 보내야 하므로, 데이터의 양이 비교적 많아짐
✔️ 모든 기능을 무상태로 만들 수 없는 경우가 있음(로그인 상태, 쇼핑 카트 등)
↳ Stateful이 필요한 경우 쿠키 및 세션, 토큰 등으로 해결하며 사용을 최소화하는 것이 중요
Stateful(상태 유지)
💡Stateful이란 서버가 클라이언트의 상태(이전 요청 정보)를 기억하고 유지하는 방식
ex) 로그인 정보 및 장바구니 등
예시
고객: 노트북 가격 얼마예요?
점원 A: 100만 원입니다.
고객: 2개 구매할게요
점원 B:??? (어떤 제품을 구매하는지, 이전 상황 모름)
고객: 카드로 결제할게요
점원 C:??? (어떤 제품을 몇 개 구매하는지, 이전 상황 모름)
✔️ 세션 공유 필요
↳ 요청을 처리하려면 서버가 이전 상태를 기억해야 함
✔️ 특정 서버로만 요청 전달 해야 함
↳ 점원이 바뀌면 업무를 처음부터 다시 해야 함(장애 발생 시 대처 및 서버 확장 어려움)

장점
| 구분 | 설명 |
| 요청이 간단 함 | 로그인 한 번 요청 하면 이후 요청엔 정보 안보내도 됨. |
| 복잡한 흐름 처리에 유리 | 상태가 있어야 자연스러운 서비스에 적합(로그인, 장바구니, 결제과정 등) |
단점
✔️ 서버 확장 어려움
✔️ 장애에 취약
✔️ 서버 부담 증가(사용자 상태 계속 저장 -> 메모리 사용 증가)
Stateless vs Stateful 정리
| 구분 | Stateful(상태 유지) | Stateless(무상태) |
| 상태 기억 | 서버가 클라이언트 상태를 보존 | 서버는 상태를 저장하지 않음 |
| 요청 간 연결 | 요청 간 연속성 유지 필요 | 요청마다 독립적 처리 |
| 서버 부담 | 큼 | 작음 |
| 확장성 | 낮음 | 높음 |
| 장애 대응 | 서버 장애 시 정보 손실 | 서버 장애에도 무관, 다른 서버 처리 가능 |
3, 비연결성(connectionless)
💡비연결성이란 요청과 응답이 끝나면 연결을 바로 끊는 방식입니다.
동작 흐름
✔️ 요청 -> 응답 -> 연결 종료
↳ 필요할 때만 연결
장점
| 구분 | 설명 | 핵심 |
| 서버 자원 절약 | 요청이 있을때만 연결 후 바로 끊음 | 불필요한 연결 유지 x |
| 대규모 트래픽 처리 | 동시에 많은 사용자의 요청 처리 가능 (1시간 동안 1000명 접속, 실제 동시 요청은 몇 십개) |
서버가 연결에 묶이지 않음 |
| 효율적인 서버 운영 | 자원을 필요한 순간에만 사용 | 서버 활용도 극대화 |

단점
| 구분 | 설명 | 핵심 |
| 성능 저하(지연 증가) | 요청때마다 TCP/IP 새로 연결 필요 -> 3 way handshake 시간 추가 |
요청과 연결 생성 비례 ex) 요청 100개 = 100번 연결 |
| 웹 페이지 로딩시 비효율 | 웹 페이지 하나에는 HTML, CSS, JS, 이미지 등 수 많은 자원 존재 -> 수십 개의 동시 요청 발생 |
요청마다 수 많은 자원의 생성과 종료를 반복 -> 속도 저하 |
| 상태 유지 어려움 | 이전 상태 정보가 없어 로그인, 장바구니 등 구현 어려움 | 이전 상태 정보 기억x |
연결 유지 모델
✔️ 클라이언트와 서버가 계속 연결을 유지
↳ 요청이 없어도 계속 연결을 유지해 지속적인 서버 사용 -> 서버 메모리, 연결 자원 낭비

HTTP 지속 연결(Persistent Connection)
기존의 비연결성을 그대로 사용하기에는 속도 저하 및 서버/네트워크 부담 증가의 문제가 발생해 이를 해결하기 위한 방식입니다.
💡한 번 맺은 연결을 바로 끊지 않고, 일정 시간 유지하면서 여러 요청을 처리하는 방식
동작 방식
✔️ 클라이언트 -> 서버 연결(1번만 연결)
✔️ 요청 여러 개 처리(HTML, CSS, JS, 이미지 등)
✔️ 일정 시간 후 연결 종료
장점
기존의 비연결성이 요청에 비례해 연결을 했다면, 지속 연결은 여러 개의 요청이 와도 1번만 연결합니다.
✔️ 성능 향상 - 연결 생성 횟수 감소, 응답 속도 증가
✔️ 네트워크 비용 절감 - handshake 횟수 감소
✔️ 사용자 경험 개선 - 페이지 로딩 속도 향상
정리
🎈 HTTP 지속 연결은 매 요청마다 연결을 새로 생성하는 비연결성의 단점을 보완하기 위해,
하나의 연결을 일정 시간 유지하며 여러 요청을 처리하는 방식이다.(웬만한 HTML 하나 다 받을 때까지는 유지)
HTTP 메시지
💡 HTTP 메시지란 클라이언트와 서버가 서로 주고받는 데이터 형식(약속된 구조)입니다.
↳ 요청 / 응답 모두 정해진 형식에 맞춤
HTTP 메시지 전체 구조

요청 메시지(Request) 예시
GET /members? id=100 HTTP/1.1
Host: www.example.com
User-Agent: Chrome
(빈 줄)
(바디 - Hello) *보통 없음
시작 라인(start-line)
✔️ GET /members? id=100 HTTP/1.1
[메서드] [경로] [HTTP 버전]
| 구조 | 메세지 | 역할 |
| 메서드 (method) |
GET | 서버에게 뭘 할지 알려줌 |
| 경로 (request-target) |
/members?id=100 */members -> 회원 목록, ?id=100 -> 조건(쿼리) |
서버에서 어떤 데이터를 요청하는지 알려줌 |
| HTTP 버전 | HTTP/1.1 | 어떤 규칙으로 통신하는지 알려줌 |
메서드 종류(method)
| 메서드 | 의미 |
| GET | 데이터 조회 |
| POST | 데이터 생성 |
| PUT | 데이터 수정 |
| DELETE | 데이터 삭제 |
헤더(Header)
💡헤더(Header)는 이 요청에 대한 추가 설명을 의미합니다.
✔️Host: www.example.com
User-Agent: Chrome
| 헤더 | 의미 |
| Host | 요청 서버 주소 |
| User-Agent | 브라우저 정보 |
| Content-Type | 데이터 타입 |
| Authorization | 인증 정보 |
🎈쉽게 말하자면 택배 상자에 붙은 스티커로 보내는 사람, 내용물 종류, 크기를 알려줍니다.
빈 줄
💡컴퓨터는 헤더와 바디를 구별하지 못하기에, 헤더와 바디의 구간을 알려주는 구분선입니다.
바디(Body)
💡Body는 실제 데이터를 의미하며, HTML, JSON, 이미지, 파일 등 모든 데이터를 처리할 수 있습니다.
↳ 실제 데이터를 담지만 모든 요청이 데이터를 보내지는 않기에 모든 요청이 필요하지 않고 보통 없음.
✔️ HTML
<html>
<body> Hello </body>
</html>
응답 메시지(Response) 예시
HTTP/1.1 200 OK
Content-Type: text/html
(빈 줄)
<html>
<body> Hello </body>
</html>
시작 라인(status-line)
✔️ HTP/1.1 200 OK
[버전] [상태코드] [설명]
상태 코드
| 코드 | 의미 |
| 200 | 성공 |
| 400 | 요청 오류 |
| 500 | 서버 오류 |
설명(이유 문구, reason-phrase)
💡 사람이 이해하기 쉽게 짧게 상태를 설명합니다.
↳ ex) OK
정리
🎈 응답 메시지는 "요청 처리 결과" + 상태 코드 + 데이터(바디)의 구조로 전달합니다.
HTTP 메시지 구조의 장점
💡HTTP는 겉으로 보면 복잡해 보이지만 내부 구조는 매우 단순합니다.
↳ 실제 내부 구조(시작라인, 헤더, 빈 줄, 바디)
| 장점 | 설명 | 예시 |
| 고정된 구조 | [시작라인 + 헤더 + 바디] | 새로운 기능이 나와도 구조는 바뀌지 않음 |
| 확장성 | 헤더로 기능 무한 확장 가능 | Content-Type : json Authorization : token |
| 누구나 쉽게 구현 가능 | 문자열만 만들어도 HTTP 가능 | <html> <body> hello </body> </html> |
🎈 HTTP는 기능이 많아 복잡해 보이지만, 실제 구조는 단순하며 헤더를 통해 기능을 확장할 수 있도록 설계된 프로토콜
'Network' 카테고리의 다른 글
| [Network] - HTTP 상태코드 정리 (0) | 2026.04.03 |
|---|---|
| [Network] - HTTP 메서드 활용과 API 설계 (0) | 2026.04.02 |
| [Network] - HTTP 메서드와 HTTP API 설계 (1) | 2026.04.01 |
| [Network] - URI의 이해 (0) | 2026.03.27 |
| [Network] 인터넷 네트워크의 기초 이해 - IP와 TCP,UDP (0) | 2026.03.25 |