이전에 인증과 인가를 공부하다가 stateless를 살짝 짚고 넘어간 적이 있다.
HTTP의 통신은 비연결성(Connectionless) 무상태(Stateless)로 이루어지는데도 불구하고, stateful해야하는 '인증'을 어떻게 하는지에 관해서였다.
>이전 포스팅: Bean이란?, 인증과 인가란?
이번엔 stateful과 stateless에 대해 자세히 알아보고자 한다.
stateful한 프로토콜은 요청 간에 상태를 유지한다. 이전 요청에서 발생한 정보나 상태를 계속 유지하고, 이를 다음 요청에서 활용하는 것이다.
즉, 서버에서 클라이언트의 상태 정보를 저장하는 것이다.
예를 들어, 홈페이지에 한번 로그인하여 인증하면 다른 페이지로 이동해도 인증이 풀리지 않고 유지되는 것이 바로 stateful한 것이다. 이런 로그인 정보는 일반적으로 브라우저의 쿠키(Cookie)에 저장되거나, 서버의 세션(Session) 메모리에 저장되어 상태를 유지한다.
stateful의 이러한 단점을 보완하기 위해 클라이언트의 상태 데이터를 따로 캐시 서버(Redis)에 저장하여 이용한다.
나도 프로젝트를 진행하며 이메일 인증을 진행 할 때, redis에 클라이언트의 상태를 임시저장하여 부하를 분산시킨 경험이 있다.
redis의 장점으로는 데이터를 메모리에 캐싱하여 처리하기 때문에 응답시간이 빠르며, 분산 시스템 아키텍처를 지원하여 데이터의 가용성을 높이고, 시스템의 확장성을 향상시킬 수 있다.
Stateless란 네트워크 통신에서 상태를 유지하지 않는 것을 의미한다. 각각의 요청이 서로 독립적으로 처리되며 이전 요청의 정보나 상태를 계속 유지하지 않는다는 것이다.
stateless를 그동안 프로젝트를 진행하며 사용해왔던 HTTP 프로토콜을 예로 들 수 있다.
클라이언트가 서버에 요청을 보내면(request) 서버는 그 요청에 대한 응답을 반환(response)하고 클라이언트와의 연결은 끊어져서, 이후의 요청은 서버가 이전 요청과는 독립적으로 처리되었다는걸 알 수 있다.
서버는 클라이언트의 상태를 추적하지 않고, 각각의 요청을 개별적으로 처리하는 것이다.
stateless 특징을 유지하면서도 로그인 상태 유지를 가능하게 하는 JWT(JSON Web Token)을 사용하여 단점을 보완할 수 있다.
stateless라는 공통점을 가진 HTTP와 REST를 혼동하기 쉽다.
HTTP는 Statelss한 성격을 가진 '프로토콜'이며,
REST는 Stateless한 성격을 가진 '설계 구조'이다.
REST(Representational State Transfer)는 분산 시스템에서 리소스를 정의하고 관리하기 위한 아키텍처 스타일이다. 네트워크 상에서 서비스 간의 통신을 간소화하고, 확장성과 성능을 향상시키는 데 주로 사용한다.
"RESTful"이라는 용어가 바로 "REST" 아키텍처 원칙을 준수하여 설계된 웹 서비스를 나타내는 용어이다.
HTTP를 통해 통신하고, 클라이언트와 서버 간의 상호 작용을 간소화하며, 확장성과 성능을 향상시킬 수 있는 특징이 있다.