CS/네트워크

[네트워크] HTTP의 특성

mhko411 2021. 9. 23. 09:55
728x90

이전에 HTTP의 기본 동작을 정리하였다. 이후에 프로젝트를 진행하면서 HTTP의 특성들을 알게 되었고 따로 정리를 해야 할 필요가 있다고 생각하였다. HTTP는 클라이언트-서버 구조를 갖고, Stateless, Connnectionless, 대부분의 파일 형식을 전송할 수 있다는 4가지의 특성이 있다.


클라이언트 - 서버 구조

HTTP는 클라이언트가 서버에 요청하는 단방향 통신이며 서버는 요청이 있을 때에만 응답하는 구조를 갖고 있다. 이때 서버는 요청한 것을 처리한 결과에 따라서 다른 응답을 보낸다. 예를 들어 특정 URL로 이동했을 때 해당 URL이 존재하지 않을 때는 404 응답을 보낸다. 또한 정상적으로 이동했을 때는 200 계열의 응답을 보내게 된다.

 

Stateless

HTTP는 상태를 저장하지 않는다. HTTP의 특성 중에 가장 이해하기 어려웠다. 상태를 저장하지 않는다는 것이 어떤 의미인지 파악할 필요가 있다. 

예를 들어 HTTP가 상태를 저장한다고 가정하고 아래와 같은 과정으로 옷을 구매한다고 해보자.

  • 쇼핑몰을 보다가 마음에 드는 후드티를 발견하고 상세 정보를 보기 위해 클릭한다.
  • 서버는 후드티의 상세 정보를 보기 위한 요청에 응답하고 요청에 대한 정보를 저장한다.
  • 이어서 클라이언트 사이즈를 L로 선택 후에 구매하기 버튼을 누른다.
  • 서버는 사이즈는 알고 있지만 어떤 후드티인지는 알지 못하기 때문에 해당 정보를 저장하고 있는 서버에 요청한다.
  • 이제 다른 서버에서 후드티에 대한 정보를 받아 구매하기 요청을 받은 서버에서 처리한다.

위의 사례처럼 상태를 저장하고 있다면 클라이언트는 후드티에 대한 정보는 이전에 요청했기 때문에 사이즈에 대한 정보만 요청할 수 있다. 하지만 서버들은 각각 후드티의 정보와 사이즈의 정보를 받았고 두 개의 정보를 합쳐야 하기 때문에 서버들이 통신하게 된다. 이에 따라 비용이 증가한다.

 

결론적으로 Stateless를 통해 확장 가능한 서버를 설계할 수 있으며 비용이 줄일 수 있게 된다. 대규모의 트래픽이 발생할 것을 대비하여 서버는 여러 대를 두기 때문에 서버의 수가 증가할수록 서버끼리의 통신 비용이 발생하기 때문이다.

 

Connectionless

HTTP는 클라이언트와 서버 사이의 연결을 유지하지 않는다. 클라이언트가 요청을 하고 서버가 응답하면 서버는 이에 대한 연결을 끊는다. 만약 계속해서 연결을 유지한다면 클라이언트는 서버의 응답을 받지 않았지만 계속 요청을 보낼 수 있기 때문에 연결 유지를 최소화하는 것이 좋다.

 

최근에는 클라이언트와 서버 사이의 새로운 연결을 생성하는 비용이 비싸다는 이유로 Keep Alive 옵션을 통해 일정 기간 동안 클라이언트와 서버의 연결을 유지하는 통신이 가능해졌다. 빈번하게 연결을 맺고 끊는 것보다 일정 기간 연결을 유지하는 것이 더욱더 효율적이다.

 

다양한 파일 형식 전송 가능

HTTP는 HTML 파일을 전송하기 위해 만들어진 프로토콜이었지만 최근에는 거의 모든 파일 형식을 HTTP를 통해 전송이 가능하다. 공공 데이터를 사용해보면 HTTP를 통해 JSON, XML과 같은 파일도 받을 수 있다는 것을 알 수 있다. 이뿐만 아니라 TEXT, IMAGE 파일도 HTTP로 전송이 가능하다.