HTTP , 비연결성, Stateless, Stateful

Devfrank·2023년 2월 5일
1

HTTP가 무엇인지, HTTP의 특징을 더 자세히 학습하고자 글로 정리한다.
목표: Connectionless(비연결성)가 무엇인지, stateless vs stateful 차이점을 simple Korean으로 설명하기.

🌐 HTTP란? 그리고 특징들

HTTP는 Hyper Text Transfer Protocol의 약자다.

인터넷에서 데이터를 주고 받을 수 있는 프로토콜이다. 즉 인터넷에서 데이터를 받을 때 규칙(약속)이라는 것. 모든 프로그램이 이 규칙에 맞춰 개발해서 서로 정보를 교환할 수 있게 된다.

HTTP는 상태를 가지고 있지 않는 Stateless 프로토콜이며 Method, Path, Version, Headers, Body 등으로 구성된다.


Connectionless(비연결성)

Connectionless(비연결성): 클라이언트와 서버가 연결되어 있지 않다는 것.

  1. 그러면 연결되어 있지 않다면서... 어떻게 통신을 한다는거지?
  • 클라이언트가 어떠한 데이터를 요청하면 서버는 응답을 하고 한번 맺었던 연결을 끊어버린다.
  1. 클라이언트와 서버가 연결되어 있지 않은 이유는 무엇일까?
  • Why? -> 계속해서 리소스가 들어가기 때문이다. 리소스를 아낄 수 있기 때문에 더 많은 연결을 할 수 있는 장점이 있다. 그래서 서버는 연결을 끊어버린다.

    이러한 특징 때문에 매번 어떠한 요청에 대해, 새로운 연결을 해야 하므로 "오버헤드"가 발생한다는 단점도 있다.

오버헤드(overhead): 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말한다.


Stateless(상태없음)

Stateful(상태유지): 상태를 가지고 있다는 의미. 즉, 서버가 클라이언트의 상태를 보존함. 상태를 기억함.

예를 들어서, Pub에 직원이 여러명이 있다고 가정하자.

Staff A: 필요하신거 있으실까요?
프랭크: 발렌타인 17년산 주세요.

Staff B: 필요하신거 있으실까요?
프랭크: 5분전에 시킨거 취소하고, 30년산으로 바꿔주세요. (기억하고 있음)

Staff C: 필요하신거 있으실까요?
프랭크: 10분전에 시킨거 취소할게요. 맥주 한잔 주세요. (기억하고 있음)

(이렇게 상태를 기억하는 방식을 Stateful이라고 한다.)

포스기를 사용하는 것처럼 정보 트래킹(Tracking) 가능하다.

  • 이렇게 되면 직원들은 어떤 직원이 어떤 주문을 받았는지 모두 찾아다녀야 할 것이고,
    이것은 비용이 많이 들게 된다.

Stateful(상태유지)

Stateless(상태없음): 상태를 가지고 있지 않는다는 의미이다. 좀 더 구체적으로 설명하면 서버가 클라이언트의 상태를 가지고 있지 않는 것이다.

Staff A: 필요하신거 있으실까요?
프랭크: 발렌타인 17년산 주세요.

Staff B: 필요하신거 있으실까요?
프랭크: 5분전에 A한테 발렌타인 17년산 시켰는데, 30년산으로 바꿔주세요.

Staff C: 필요하신거 있으실까요?
프랭크: 10분전에 A한테 발렌타인 17년산 시켰는데, 5분전에 30년산으로 바꿨어요. 그냥 취소하고 맥주 한잔 주세요.

  • 상태를 저장하지 않는다면 요청을 할 때, 모든 정보를 준다.
  • 이런 식으로 요청을 할 때 모든 정보를 담아서 요청하기 때문에, 직원들은 쉽게 주문을 파악할 수 있고, 비용을 최소화 할 수 있다.

🌐 Stateless vs Stateful

