Stateless vs Stateful, 정적자원 vs 동적자원

de_sj_awa·2021년 5월 30일
0
post-custom-banner

1. Stateless와 Stateful

Stateless란 client의 이전 상태를 기록하지 않는 접속이라는 의미이고 Stateful이란 client의 이전 상태를 기록하는 접속이라는 의미이다. 따라서 Stateless는 웹 서버가 사용자의 작업을 기억하고 있지 않고, Stateful은 사용자의 상태를 서버가 기억하고 있다가 활용하게 된다.

1. Stateful Service

Stateful Service는 Stateful한 특성인 1. 세션 정보를 server에 저장 2. 세션 State(상태)에 따른 응답을 만족하도록 설계된 서비스 구조이다.
Stateful Service 구조를 따르는 대표적인 프로토콜로는 TCP가 있다. TCP의 3-way handshaking 과정을 생각해보면 Client와 Server가 SYN와 SYNACK를 주고 받으면서, 양단 간 세션 상태를 established한 '상태'로 만든다. 세션 상태가 established가 되면 client와 server는 데이터를 주고 받을 수 있다. 또한 Server는 Client로부터 송신된 패킷 헤더를 파싱하여 앞으로 수신해야 할 데이터의 크기(window), 데이터의 순서(sequence) 번호 등을 세션에 저장하고 해당 크기의 데이터가 모두 수신될 때까지 client와의 세션을 유지한다.

또한 아래와 같은 Stateful Service 구조를 보면 ClientA의 요청이 로드밸런서를 통해 임의로 Server#1에 전달되면, Server#1에는 ClientA의 세션 정보가 저장된다. 그러나 로드밸런서에 연결된 다른 서버인 Server#2는 해당 ClientA에 대한 정보가 없으므로 만약 재연결시 Server#2에 연결된다면, Server#2는 ClientA와의 세션 인증을 처음부터 다시 해야 한다. 따라서 로드밸런서에는 이러한 불필요한 작업을 없애기 위해 ClientA의 요청이 항상 Server#1이 처리하도록 Sticky Session 기능이 포함되어 있다. (ex) AWS의 NLB, 최근에는 ALB도 이 기능 추가)

2. Stateless Service

Stateless Service 구조는 Stateless한 특성, 1. 세션 정보를 server에 저장하지 않음 2. 세션 State(상태)에 무관한 응답을 만족하도록 설계된 서비스 구조이다. 따라서 Stateless Service 구조는 Server의 응답이 Client와의 세션 상태와 독립적이다. 따라서 Stateless Service 구조에서는 Server는 단순히 요청이 오면 응답을 보내는 역할만 수행하며, 세션 관리는 client에게 책임이 있다. 따라서 이러한 Stateless 구조는 Client와의 세션 정보를 기억할 필요가 없으므로 이를 서버에 저장하지 않는다. 대신 필요에 따라 외부 DB에 저장하여 관리할 수 있다.

대표적인 Stateless 프로토콜로는 UDP와 HTTP 등이 있다. UDP는 TCP와 달리 3-way handshaking 과정과 같은 연결 세션을 인증하는 절차를 수행하지 않고, 클라이언트의 세션 상태에 관계없이 클라이언트 요청에 대한 응답으로 데이터그램을 전송하게 된다.

또한 아래와 같은 Stateless 서비스 구조를 보면 이번에도 ClientA의 요청이 로드밸런서를 통해 Server#1로 전달되었지만, 이 세션 정보를 Server#1에 저장하지 않고 외부 DB에 저장한다. 따라서 ClientA의 요청이 Server#2로 전달되더라도, Server#2는 DB를 통해 ClientA 정보에 접근할 수 있다. 이러한 Stateless Service 구조에서는 ClientA의 요청을 Server#1에만 유지되도록 관리할 필요가 없다.

2. 정적 자원과 동적 자원

1. 정적 자원

  • 웹 브라우저가 늘 같은 응답 데이터를 받아서 화면에 출력하는 URL에 해당하는 자원
  • 이미지파일이나 HTML 파일이 정적 자원에 해당

2. 동적 자원

  • 파일을 바꾸지 않아도 조건에 따라 다른 응답 데이터를 전송하는 URL에 해당하는 자원
  • 시간이나 특정 조건(ex) SNS의 시간에 따른 데이터, 쿼리 문자열)에 따라 응답 데이터가 달라지는 자원

정적자원은 캐싱이 가능하고 동적자원은 캐싱이 불가능하다.

참고

profile
이것저것 관심많은 개발자.
post-custom-banner

0개의 댓글