HTTP 개요
HTTP(Hypertext Transfer Protocol)는 월드 와이드 웹(WWW)에서 하이퍼텍스트 문서를 전송하기 위한 애플리케이션 계층 프로토콜임.
기본적으로 요청(Request)과 응답(Response) 기반의 비상태성(Stateless) 통신 방식으로 동작함.
클라이언트와 서버 간의 자원(Resource) 교환을 책임짐.
1. 애플리케이션 계층
TCP/IP 프로토콜 스택에서 가장 상위 계층으로, 사용자는 주로 이 계층에서 웹 브라우저, 웹 서버, API 서버 등의 애플리케이션을 통해 HTTP 프로토콜을 다루게 됨.
2. 비상태성(stateless)
한 번의 요청-응답이 끝나면 연결 정보나 상태를 서버가 별도로 유지하지 않는 특징이 있음.
이로 인해 확장성과 단순성이 뛰어나지만, 세션(session)이나 쿠키(cookie) 같은 메커니즘으로 상태를 관리해야 할 필요가 생김.
HTTP의 역사와 주요 버전 : HTTP/0.9
1. 출시 시기
1991년경(비공식적인 최초 버전)
2. 주요 특징
단순한 GET 메서드만 지원.
헤더(Header) 개념이 없음.
HTML 문서 전송만 가능한 매우 간단한 프로토콜.
HTTP의 역사와 주요 버전 : HTTP/1.0
1. RFC 1945 (초기 명세)
2. 주요 특징
헤더를 통한 메타데이터 전송 가능.
GET, POST, HEAD 메서드를 지원.
기본적으로 요청마다 새로운 TCP 연결을 맺는 단기 연결(Non-persistent connection) 구조.
HTTP의 역사와 주요 버전 : HTTP/1.1
1. RFC 2068 → RFC 2616 → (이후) RFC 7230-7235 로 재정비
2. 주요 특징
Persistent Connection(Keep-Alive): 기본적으로 연결을 재사용할 수 있게 하여 성능 향상.
Chunked Transfer Encoding: 전송 중에 콘텐츠를 여러 조각으로 잘라 보내, 콘텐츠 길이를 미리 알지 못해도 실시간으로 스트리밍 가능.
Host 헤더 필수화: 가상 호스팅 지원(같은 IP, 다른 도메인 여러 사이트 동작).
파이프라이닝(Pipelining): 하나의 연결에서 다중 요청을 순차적으로 전송해 RTT(Round-Trip Time) 지연을 감소시키는 기능(다만, 실제 브라우저 구현에서 문제점이 많아 널리 사용되지는 않음).
HTTP의 역사와 주요 버전 : HTTP/2
1. RFC 7540 (2015년 제정)
SPDY(구글이 제안했던 프로토콜)를 기반으로 표준화
2. 주요 특징
멀티플렉싱(Multiplexing): 하나의 TCP 연결에서 여러 개의 스트림(Stream)을 병렬로 송수신 가능 → HTTP/1.1의 파이프라이닝 한계를 극복.
헤더 압축(HPACK): 헤더를 효율적으로 압축해 데이터 전송량을 줄임.
서버 푸시(Server Push): 서버가 클라이언트 요청 없이 리소스를 미리 푸시할 수 있어 초기 로드 속도 개선.
바이너리 프레이밍(Binary Framing): 텍스트 기반에서 바이너리 기반으로 프로토콜 계층을 재정의해 더 효율적인 패킷 처리가 가능.
HTTP의 역사와 주요 버전 : HTTP/3
1. RFC 9114 (2022년 표준화)
QUIC(구글이 개발한 전송 계층 프로토콜)를 기반으로 표준화
2. 주요 특징
UDP 기반 QUIC 사용: TCP가 아니라 UDP 위에서 자체적인 전송 계층 역할을 수행 → 연결 설정 지연(TCP 3-웨이 핸드셰이크, TLS 핸드셰이크) 감소.
멀티플렉싱 시 HOLB(Head-of-line Blocking) 방지: TCP는 한 스트림의 손실이 연결 전체에 영향을 미쳤지만, QUIC은 스트림 단위로 독립적 처리 가능.
TLS 1.3과의 통합: 보안을 위해 QUIC 내부에서 TLS 1.3 기능을 포함해 빠른 암호화 통신 수행.
HTTP 동작 원리 : 요청-응답 구조
HTTP는 클라이언트(주로 웹 브라우저)가 서버(웹 서버)에게 특정 자원(Resource)이나 작업을 요청함.
서버는 해당 요청을 처리한 뒤 결과를 응답으로 돌려주는 구조임.
요청과 응답은 다음과 같은 형태를 가짐.
1. HTTP 요청(Request) 라인
GET /index.html HTTP/1.1
메서드(Verb): GET, POST, PUT, DELETE 등
리소스 경로(Path): /index.html, /api/users 등
프로토콜 버전: HTTP/1.1, HTTP/2 등
2. HTTP 헤더(Header) 영역:
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
...
3. 요청 바디(Body) (선택적):
메서드가 POST/PUT/PATCH 등일 경우, 전송할 데이터가 이 영역에 담김(JSON, Form 데이터 등)
HTTP 동작 원리 : 주요 HTTP 메서드
1. GET: 리소스 조회
2. POST: 리소스 생성, 데이터 전송
3. PUT: 리소스 전체 갱신
4. PATCH: 리소스 일부 갱신
5. DELETE: 리소스 삭제
6. HEAD: GET과 동일한 요청이지만, 바디 없이 헤더만 확인
7. OPTIONS: 서버가 지원하는 메서드나 옵션 확인
그 외 TRACE, CONNECT 등 특수 용도 메서드 존재
HTTP 동작 원리 : HTTP 헤더
헤더는 요청과 응답에 대한 메타데이터를 포함함.
1. 일반 헤더(General Header): 메시지 전체에 적용되는 정보
예: Date, Connection, Cache-Control 등
2. 요청 헤더(Request Header): 요청 메시지에 포함되는 부가 정보
예: Host, User-Agent, Accept, Accept-Encoding, Cookie, Authorization 등
3. 응답 헤더(Response Header): 응답 메시지에 포함되는 부가 정보
예: Server, Set-Cookie, WWW-Authenticate 등
4. 엔티티 헤더(Entity Header): 실제 전송되는 콘텐츠 바디에 대한 정보
예: Content-Type, Content-Length, Content-Encoding, Last-Modified 등
HTTP/2부터는 헤더 구조가 ‘프레임’ 형태로 재정의되었고, HPACK을 사용해 압축 전송함(HTTP/3에서는 QPACK).
HTTP 동작 원리 : 상태 코드
서버가 요청을 어떻게 처리했는지를 나타내는 3자리 숫자임.
1. 1xx (Informational): 정보 전달(HTTP/1.1에서 추가된 개념)
2. 2xx (Success): 성공
200 OK, 201 Created 등
3. 3xx (Redirection): 리다이렉션
301 Moved Permanently, 302 Found, 304 Not Modified 등
4. 4xx (Client Error): 클라이언트 측 오류
400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found 등
5. 5xx (Server Error): 서버 측 오류
500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable 등
HTTP 연결 방식 : 비연결성과 TCP 연결
HTTP 자체는 상태를 유지하지 않지만, 실제 전송은 TCP(전송 계층) 연결을 사용함.
HTTP/1.0 이전에는 요청마다 TCP 연결을 새로 맺고 끊었으나, HTTP/1.1부터 Keep-Alive가 기본 활성화됨.
HTTP 연결 방식 : Keep-Alive
Connection: keep-alive 헤더를 통해 여러 번의 요청-응답을 단일 TCP 연결 위에서 처리함.
TCP 연결 생성/종료 비용 감소 → 성능 개선 효과
HTTP 연결 방식 : 파이프라이닝
HTTP/1.1 기능으로, 하나의 연결에서 여러 요청을 연달아 보낼 수 있지만, 응답 순서는 요청 순서를 지켜야 함 → 헤드 오브 라인 블로킹(HoLB) 문제가 발생하기도 함
실제 브라우저에서 잘 사용하지 않음 → HTTP/2의 멀티플렉싱으로 대체
HTTP 연결 방식 : HTTP/2 멀티플렉싱
단일 TCP 연결에서 여러 스트림(Stream)을 병렬로 전송
HOLB 문제 완화, 브라우저에서 다수의 리소스를 동시에 요청 가능
보안과 HTTPS : HTTPS (HTTP over TLS)
전송 계층인 TCP와 애플리케이션 계층인 HTTP 사이에 TLS(Transport Layer Security)를 추가하여 암호화된 통신을 수행.
인증서(SSL/TLS 인증서)를 이용해 웹 서버의 신원 식별과 데이터 암호화를 동시에 제공.
TLS 1.2, TLS 1.3이 현재 많이 사용되며, TLS 1.3에서는 핸드셰이크 과정을 단축해 성능과 보안을 동시에 개선.
보안과 HTTPS : TLS 핸드셰이크
클라이언트가 서버에 “ClientHello”를 보내며, 사용할 수 있는 암호화 스위트, TLS 버전 등을 제안.
서버가 “ServerHello”로 응답하며, 선택된 암호화 방식, 인증서(공개키)를 전달.
클라이언트는 인증서를 검증하고, 대칭키 교환 과정 등을 거쳐 암호화 통신을 위한 세션 키를 생성.
핸드셰이크 이후 모든 HTTP 메시지는 대칭키로 암호화되어 전송.
HTTP/3(QUIC)에서는 TLS를 QUIC 프로토콜과 통합하여 핸드셰이크 시간이 더 짧아짐.
성능 최적화 기법 : 캐싱
Cache-Control, Expires, ETag, Last-Modified 등 헤더를 통해 캐싱 정책을 제어
불필요한 요청을 줄이고, 로드 속도를 높이며, 서버 부담을 경감
성능 최적화 기법 : 압축
Content-Encoding 헤더를 통해 gzip, deflate, br(브로틀리) 같은 압축 알고리즘 사용
HTTP/2/HTTP/3에서 헤더 자체도 HPACK/QPACK으로 압축
성능 최적화 기법 : 쿠키와 세션
HTTP가 비상태성 프로토콜이라는 특성을 보완하기 위해, Set-Cookie 헤더로 클라이언트에 저장되는 쿠키 활용
로그인 상태 유지, 개인화된 정보 저장 등에 사용
HTTP/2와 HTTP/3에서의 성능 향상 포인트 : HTTP/2
멀티플렉싱으로 인한 대역폭 효율화
헤더 압축(HPACK)으로 인한 전송 효율 상승
서버 푸시로 초기 로딩 시간 단축
HTTP/2와 HTTP/3에서의 성능 향상 포인트 : HTTP/3 (QUIC)
UDP 기반 QUIC으로 TCP 손실 복구 지연 감소, 빠른 핸드셰이크
스트림 단위 독립적 전송으로 HOLB 문제 해결
TLS 1.3 통합으로 보안/속도 모두 개선
실제 웹에서의 HTTP 활용
대부분의 웹 브라우저(Chrome, Firefox, Safari, Edge 등)는 HTTP/1.1 이상을 기본적으로 사용하고, 가능한 경우 HTTP/2로 자동 업그레이드함.
최신 버전 브라우저와 서버(Nginx, Apache, Cloudflare, etc.)는 TLS 1.3 및 HTTP/3(QUIC) 지원을 확대하고 있음.
API 서버 간 통신(REST, GraphQL 등)에서도 HTTP의 메서드, 헤더, 상태 코드가 적극적으로 활용됨.
HTTP/2는 이미 널리 배포되어 있으며, HTTP/3는 점진적으로 확산되고 있음.
정리
HTTP는 웹의 기반을 이루는 핵심 프로토콜로서, 단순한 텍스트 전송에서 시작하여 멀티플렉싱, 스트림 기반 전송, 보안 암호화 등을 거치며 계속해서 진화하고 있음.
HTTP/2, HTTP/3와 같은 최신 표준에서는 성능과 보안을 크게 개선하여 복잡한 현대 웹 애플리케이션에서도 빠르고 안정적인 통신을 제공하고 있음.
핵심 포인트는 다음과 같음.
1. 요청-응답 기반의 비상태성 프로토콜이지만, 쿠키, 세션, OAuth 등으로 상태 관리
2. Keep-Alive로 인한 연결 재사용, 파이프라이닝, 멀티플렉싱으로 통신 효율 향상
3. TLS(HTTPS)를 통한 암호화와 인증으로 보안성 강화
4. 최신 HTTP/3(QUIC)는 UDP 기반으로 TCP 한계를 극복하고 HOLB 문제를 완화
5. 서버 푸시, 헤더 압축, 캐싱 등을 통해 실제 웹 성능 체감을 향상
HTTP는 웹 서비스 개발과 운영에서 빠질 수 없는 필수 기술임.
버전별 특징과 통신 메커니즘을 이해하고 적절히 활용하는 것이 중요함.
'Operating System > Computer' 카테고리의 다른 글
[Computer] 웹 통신 프로토콜 (0) | 2024.11.22 |
---|---|
[Computer] HTTP와 HTTPS 동작방식 (0) | 2024.11.22 |
[Computer] 메모리 (0) | 2024.07.08 |
[Computer] RAM (0) | 2024.07.07 |
[Computer] 파이썬 코드가 실행되는 과정 (0) | 2024.06.23 |