Coding Planet
Stateful과 Stateless의 차이 - 세션 관리 본문
JWT(Jason Web Token)을 이용한 로그인 방식을 공부하던 도 중 stateless 통신의 장점에 대한 포스트를 읽게되었다. Stateful과 Stateless에 대한 개괄적인 이해만 있는 상태여서 이번 기회에 명확하게 이해하고 싶어졌다.
Stateless와 Stateful은 주로 웹 서버의 세션 관리 방식을 설명하는 데 사용되는 두 가지 개념이다. 이들은 서버가 클라이언트의 상태(예: 사용자의 인증 상태, 이전의 상호작용)를 어떻게 추적하고 관리하는지에 대한 차이를 나타낸다.
| Stateful(유상태)
상태 유지라함은 클라이언트와 서버 관계에서 서버가 클라이언트이 상태를 보존함을 의미한다. 클라이언트와 서버 사이에서 송수신이 일어날 때 서버에서 클라이언트가 이전 단계에서 제공한 값을 저장하고 다음 단계에서도 저장한 상태이다. 유상태 프로토콜에서는 서버가 클라이언트의 상태 정보를 세션 혹은 쿠키를 통해 유지한다. 이로 인해 서버는 클라이언트의 이전 상태를 알고 있으므로 더 풍부한 상호작용이 가능하게 된다. 대표적으로 홈페이지에서 로그인을 하면 페이지를 이동해도 로그인이 풀리지 않고 계속 유지되는 것이 유상태 통신이다.
- 작동 방식 : 클라이언트는 최초 요청 시 서버에 상태 정보를 전달하고, 서버는 이 정보를 세션에 저장한다. 이후 요청에서는 서버가 이 세션 정보를 참조하여 클라이언트를 기억한다.
- 장점 : 클라이언트는 모든 요청에 모든 정보를 전송할 필요가 없어, 네트워크 트래픽이 줄어들고 사용자의 상태 정보를 기반으로 더 맞춤화된 상호작용이 가능하다.
- 단점 : 서버가 각 클라이언트의 상태를 유지해야 하므로 더 많은 리소스를 사용한다. 또한 상태 정보를 유지해야하므로, 서버의 부하가 증가하고 시스템 확장이 어려워질 수 있다. 그리고 만일 해당 서버가 작동이 불가능해진다면 새로운 서버는 이전 서버에서 가지고 있던 상태값을 가지고 있지 않기 때문에 문제가 발생할 수 있다. 따라서 현업에서는 이러한 클라이언트의 상태 데이터를 따로 캐시 서버(Redis)에 저장하여 이용한다.
- 예시 : TCP 통신
| Stateless(무상태)
무상태 프로토콜에서는 서버가 클라이언트의 상태 정보를 유지하지 않는다. 각 요청은 독립적이며, 이전의 요청이나 상태에 대한 정보를 포함하지 않는다. 따라서 Stateless 구조에서는 서버는 단순히 요청이 오면 응답을 보내는 역할만을 수행하며, 상태 관리는 전적으로 클라이언트에게 책임이 있다.
- 작동방식 : 클라이언트는 모든 요청에 필요한 정보(예:사용자 인증 정보)를 매번 전송한다. 서버는 이 정보를 기반으로 요청을 처리하고 응답한다.
- 장점 : 서버가 클라리언트의 상태를 추적할 필요가 없기 때문에 리소스 요구 사항이 적고 서버 부하가 적다(서버확장가능). 또한 각 요청이 독립적이므로 시스템의 복잡성이 감소한다. 유상태와는 다르게 서버가 바뀐다고 해도 요청은 독립적이기 때문에 문제가 없다
- 단점 : 클라이언트가 각 요청에 필요한 모든 정보를 포함해야하므로 네트워크 오버헤드가 증가할 수 있다.
- 예시 : UDP, HTTP, JWT
| Stateless(무상태)와 JWT
이전 설명에서 언급한 것처럼 로그인의 경우 로그인 상태가 여러 페이지에 걸쳐 유지되어야 하기 때문에 Stateful이 필수적이다. 하지만 Stateless 상태로도 로그인을 유지할 수 있는데 대표적 기술이 JWT(Jason Web Token)이다. 토큰은 클라이언트측에 저장되고 각 요청에 포함되어 서버로 전송된다. 이 토큰은 사용자의 인증 정보를 담고 있으므로 서버는 상태 유지를 할 필요 없이 각 요청을 독립적으로 처리할 수 있다.
| 참고
https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Stateful-Stateless-%EC%A0%95%EB%A6%AC
'CS' 카테고리의 다른 글
[운영체제] 1. 운영체제란(운영체제의 목표, 분류 방식) (1) | 2024.01.19 |
---|---|
HTTP Reponse/Request 구조 - start line, headers, body (1) | 2024.01.02 |
플러그인(Plugin)이란? (2) | 2023.05.18 |
Thread(스레드)란? Java에서의 Thread 클래스 (0) | 2023.05.04 |
동기화(同期化, synchronization)란? (0) | 2023.05.04 |