¿Cómo entender “RESTful API is stateless”?

Escuché que RESTful API should be stateless. All state info should be kept on client side RESTful API should be stateless. All state info should be kept on client side .

Pero cuando estoy emitiendo una llamada jaja desde una página web, noté que siempre se envía una cookie de identificación de sesión al servidor. Con esa ID de sesión, puedo obtener el objeto de sesión en el servidor. Y así puedo get/set some state info in the session .

¿Esto rompe el code of being stateless para la API RESTful?

ADD 1

(El trasfondo de mi pregunta es el siguiente).

Traté de implementar una página de inicio de sesión llamando a una API RESTful para validar el nombre de usuario y la contraseña.

Cada vez que el usuario intenta visitar una página de mi sitio, un servlet filter inicio de sesión verificará la session (aquí es donde se getSession() ) para que el usuario vea si existe información válida de inicio de sesión. De lo contrario, el filtro de inicio de sesión redirigirá al usuario a la página de inicio de sesión.

En la página de inicio de sesión, se realiza una llamada ajax a una API RESTful en el servidor con nombre de usuario y contraseña. Depende del resultado de la devolución de esa API RESTful, el JavaScript de la página decidirá si el usuario debe ingresar a mi sitio.

Entonces, en este escenario, tengo que usar la session .

El código detallado se encuentra aquí: ¿Es esta lógica de inicio de sesión a través del sonido de llamada RESTful?

En las aplicaciones REST, cada solicitud debe contener toda la información necesaria para que el servidor la entienda, en lugar de depender de que el servidor recuerde las solicitudes anteriores.

El almacenamiento del estado de la sesión en el servidor infringe la restricción sin estado de la architecture REST. Por lo tanto, el estado de la sesión debe ser manejado por completo por el cliente.

Sigue leyendo para más detalles.

El estado de la sesión

Las aplicaciones web tradicionales usan sesiones remotas . En este enfoque, el estado de la aplicación se mantiene completamente en el servidor. Vea la siguiente cita de la disertación de Roy T. Fielding:

3.4.6 Sesión remota (RS)

El estilo de sesión remota es una variante del cliente-servidor que intenta minimizar la complejidad, o maximizar la reutilización, de los componentes del cliente en lugar del componente del servidor. Cada cliente inicia una sesión en el servidor y luego invoca una serie de servicios en el servidor, y finalmente sale de la sesión. El estado de la aplicación se mantiene completamente en el servidor. […]

Si bien este enfoque presenta algunas ventajas, reduce la escalabilidad del servidor:

Las ventajas del estilo de sesión remota son que es más fácil mantener centralmente la interfaz en el servidor, reduciendo las preocupaciones sobre inconsistencias en los clientes desplegados cuando se extiende la funcionalidad y mejora la eficiencia si las interacciones hacen uso del contexto de sesión extendida en el servidor. Las desventajas son que reduce la escalabilidad del servidor, debido al estado de la aplicación almacenada, y reduce la visibilidad de las interacciones, ya que un monitor debería conocer el estado completo del servidor.

La restricción sin estado

El estilo arquitectónico REST se define en la parte superior de una serie de restricciones que incluyen apatridia del servidor . Según Fielding, la restricción sin estado REST se define como la siguiente:

5.1.3 Apatrinado

[…] cada solicitud del cliente al servidor debe contener toda la información necesaria para comprender la solicitud y no puede aprovecharse de ningún contexto almacenado en el servidor. Por lo tanto, el estado de la sesión se mantiene completamente en el cliente. […]

Esta restricción induce las propiedades de visibilidad , confiabilidad y escalabilidad :

La visibilidad se mejora porque un sistema de monitoreo no tiene que mirar más allá de un solo dato de solicitud para determinar la naturaleza completa de la solicitud. La confiabilidad se mejora porque facilita la tarea de recuperarse de fallas parciales. La escalabilidad se mejora porque no tener que almacenar el estado entre las solicitudes permite que el componente del servidor libere recursos rápidamente, y simplifica aún más la implementación porque el servidor no tiene que administrar el uso de recursos entre las solicitudes.

Autenticacion y autorizacion

Si el cliente solicita recursos protegidos que requieren autenticación, cada solicitud debe contener todos los datos necesarios para ser debidamente autenticados / autorizados . Vea esta cita del RFC 7235 :

Se supone que la autenticación HTTP no tiene estado: toda la información necesaria para autenticar una solicitud DEBE incluirse en la solicitud, en lugar de depender de que el servidor recuerde las solicitudes anteriores.

Y los datos de autenticación deberían pertenecer al encabezado de Authorization HTTP estándar. Del RFC 7235 :

4.2. Autorización

El campo de encabezado Authorization permite a un agente de usuario autenticarse con un servidor de origen, generalmente, pero no necesariamente, después de recibir una respuesta 401 (no autorizada). Su valor consiste en credenciales que contienen la información de autenticación del agente de usuario para el ámbito del recurso que se solicita. […]

El nombre de este encabezado HTTP es desafortunado porque transporta autenticación en lugar de datos de autorización .

Para la autenticación, puede usar el esquema de Autenticación HTTP básica , que transmite credenciales como pares de nombre de usuario y contraseña, codificados con Base64:

 Authorization: Basic  

Si no desea enviar el nombre de usuario y la contraseña en cada solicitud, el nombre de usuario y la contraseña podrían intercambiarse por un token (como JWT ) que se envía en cada solicitud. JWT puede contener el nombre de usuario, una fecha de vencimiento y cualquier otro metadato que pueda ser relevante para su aplicación:

 Authorization: Bearer  

Qué podría estar mal con tu servidor

Una vez que tenga un identificador de sesión, creo que se está creando una sesión HTTP en algún lugar de su aplicación. Puede estar en su propio código o en el código del marco que está utilizando.

En aplicaciones Java, debe asegurarse de que los siguientes métodos no sean invocados:

  • HttpServletRequest#getSession()
  • HttpServletRequest#getSession(boolean) con true