2 minute read

HTTP란 무엇인가?Permalink

HTTP(HyperText Transfer Protocol)는 웹에서 데이터를 주고받기 위한 애플리케이션 계층 프로토콜입니다.
현재는 거의 모든 웹 애플리케이션의 데이터 교환 표준으로 사용되고 있습니다.

백엔드 개발자는 HTTP를 통해 클라이언트와 서버 간의 통신을 처리하는 API를 만듭니다.


HTTP의 특징Permalink

HTTP의 주요 특징을 살펴보면:

  1. 무상태성(Stateless): HTTP는 상태를 유지하지 않습니다. 각 요청은 이전 요청과 독립적으로 처리됩니다. 이는 서버 확장성에 유리하지만, 사용자 세션 관리에는 추가 메커니즘(쿠키, 세션, 토큰 등)이 필요합니다.

  2. 비연결성(Connectionless): 기본적으로 요청과 응답 후 연결을 종료합니다. (Keep-Alive 헤더를 통해 연결을 유지하여 여러 요청을 처리할 수 있으나, 본질적으로는 비연결 지향입니다.)

  3. 클라이언트-서버 구조: 클라이언트가 요청을 보내고 서버가 응답하는 단순한 구조입니다.

  4. 텍스트 기반 프로토콜: HTTP 메시지는 사람이 읽을 수 있는 텍스트 형식이라 디버깅에 용이합니다. HTTP-메시지

위 그림은 HTTP 메시지 모습입니다.


HTTP 통신 과정Permalink

HTTP 통신 과정은 다음과 같습니다:

  1. 클라이언트가 TCP 연결 수립: HTTP는 일반적으로 TCP 위에서 동작합니다. 클라이언트는 서버와 TCP 3-way handshake를 통해 연결을 맺습니다. (HTTP/3는 QUIC 프로토콜을 사용하여 UDP 기반으로 동작)

  2. HTTP 요청 전송: 클라이언트가 서버에 HTTP 요청을 보냅니다.

  3. 서버 요청 처리: 서버는 요청을 받아 처리합니다.

  4. HTTP 응답 전송: 서버가 클라이언트에게 응답을 보냅니다.

  5. 연결 종료 또는 유지: HTTP/1.0은 기본적으로 연결을 종료하고, HTTP/1.1 이상은 Keep-Alive가 기본 설정으로 연결을 유지합니다.

TCP-3-way-handshake

위 그림은 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 헤더는 요청과 응답에 대한 추가 정보를 제공합니다. 백엔드 개발자가 알아야 할 주요 헤더는 다음과 같습니다:

  1. Content-Type: 요청/응답 본문의 미디어 타입을 지정합니다. 예: application/json, text/html
  2. Authorization: 클라이언트 인증 정보를 전달합니다. 예: Bearer TOKEN
  3. Cache-Control: 캐싱 정책을 제어합니다. 예: no-cache, max-age=3600
  4. Accept: 클라이언트가 처리할 수 있는 컨텐츠 타입을 지정합니다.
  5. Cookie/Set-Cookie: 클라이언트-서버 간 상태 정보를 교환합니다.
  6. Access-Control-Allow-Origin: CORS(Cross-Origin Resource Sharing) 정책을 설정합니다.


HTTP 버전별 차이점Permalink

  1. HTTP/1.0: 기본적인 요청-응답 모델을 제공했지만 연결당 하나의 요청-응답 쌍만 처리 가능합니다.

  2. HTTP/1.1: Keep-Alive, 파이프라이닝, 청크 전송 인코딩 등을 도입했습니다. 그러나 여전히 Head-of-Line 블로킹 문제가 있습니다.

  3. HTTP/2: 바이너리 프로토콜로 전환하여 다중화된 스트림, 서버 푸시, 헤더 압축 등을 지원합니다. 성능이 크게 향상되었지만 여전히 TCP의 Head-of-Line 블로킹 문제가 존재합니다.

  4. HTTP/3: QUIC 프로토콜 기반으로 UDP를 사용하여 TCP의 Head-of-Line 블로킹 문제를 해결하고, 연결 설정 지연을 줄였습니다.


HTTP의 한계와 극복 방안Permalink

  1. 무상태성으로 인한 세션 관리 문제 -> 쿠키, 세션, JWT 등을 활용한 상태 관리
  2. 보안 취약점 -> HTTPS를 통한 암호화 통신
  3. 단방향 통신 한계 -> WebSocket, Server-Sent Events 등의 실시간 통신 기술
  4. 성능 이슈 -> HTTP/2, HTTP/3, CDN 활용 등을 통한 성능 최적화

Leave a comment