Stateless (상태없음) 장단점

  • "비용(리소스)"를 줄인다.

  • Stateless 방식은 요청을 할 때, 모든 정보를 각 서버에게 전달해야 하기 때문에 요청이 복잡해질 수 있는 단점이 있다.

  • 반면에, 요청을 한번에 주기 때문에 많은 서버를 둬도 큰 부담이 안된다는 장점이 있다.

  • 대량의 트래픽 발생 시에도 서버 확장을 통해 대처를 수월하게 할 수 있다는 장점도 있다. (stateful과 달리 서버가 바뀌어서도 정확한 응답에 문제가 없으니까). Stateless는 서버의 확장성에 용이하다.

  • 이벤트 소개 페이지처럼 아무 정보를 담을 필요가 없는 페이지는 상태없음으로 만들면 좋다.

  • 하지만 로그인처럼 유저가 로그인하고 있다는 상태를 유지해야 하는 서비스는 상태를 유지하지 않으면 로그인이 풀려버린다.

  • 따라서 모든 것을 상태없음으로 설계할 수 없다. 어쩔 수 없는 경우에만 상태 유지를 최소한으로 사용하는 것이 베스트이다.

Stateful (상태유지) 장단점

  • 클라이언트와 서버 간에 송수신을 하며 단계별 과정을 진행하는데 있어, 서버에서 클라이언트가 이전 단계에서 제공한 값을 저장하고 다음 단계에서도 저장한 상태이다.

  • 대표적으로 홈페이지에서 한번 로그인을 하면 페이지를 이동해도 로그인이 풀리지않고 계속 유지되는 것이 바로 서버가 클라이언트의 상태를 유지(기억)하고 있으니까 가능한 것이다.

  • 클라이언트의 정보를 기억한다라는 말은 어딘가에 정보를 저장하고 통신할때마다 읽는다는 뜻이다.

  • 이러한 정보들은 일반적으로 브라우저의 쿠키(Cookie)에 저장되거나, 서버의 세션(Session) 메모리에 저장되어 상태를 유지하게 된다.

  • stateful의 문제점은 해당 서버가 멈추거나 여러 이유로 해당 서버가 못쓰게 되어 다른 서버를 사용해야 할때 발생한다. 왜냐하면 새로운 서버에서는 이전 서버에서 가지고 있던 상태값들을 가지고 있지 않기 때문이다.

  • 클라이언트 상태들을 들고 있으니 용량 한계가 존재한다.


🌐 Stateless 또 다른 특징들

Stateless 와 HTTP / REST

반면 REST는 프로토콜이라기 보단 구조(Architecture)에 가깝다.
즉, REST는 HTTP 프로토콜 상에 구현된 Resource Oriented Architecture (ROA) 설계 구조다.
따라서, HTTP와 REST 모두 Stateless한 성격을 가진다.

HTTP는 Statelss한 성격을 가진 '프로토콜'
REST는 Stateless한 성격을 가진 '설계 구조'


Stateless 와 토큰(Token)

Stateless(상태없음) 특징으로, 클라이언트와 서버간의 통신에 필요한 모든 상태 정보들은 클라이언트에서 가지고 있다가 서버와 통신할때 데이터를 실어 보내는 것이다.

그래서 서버는 단순히 받아서 응답만 해주기 때문에 서버에 대한 부하가 현저히 줄어든다.

하지만 로그인 유지와 같은 상태는 싫으나 좋으나 stateful한 상태를 사용하여야 하는데, 그러면 서버에 부하가 생기고 좀 그렇다.

그래서 stateless 특징을 유지하면서도 로그인 상태 유지를 가능하게 하는 기술이 바로 JWT 토큰이다.

토큰은 클라이언트가 암호화된 로그인 정보들을 지니고 있다가 서버에 통신할때 넘겨줌으로써 내가 로그인 됐음을 인증하는 방식이다.

따라서 특별한 일이 없다면, Stateless - 무상태(상태없음)를 지향해야하며 정말 필요한 경우에만 상태 유지를 해야한다.

Reference

profile
피드백 문화를 지향합니다. Anytime please! 🙌🏻

0개의 댓글