HTTP(HyperText Transfer Protocol) 란?
지금 우리가 살고있는 시대는 모든 것이 HTTP이다. HTTP 메시지에 모든 것을 담아 전송한다.
HTML, TEXT, IMAGE, 음성, 영상, 파일, JSON, XML(API) 등 거의 모든 형태의 데이터가 전송이 가능하다. 또한 서버간에 데이터를 주고 받을 때도 대부분 HTTP를 사용한다.
이번 글에서는 HTTP의 주요한 특징 중 무상태(Stateless)에 대해 알아보고자 한다.
클라이언트 서버 구조
일단은 알아야 할 게 클라이언트 서버 구조는 Request Response 구조이다.
클라이언트는 서버에 요청을 보내고, 응답을 대기한다. 서버는 요청에 대한 결과를 만들어서 응답한다.
무상태 프로토콜 - 스테이스리스(Stateless)
서버가 클라이언트의 상태를 보존하지 않는다는 것이다.
예시를 통해 Stateful(상태 유지), Stateless(무상태)의 비교를 해보겠다.
상태유지 - Stateful
→ 고객 : 이 노트북 얼마인가요?
→ 점원 : 100만원 입니다. (노트북 상태 유지)
→ 고객 : 2개 구매하겠습니다.
→ 점원 : 200만원 입니다. 신용카드, 현금 중에 어떤 걸로 구매하시겠어요? (노트북, 2개 상태 유지)
→ 고객 : 신용카드로 구매하겠습니다.
→ 점원 : 200만원 결제 완료되었습니다. (노트북, 2개, 신용카드 상태 유지)
무상태 - Stateless (점원이 중간에 바뀌면?)
→ 고객 : 이 노트북 얼마인가요?
→ 점원A : 100만원 입니다.
→ 고객 : 2개 구매하겠습니다.
→ 점원B : ? 무엇을 2개 구매하겠어요?
→ 고객 : 신용카드로 구매하겠습니다.
→ 점원C : ? 무슨 제품을 몇 개 신용카드로 구매하겠어요?
따라서 무상태는 다음과 같이 요청해야 한다.
→ 고객 : 이 노트북 얼마인가요?
→ 점원A : 100만원 입니다.
→ 고객 : 노트북 2개 구매하겠습니다.
→ 점원B : 노트북 2개는 200만원 입니다. 신용카드, 현금 중에 어떤 걸로 구매하시겠어요?
→ 고객 : 노트북 2개를 신용카드로 구매하겠습니다.
→ 점원C : 200만원 결제 완료되었습니다.
Stateful, Stateless 차이
- 상태 유지 : 중간에 다른 점원으로 바뀌면 안된다. (중간에 다른 점원으로 바뀔 때 상태 정보를 다른 점원에게 미리 알려줘야 한다.)
- 무상태 : 중간에 다른 점원으로 바뀌어도 된다.
- 갑자기 고객이 증가해도 점원을 대거 투입할 수 있다.
- 갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다.
- 무상태는 응답 서버를 쉽게 바꿀 수 있다. → 무한한 서버 증설 가능
그러므로 Stateful은 항상 같은 서버가 유지되어야 한다.
- 중간에 서버에 장애가 발생하면 기능이 고장난다.
반면에 Stateless는 아무 서버나 호출해도 된다.
- 중간에 서버에 장애가 발생해도 기존의 서버는 상태를 보관하지 않았기 때문에 다른 서버로 전달이 된다.
이러한 Stateless는 서버 확장성이 높다. (스케일 아웃)
그러나 Stateless에서도 실무에서는 한계가 있다.
모든 것을 무상태로 설계할 수 있는 경우도 있고 없는 경우도 있다.
예를 들어 로그인이 필요 없는 단순한 서비스 소개 화면은 무상태가 가능하다.
그러나 로그인같은 기능은 상태 유지를 사용해야 한다.
왜냐하면 로그인한 사용자의 경우 로그인 했다는 상태를 서버에 유지하기 때문이다. 일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태를 유지한다.
상태 유지는 최소한만 사용하는 것이 좋다.
실무에서 Stateless로 설계해야 하는 경우가 언제 있을까?
보통 서버 개발자들이 어려워하는 업무를 들여다보면 Stateless를 떠올릴 수 있다.
예를 들어 선착순 이벤트, 명절 KTX 예약, 학과 수업 등록처럼 정말 같은 시간에 딱 맞추어 발생하는 대용량 트래픽에서 Stateless를 이용해 설계해볼 수 있다.
무상태(Stateless)를 기억하자!!
느낀점☞
서버를 유지하는 상태가 상태 유지와 무상태 둘로 나뉜다는 사실을 처음 알게 되었다. 기존에 있던 문제점들을 해결하려고 무상태라는 생각을 떠올린 것 자체가 대단하다고 생각했다. 개발자들이 대용량 트래픽을 어떻게 해결하는지에 대해 정말 얕게라도 알게 되었다. 개발자란 단순히 코드만 작성하는 것이 아니라 이러한 HTTP의 특징처럼 컴퓨터, 인터넷, 네트워크 등 다양한 분야에 대해서 정말 많은 것을 공부해야 하는 직업이란걸 다시금 깨닫게 되었다.
출처 / 참고 : 모든 개발자를 위한 HTTP 웹 기본 지식(인프런) - 김영한 강사님
'HTTP' 카테고리의 다른 글
HTTP 메서드와 속성 - 안전, 멱등, 캐시가능 (0) | 2023.08.13 |
---|---|
인터넷 네트워크 - 인터넷 통신, IP, TCP, UDP, PORT, DNS (0) | 2023.08.12 |