HTTP의 Stateless와 Connectionless

Daehyeon Yun·2024년 8월 1일

🤚What is HTTP?

HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜.

  • HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이자, 클라이언트-서버 프로토콜
  • 클라이언트와 서버들은 데이터 스트림과 대조적으로 개별적인 메시지 교환에 의해 통신한다.
    • 클라이언트에 의해 전송되는 메시지를 요청(Request), 그에 대해 서버에서 응답으로 전송되는 메시지를 응답(Response)라고 부른다.
  • HTTP는 CL7 계층(애플리케이션 계층)의 프로토콜로, 신뢰 가능한 전송 프로토콜이라면 이론상 무엇이든 사용 가능하지만 TCP 혹은 TCL로 전송된다.
  • HTTP 프로토콜이 진행될 때 요청과 응답 사이에는 다양한 개체들이 존재한다.
    • 다양한 작업을 수행하는 게이트웨이 혹은 캐시 역할을 하는 프록시 등이 존재한다.

🪢 HTTP는 Stateless하다.

  • Stateless는 서버가 클라이언트의 상태를 저장하지 않는 것을 말한다.
    • 즉, 서버는 요청한 클라이언트가 누구인지 모른다.
  • 장점 : 서버의 확장성이 높음 → 서버에 상태를 저장하지 않으므로 서버 확장에 용이하다.
  • 단점 : 클라이언트가 데이터를 추가로 전송해야한다.

💡 클라이언트의 상태를 저장하는 Stateful의 경우 서버가 클라이언트의 상태를 저장할 시 서버가 변경되거나, 장애가 발생 시 문제가 커지기에 서버의 확장이 쉽지 않다.

💡 Stateless일 경우 서버가 상태를 저장하지 않으므로 서버가 변경되거나 중지되어도 클라이언트의 요청을 받아 응답할 수 있으며, 요청이 대량 발생해도 서버를 대거 투입할 수 있다.

→ 이와 같이 기존 서버만으로 용량이나 성능의 한계에 도달했을 때, 비슷한 사양의 서버를 추가로 연결해 기존 서버의 부하를 분담하는 방식을 스케일 아웃(Scale-out) 혹은 수평 스케일링(Horizontal Scaling)이라 한다.

🤔 Stateless의 실무 한계

  • 모든 서버를 Stateless로 설계할 수는 없다.
    • 로그인 사용자의 경우, 로그인 했다는 상태를 서버에 유지시켜야 한다.
    • 웹 브라우저의 쿠키, 세션 등을 상태(State)에 유지할 필요성이 있을 수 있다.
    • 상태 유지는 최소한으로 사용해야한다.

🤝 HTTP는 Connectionless하다.

  • Connectionless는 뜻 그대로 연결을 하지 않는다는 뜻이다.
  • HTTP는 Connectionless한 특성을 가지고 있다.
    • 클라이언트의 요청, 서버의 응답 이후에는 연결을 종료한다.
    • 이러한 특성으로 1시간동안 수천명이 서비스를 사용해도, 실제 서버에서의 동시 처리 요청은 매우적다. 따라서 서버 자원을 효율적으로 사용할 수 있다.
    • 단점 : TCP/IP 연결을 계속 새로 맺어야 한다. → 즉, 3-way handshake 시간을 계속 소요해야한다. → 특정 사이트를 요청 시 다양한 리소스를 다운로드하게 되는데, 리소스마다 연결을 새롭게 생성하기 때문에 overhead가 과하게 발생한다.
  • Connectionless의 반대로 Connection-oriented이 있다.
    • Connection-oriented(연결 유지) 모델은 클라이언트의 요청과 서버의 응답 이후에도 연결을 계속 유지한다.
    • 이때, 요청과 응답 이후에도 연결을 지속적으로 유지하기 때문에 서버의 자원을 계속해서 소모하게 된다.

🤔 HTTP가 Connectionless하다면 서버간 요청과 응답의 속도를 개선할 수 없는걸까?

  • HTTP1.0 버전 발표 이후, 클라이언트와 서버간 요청과 응답을 어떻게 하면 빨리 할 수 있을지에 대한 연구가 이루어졌다.
    • 대표적으로 Persistent Connection 기법이 있다.
  • 💡Persistent Connection는 뭐지?
    • HTTP는 서버간 요청과 응답 사이마다 TCP/IP 연결을 계속 새로 맺는다. 즉, 3-way handshake 방식(SYN, SYN-ACK, ACK)을 이용해 통신이 이루어진다.
    • 이를 개선하기 위해 하나의 요청과 응답이 진행된 후 연결이 끊어지는 것이 아닌, 일정시간동안 동일한 TCP 연결을 사용하며 여러 개의 요청과 응답을 처리하는 방식을 말한다.
  • 💡Persistent Connection의 탄생 이유
    • 웹의 초장기에는 웹을 통해 전달해야 하는 사이트의 콘텐츠 수가 그리 많지 않았다. 따라서 다수의 TCP 연결 사용으로 인한 부담은 크지 않았으나, 웹 사이트의 멀티미디어 시장의 규모가 커지며 TCP 연결의 재사용이 필요하게 되었다.
    • 이때 나온 기술이 Persistent Connection이며, 이는 Keep-alive 혹은 connection re-use 라고 불린다.

  • 💡Persistent Connection의 사용법?
    • HTTP1.0 기반에서 Persistent Connection을 사용하고자 하면 클라이언트가 서버로 요청을 할때 요청 message내 헤더(header)에 Connection: keep-alive를 명시한다.

      💥 HTTP1.1 부터는 Connection 헤더를 사용하지 않더라고 모든 요청과 응답은 Persistent Connection를 지원한다. 따라서 HTTP 응답이 완료된 이후에 TCP 연결을 임의적으로 끊어야 하는 경우만 Connection: close 와 같이 사용한다.

profile
열심히 살아야지

0개의 댓글