본문 바로가기
CS/네트워크

HTTP의 무상태성과 비연결성

by yhyuk 2025. 6. 10.
728x90
반응형

상태성 (Stateful)

상태성은 글자 그대로 상태를 유지하는것이다.
상태를 유지하기 때문에 클라이언트와 연결된 서버는 클라이언트 요청에 대한 정보를 계속 갖고 있게 됩니다.
하지만, 이 연결된 서버가 장애가 발생해 작동하지 않는다면 클라이언트는 다른 서버와 다시 연결을 하고 다시 요청을 해야합니다.

예시1)

카페에서 같은 점원A 에게 커피주문

손님: 아메리카노 주세요.
점원A: 2,000원 입니다. (아메리카노)

손님: 2잔 주세요.
점원A: 4,000원 입니다. (아메리카노 2잔)

손님: 카드로 결제할께요.
점원A: 결제 완료 되었습니다. (아메리카노 2잔 카드 결제)

해당 경우에 점원A 는 주문 상태에 대해 기억하고 있습니다.

예시2)

카페에서 점원A + B 에게 커피주문

손님: 아메리카노 주세요.
점원A: 2,000원 입니다. (아메리카노)

손님: 2잔 주세요.
점원B: 어떤걸 2잔 드려요? (2잔)

손님: 카드로 결제할께요.
점원B: 어떤메뉴를 2잔 결제하나요? (2잔, 카드)

이런 상황이 발생할 수 있는 문제가 있기 때문에 Stateful은 확장성에 한계를 갖습니다.
Statefule은 보통 상태 유지가 필요한 로그인 기능 에 브라우저 쿠키와 서버 세션 등을 사용해 유지할 수 있도록 설계합니다.
하지만, Stateful은 확장성에 한계가 있기 때문에 최소한만 사용해야 합니다.

무상태성(Stateless)

말 그대로 상태를 유지하지 않습니다.
상태를 유지 하지 않기 때문에 클라이언트와 연결된 서버에서 장애가 발생했더라도 클라이언트가 요청 정보를 기억하기 때문에 다른 서버를 연결하더라도 문제가 없습니다. (수평확장 유리)
하지만, 클라이언트가 Stateful에 비해 요청을 한번에 보내기 때문에 데이터를 너무 많이 본낸다 는 단점이 있습니다.

예시1)

카페에서 점원A + B + C 에게 커피주문

손님: 아메리카노 주세요.
점원A: 2,000원 입니다. (아메리카노)

손님: 2잔 주세요.
점원B: 4,000원 입니다. (아메리카노 2잔)

손님: 카드로 결제할께요.
점원C: 4,000원 결제 되었습니다. (아메리카노 2잔, 카드)

Stateless는 고객이 주문 정보를 기억하고 있기 때문에 중간에 다른 점원으로 바뀌어도 주문을 할 수 있습니다. 만약, 고객의 요청이 증가하더라도 여러 점원을 투입할 수 있기 때문에 확장성에 용이 합니다.

연결성(Connections)

TCP/IP의 경우 기본적으로 연결을 유지하는 특징을 가지고 있습니다.

연결을 유지하는 경우에는
클라이언트와 서버가 한 번 연결이 되었다면
클라이언트가 요청을 보내지 않더라도 계속 연결을 유지해야합니다.

그렇기 때문에 연결을 유지하는 서버의 자원이 계속 소모되게 됩니다.

비연결성(Connectionless)

HTTP는 기본적으로 연결을 유지하지 않는 모델로 일반적으로 초 단위 이하의 빠른 속도로 응답합니다.
동작 방식은
클라이언트가 서버에 요청을 보내고 서버가 응답을 줬다면
TCP/IP 연결을 끊어 최소한의 자원을 사용해 서버를 유지할 수 있습니다.

하지만, 웹 페이지 로딩 시 여러 자원(image, css, js 등)을 가져오기 위해 매번 새 연결을 맺어야 해서 성능이 저하될 수 있습니다.
이러한 단점들을 극복하기 위해 HTTP/1.1에서는 Keep-Alive를 도입했습니다.

Keep-Aliv
- 클라이언트와 서버 간에 TCP 연결을 한번 수립했다면
- 여러 HTTP 요청/응답을 동일한 TCP 연결을 통해 주고받으며
- 일정 시간(timeout) 동안 추가 요청이 없으면 TCP 연결을 종료

이런 방식으로 현대 웹에서는 성능 향상을 위해 대부분 Keep-Alive 를 사용하여 TCP 연결을 일정 시간 유지합니다.
HTTP/2와 HTTP/3에는 "HTTP 지속 연결"이 더욱 최적화 되어있습니다.

728x90
반응형

댓글