HTTP 프로토콜의 작동 원리와 요청/응답 구조
HTTP란 무엇인가?Permalink
HTTP(HyperText Transfer Protocol)는 웹에서 데이터를 주고받기 위한 애플리케이션 계층 프로토콜입니다.
현재는 거의 모든 웹 애플리케이션의 데이터 교환 표준으로 사용되고 있습니다.
백엔드 개발자는 HTTP를 통해 클라이언트와 서버 간의 통신을 처리하는 API를 만듭니다.
HTTP의 특징Permalink
HTTP의 주요 특징을 살펴보면:
-
무상태성(Stateless): HTTP는 상태를 유지하지 않습니다. 각 요청은 이전 요청과 독립적으로 처리됩니다. 이는 서버 확장성에 유리하지만, 사용자 세션 관리에는 추가 메커니즘(쿠키, 세션, 토큰 등)이 필요합니다.
-
비연결성(Connectionless): 기본적으로 요청과 응답 후 연결을 종료합니다. (Keep-Alive 헤더를 통해 연결을 유지하여 여러 요청을 처리할 수 있으나, 본질적으로는 비연결 지향입니다.)
-
클라이언트-서버 구조: 클라이언트가 요청을 보내고 서버가 응답하는 단순한 구조입니다.
-
텍스트 기반 프로토콜: HTTP 메시지는 사람이 읽을 수 있는 텍스트 형식이라 디버깅에 용이합니다.
위 그림은 HTTP 메시지 모습입니다.
HTTP 통신 과정Permalink
HTTP 통신 과정은 다음과 같습니다:
-
클라이언트가 TCP 연결 수립: HTTP는 일반적으로 TCP 위에서 동작합니다. 클라이언트는 서버와 TCP 3-way handshake를 통해 연결을 맺습니다. (HTTP/3는 QUIC 프로토콜을 사용하여 UDP 기반으로 동작)
-
HTTP 요청 전송: 클라이언트가 서버에 HTTP 요청을 보냅니다.
-
서버 요청 처리: 서버는 요청을 받아 처리합니다.
-
HTTP 응답 전송: 서버가 클라이언트에게 응답을 보냅니다.
-
연결 종료 또는 유지: HTTP/1.0은 기본적으로 연결을 종료하고, HTTP/1.1 이상은 Keep-Alive가 기본 설정으로 연결을 유지합니다.
위 그림은 TCP 3-way handshake를 사용하여 연결하는 과정입니다.
HTTP 요청 구조Permalink
HTTP 요청은 다음과 같은 구조로 이루어져 있습니다:
[요청 라인] - HTTP 메서드, URI, HTTP 버전
[헤더 필드] - 요청에 대한 메타데이터
[공백 라인] - 헤더의 끝을 표시하는 빈 줄
[메시지 본문] - 요청과 함께 전송되는 데이터(선택적)
예시:
GET /api/users HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: application/json
Content-Type: application/json
{"name": "John"}
백엔드 개발자는 특히 다음 부분에 주목해야 합니다:
- 메서드(Method): 요청의 의도를 나타냅니다. GET, POST, PUT, DELETE 등이 있습니다.
- 헤더(Headers): 요청에 대한 추가 정보를 제공합니다. 인증 토큰, 컨텐츠 타입, 캐시 설정 등을 포함할 수 있습니다.
- 본문(Body): 주로 POST, PUT과 같은 요청에서 서버로 전송할 데이터를 담습니다.
HTTP 응답 구조Permalink
HTTP 응답은 다음과 같은 구조로 이루어져 있습니다:
[상태 라인] - HTTP 버전, 상태 코드, 상태 메시지
[헤더 필드] - 응답에 대한 메타데이터
[공백 라인] - 헤더의 끝을 표시하는 빈 줄
[메시지 본문] - 응답 데이터
예시:
HTTP/1.1 200 OK
Date: Tue, 8 Apr 2025 05:28:43 GMT
Server: Apache/2.4.1
Content-Type: application/json
Content-Length: 23
{"status": "success"}
백엔드 개발자는 특히 다음 부분에 주목해야 합니다:
- 상태 코드(Status Code): 요청 처리 결과를 나타냅니다. 2XX(성공), 3XX(리다이렉션), 4XX(클라이언트 오류), 5XX(서버 오류) 등이 있습니다.
- 헤더(Headers): 응답에 대한 추가 정보를 제공합니다. 컨텐츠 타입, 캐싱 정책, CORS 헤더 등이 포함될 수 있습니다.
- 본문(Body): 서버에서 클라이언트로 전송되는 실제 데이터입니다.
HTTP 헤더Permalink
HTTP 헤더는 요청과 응답에 대한 추가 정보를 제공합니다. 백엔드 개발자가 알아야 할 주요 헤더는 다음과 같습니다:
- Content-Type: 요청/응답 본문의 미디어 타입을 지정합니다. 예:
application/json
,text/html
- Authorization: 클라이언트 인증 정보를 전달합니다. 예:
Bearer TOKEN
- Cache-Control: 캐싱 정책을 제어합니다. 예:
no-cache
,max-age=3600
- Accept: 클라이언트가 처리할 수 있는 컨텐츠 타입을 지정합니다.
- Cookie/Set-Cookie: 클라이언트-서버 간 상태 정보를 교환합니다.
- Access-Control-Allow-Origin: CORS(Cross-Origin Resource Sharing) 정책을 설정합니다.
HTTP 버전별 차이점Permalink
-
HTTP/1.0: 기본적인 요청-응답 모델을 제공했지만 연결당 하나의 요청-응답 쌍만 처리 가능합니다.
-
HTTP/1.1: Keep-Alive, 파이프라이닝, 청크 전송 인코딩 등을 도입했습니다. 그러나 여전히 Head-of-Line 블로킹 문제가 있습니다.
-
HTTP/2: 바이너리 프로토콜로 전환하여 다중화된 스트림, 서버 푸시, 헤더 압축 등을 지원합니다. 성능이 크게 향상되었지만 여전히 TCP의 Head-of-Line 블로킹 문제가 존재합니다.
-
HTTP/3: QUIC 프로토콜 기반으로 UDP를 사용하여 TCP의 Head-of-Line 블로킹 문제를 해결하고, 연결 설정 지연을 줄였습니다.
HTTP의 한계와 극복 방안Permalink
- 무상태성으로 인한 세션 관리 문제 -> 쿠키, 세션, JWT 등을 활용한 상태 관리
- 보안 취약점 -> HTTPS를 통한 암호화 통신
- 단방향 통신 한계 -> WebSocket, Server-Sent Events 등의 실시간 통신 기술
- 성능 이슈 -> HTTP/2, HTTP/3, CDN 활용 등을 통한 성능 최적화
Leave a comment