HTTP란?

HTTP(HyperText Transfer Protocol)는 컴퓨터 간의 데이터 교환방식을 정의한 약속이다. 주로 HTML과 같은 문서 리소스를 주고 받기 위해 사용한다. 서버-클라이언트 모델로 구성되어 있다. 리소스를 요청하는 측을 클라이언트, 요청에 대한 응답을 제공하는 측을 서버라고 한다. HTTP는 이처럼 클라이언트와 서버가 주고받는 메세지의 양식을 규정한 통신규약이다.

웹 브라우저와 웹 서버는 이 HTTP를 기반으로 작동하며 거의 모든 데이터를 HTTP로 전송한다. 텍스트 뿐만 아니라 이미지, 영상, 음성, 파일, json 등을 전송할 수 있다. 서버 간의 통신에서도 HTTP를 사용한다.

 

HTTP의 특징

  • 클라이언트 서버 구조
  • 무상태 프로토콜 (Stateless)
  • 비 연결성 (Connectionless)
  • HTTP 메세지

 

클라이언트 서버 구조

클라이언트는 서버에 요청을 보내고 응답을 대기한다. 서버는 요청에 대한 결과를 만들어서 응답한다.

 

무상태 프로토콜 (Stateless)

무상태라는 것은 서버가 클라이언트의 상태를 보존하지 않는다는 의미다. 서버는 클라이언트의 요청을 이전 요청과는 무관하게 독립적으로 처리한다. 게시글 리스트를 최신순으로 조회하는 상황을 상태 유지와 무상태로 구분하여 예를 들면 다음과 같다. 우선 게시글 리스트 조회를 위해 게시글의 페이지 번호와 정렬 옵션(최신순)에 해당하는 값을 쿼리 파라미터로 서버에 전송한다고 가정한다.

  • 상태유지 (Stateful)
    • 게시글 리스트의 특정 페이지를 조회하기 위해 페이지 번호와 정렬 옵션 값을 HTTP의 쿼리 파라미터로 전송한다.
    • 다음 페이지 번호를 누르면 해당 페이지 번호만 쿼리 파라미터로 전송되고, 서버로 부터 응답을 받는다.
    • 정렬 옵션에 해당하는 쿼리 파라미터는 이전 페이지를 조회할 때 이미 전송했으므로 다시 전송할 필요가 없다.
  • 무상태 (Stateless)
    • 게시글 리스트의 특정 페이지를 조회하기 위해 페이지 번호와 정렬 옵션 값을 HTTP의 쿼리 파라미터로 전송한다.
    • 다음 페이지 번호를 누르면 페이지 번호와 함께 정렬 옵션 값이 쿼리 파라미터로 전송되고, 서버로 부터 응답을 받는다.
    • 무상태는 이전 요청과 독립적으로 현재 요청을 처리하므로 서버는 이전에 전송했던 정렬 옵션 값을 모른다.

무상태의 장점은 서버의 확장이 쉽다는 점이다. 클라이언트의 상태를 유지하지 않아 클라이언트와의 결합도가 낮아지기 때문이다. 반면, 클라이언트가 매번 추가 데이터를 전송해야 한다는 단점이 있다.

 

비 연결성 (Connectionless)

비 연결성은 서버가 클라이언트와의 연결을 유지하지 않는다는 의미이다. 서버가 클라이언트의 요청에 대해 응답한 후, 다음 요청을 기다리지 않고 바로 연결을 끊어버린다. 무상태와는 다른 개념이다. 이를 통해 서버의 자원을 효율적을 사용할 수 있다.

그러나 HTTP는 TCP를 기반으로 작동하기 때문에 클라이언트가 서버로 요청을 보낼 때마다 3 way handshake 과정을 거쳐야 하는 단점이 있다. 또한, 서버는 단순한 요청에도 기존에 있던 JavaScript, CSS, 추가 이미지 등을 다시 응답해야 한다. 이를 극복하기 위해 HTTP/1.1은 지속 연결(Persistent Connections), HTTP/2는 Multiplexing을 사용했다. HTTP/3부터는 UDP를 기반 프로토콜로 사용하며 이 단점을 극복했다.

 

HTTP 메세지

HTTP를 기반으로 통신할 때는 HTTP 메세지를 이용한다. 요청 메세지와 응답 메세지로 구분되며 메세지 구조는 다음과 같다. 

요청 메세지와 응답 메세지의 시작 라인에 차이가 있고 헤더와 바디라인은 비슷하다.

  • 요청 메세지 시작 라인
    • 요청 메소드, 요청 대상 URI 및 사용하는 HTTP 버전으로 구성된다.
  • 응답 메세지 시작 라인
    • 상태 코드, HTTP 버전을 담는다.
    • 상태 코드는 클라이언트 요청에 대한 처리 상태를 나타내는 코드다.
    • 만약 요청에 오류가 있을 경우, 그 이유에 대해 사람이 이해할 수 있는 텍스트도 포함한다.
  • 헤더 라인
    • 클라이언트가 서버로 보내는 추가 정보를 담는다.
    • 메세지 바디의 크기, 압축, 인증, 클라이언트 정보와 같은 메세지 바디에 대한 메타 데이터를 담는다.
  • 바디 라인
    • 실제 전송할 데이터를 담는다.

+ Recent posts