Stateful vs Stateless 에 대해 알아보자

Stateful vs Stateless

1. 들어가기 전

HTTP 특징에 대해 공부할 때, HTTP는 상태를 가지지 않는 stateless라는 특징을 가진다고 했다. 즉, 클라이언트와 서버가 첫 번째 통신에서 데이터를 주고받아도 두 번째 통신에서는 앞서 받은 데이터를 유지하지 않는다는 것이다.

stateless와 stateful는 클라이언트와 서버 간의 통신이 어떻게 이루어지는지에 대한 개념이다. 즉, 네트워크 프로토콜을 의마한다.

2. 세션 상태와 세션 정보

stateless와 stateful에 대해 알기 위해서는 세션 상태와 세션 정보에 대해 알아야 한다.

세션 상태란, 클라이언트와 서버가 통신 인증이 된 상태를 의미한다. 인증된 상태에서 데이터 송수신이 가능한다.

세션 정보란, 한 세션 내에서 클라이언트와 서버가 전송할 데이터의 정보를 의미한다. 서버는 세션 유지 시간이 지나거나, 클라이언트가 전송하려했던 데이터를 모두 수신할 때까지 클라이언트와의 세션 상태를 유지한다.

3. Stateful(상태 유지)

개념

Stateful은 세션이 종료될 때까지 클라이언트의 세션 상태와 세션 정보를 저장하는 네트워크 프로토콜이다.

일반적으로 세션 상태와 세션 정보는 쿠키나 서버의 세션 메모리에 저장되어 상태를 유지한다.

TCP

TCP는 서버와 클라이언트 간의 3방향 핸드셰이크 절차를 거친다. 클라이언트와 서버 간 연결 확정 후, 데이터를 주고 받고, 데이터 전송이 끝나면 연결이 종료된다.

3방향 핸드셰이크

  1. 클라이언트는 서버에 SYN 플래그 전송 [SYN_SENT 상태]
  2. 서버는 SYC 요청을 받고, 클라이언트의 요청을 수락하는 SYC/ACK 전송 [SYN_RECEIVED]
  3. 클라이언트는 서베에게 수락 확인으로 ACK 플래그 전송 [수신 받은 서버는 ESTABLISHED 상태]
  4. 세션 상태가 ESTABLISEHD 가 됨으로써, 서버와 클라이언트는 서로 데이터를 주고 받을 수 있는 상태가 됨

TCP는 세션의 상태에 따라 서버의 응답이 달라지기 때문에 stateful이라고 할 수 있다.

장단점

  • 서버는 클라이언트의 세션 상태와 세션 정보를 저장하기 때문에 중간이 연결이 끊겨도 중단된 곳부터 다시 시작할 수 있다.
  • 클라이언트의 세션 정보를 스케일 아웃된 서버에 저장하지 않기 때문에 클라이언트의 세션 상태와 세션 정보를 새 서버에 옮겨주는 작업이 필요하여 확장성이 좋지 않다.

스케일 아웃(scale out)

서버를 여러 대 추가하여 시스템을 확장하는 것

4. Stateless

개념

Stateless는 서버가 클라이언트의 세션 상태 및 세션 정보를 저장하지 않는 네트워크 프로토콜이다. 즉, 요청에 대한 응답만 처리하는 방식이다.

각 통신은 독립적으로 이루어지며 이전 통신와 이후 통신과는 관련이 없다. 또한 클라이언트가 보내려고 했던 데이터가 모두 서버에 수신되었는지 확인하지 않는다.

UDP

UDP에 대해 공부한 내용을 복습해보자면, 속도가 느린 TCP를 보안하기 위해 등장한 프로토콜이다. 신뢰성을 보장하지 않아 속도를 빠르게 개선한 프로토콜이다.

UDP는 전송자와 수신자의 세션 상태와 세션 정보 없이, 요청에 대한 응답만 수행하는 프로토콜이다.

장단점

  • 서버가 클라인언트의 세션 상태와 세션 정보를 저장하지 않기 때문에 확장성이 좋다.
  • 서버가 세션 상태와 세션 정보를 저장하지 않기 때문에 클라이언트 측에서 송신할 데이터의 양이 많아진다.

JWT 토큰

stateless에서 서버는 단순히 응답만 하면 되기 때문에 서버 부하가 현저히 줄어든다. 하지만 로그인과 같이 stateful한 상태가 필요할 때, stateful 상태를 유지하면 서버에 부하가 될 수 있다.

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

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