La capacidad de estado no es necesariamente algo malo, pero debe comprender la diferencia entre las aplicaciones con estado y sin estado. En resumen, las aplicaciones con estado mantienen información sobre la sesión actual, y las aplicaciones sin estado no. La información almacenada permanentemente como parte de una cuenta de usuario puede o no almacenarse en una sesión, pero el almacenamiento de información relacionada con una cuenta de usuario no hace que la aplicación tenga estado. La capacidad de estado requiere que el servidor mantenga información sobre la sesión del usuario actual más allá de lo que mantiene el navegador del cliente. Por ejemplo, un cliente podría autenticarse y recibir una cookie JSESSIONID, que luego envía al servidor con cada solicitud. Si el servidor comienza a almacenar cosas en el alcance de la sesión de la aplicación en función de este JSESSIONID, se vuelve con estado.
Apatridia
Por apátrida, queremos decir que el servidor y el cliente no mantienen información actual sobre la sesión del usuario. El cliente y el servidor pueden usar alguna forma de token para proporcionar autenticación entre solicitudes, pero no se almacena ninguna otra información actual. Un caso de uso típico para una solución de este tipo podría ser un sitio de noticias donde la mayoría de los usuarios (nuevos consumidores) consumen información pero no producen información que regrese al sitio. En tales casos, el sitio no necesita mantener ninguna información sobre la sesión de usuario actual. Tenga en cuenta que el sitio aún puede usar cookies para identificar al usuario y almacenar información sobre el uso del sitio por parte de ese usuario, pero aún puede considerarse como apátrida ya que todo lo registrado podría ser transaccional, por ejemplo, en qué enlace hizo clic el usuario, que podría registrar el servidor, pero no se mantiene en una sesión de usuario.
Statefulness en el servidor
En el servidor, una aplicación con estado guarda información de estado sobre los usuarios actuales. Este enfoque generalmente implica el uso de cookies para identificar el sistema del usuario para que el estado se pueda mantener en el servidor entre las solicitudes. Las sesiones pueden o no ser autenticadas, dependiendo del contexto de la aplicación. Las aplicaciones de servidor con estado ofrecen la ventaja de almacenar en caché la información del estado del usuario en el servidor, acelerando las búsquedas y el tiempo de respuesta de la página. En el lado negativo, el almacenamiento de información en el alcance de la sesión es costoso y, a escala, requiere muchos recursos. También crea un potencial vector de ataque para que los hackers intenten secuestrar identificadores de sesión y robar sesiones de usuario. Las aplicaciones de servidor con estado también tienen el desafío de proteger las sesiones de los usuarios contra interrupciones inesperadas del servicio, por ejemplo, una falla del servidor.
Statefulness en el cliente
Mediante el uso de JavaScript y tecnologías de navegador modernas como sessionStorage, la aplicación ahora puede almacenar fácilmente información de estado sobre una sesión de usuario en el dispositivo de ese usuario. En general, la aplicación aún puede considerarse con estado, pero el trabajo de mantener el estado se ha trasladado al cliente. Este enfoque tiene una gran ventaja (para el responsable del mantenimiento de la aplicación web) sobre el mantenimiento del estado en el servidor, ya que cada usuario mantiene, en efecto, su propio estado y no supone una carga para la infraestructura del servidor. A escala web, ese tipo de elección arquitectónica tiene enormes repercusiones para los costos de hardware y electricidad. Literalmente, podría costar millones de dólares al año mantener el estado en el servidor. Pasar a un sistema que mantenga el estado del cliente podría ahorrar millones de dólares al año.
Tokens v. Cookies
Las cookies actúan como identificadores para los dispositivos / navegadores del cliente. Se pueden usar para almacenar todo tipo de cosas, pero generalmente almacenan algún tipo de identificador, como CFID / CFTOKEN en aplicaciones CFML. Las cookies se pueden configurar para que vivan en el navegador del usuario durante mucho tiempo, lo que permite hacer cosas como mantener la autenticación en una aplicación entre las sesiones del navegador. Las cookies también se pueden configurar en memoria solamente para que caduquen cuando un usuario cierra el navegador.
Los tokens son generalmente algún tipo de información de identificación sobre el usuario que se genera en el servidor (utilizando cifrado para codificar la información), se pasa al cliente y se devuelve al servidor con la solicitud posterior. Se pueden pasar en el encabezado de la solicitud y la respuesta, que es un patrón común en aplicaciones de una sola página. Idealmente, cada solicitud / respuesta da como resultado la generación de un nuevo token, por lo que los tokens no pueden ser interceptados y utilizados más tarde por un atacante.
Aplicaciones de página única y estado del cliente
Con los SPA, la información de estado se carga en el navegador del cliente y se mantiene allí. Cuando el estado cambia, por ejemplo, publica una actualización en su cuenta de redes sociales, el cliente transmite esa nueva transacción al servidor. En este caso, el servidor guarda esa actualización en un almacén de datos persistente como una base de datos y retransmite cualquier información al cliente que necesita sincronizar con el servidor en función de la actualización (por ejemplo, una ID para la actualización).
Tenga en cuenta que este patrón de estado de almacenamiento en el cliente ofrece ventajas para las experiencias en línea / fuera de línea, ya que puede desconectarse del servidor mientras aún tiene una aplicación algo utilizable. Twitter es un buen ejemplo de este caso, donde puedes revisar cualquier cosa cargada del lado del cliente en tu feed de Twitter, incluso si estás desconectado de la aplicación del servidor de Twitter. Este patrón también crea complejidad en la sincronización entre el servidor y el cliente, que es un tema completamente propio. Las complejidades de la solución son una compensación para poder mantener el estado del cliente.
La capacidad de representación en el cliente hace que las aplicaciones web se sientan y se comporten más como las aplicaciones de escritorio tradicionales. A diferencia de las aplicaciones de escritorio, normalmente no tendrá toda la información de su cuenta cargada en su sesión de cliente en un navegador. Hacerlo en muchos casos sería poco práctico y produciría malas experiencias. ¿Te imaginas intentar cargar un cuadro completo de Gmail en el navegador? En cambio, el cliente mantiene información como qué etiqueta / carpeta está mirando y en qué parte de la lista de correos electrónicos de esa carpeta está mirando. Equilibrar qué información de estado mantener y qué solicitar según sea necesario es otro desafío de ingeniería de este patrón, y nuevamente, representa una compensación entre la practicidad y la provisión de buenas experiencias de usuario.
Carritos de compras y similares
En cuanto a detalles como los carritos de compras, realmente depende de la solución. Un carrito de compras puede almacenarse en una base de datos en el servidor, puede almacenarse solo en el alcance de la sesión en el servidor, o incluso puede almacenarse en el cliente. Amazon tiene carritos de compra persistentes para usuarios registrados y carritos "temporales" para usuarios anónimos, aunque estos carritos son persistentes en cierta medida.
Cuando se habla de algo como Google, que en realidad es un conjunto de aplicaciones diferentes que viven bajo la misma marca, probablemente no comparten una arquitectura común, y cada una está construida de la manera que mejor satisfaga las necesidades de sus usuarios. Si desea aprender cómo se construye un sitio, abra las herramientas de desarrollador en su navegador y mírelo. Compruebe si hay cookies, observe el tráfico de la red y vea cómo se ejecuta.
Lo siento si esta respuesta divaga un poco, pero la afirmación es un tema complejo.