En aquellos tiempos, Tim Berners-Lee inventó el HTTP, y lo hizo sin sesión, y vio que aquello era bueno.
Sin embargo, en la actualidad, casi todas las aplicaciones web usan de la sesión HTTP. ¿Qué es lo que ha pasado?.
Aunque realmente no hay nada malo en usar sesión ¿no? … o tal vez sí.
Con el modelo clásico de la web, en el que el navegador hace una petición al servidor, y con la respuesta de éste reemplaza la página actual con la que le envía el servidor, teníamos un problema:
Si la funcionalidad que queremos implica tener varias pantallas ¿dónde podríamos guardar la información que el usuario introduce en las páginas anteriores? También cualquier otra información que queremos tener disponible siempre, sin volver a preguntar al usuario, como su nombre y apellidos, domicilio, etc.
Si no podemos guardarla en el navegador, porque las páginas se cargan y se descargan, entonces las podemos guardar en el servidor. ¿Y cómo hacemos esto esto si HTTP es sin estado? Pues nos inventamos una cosa, que es la cookie de sesión, que guarde un identificador único para esta sesión dentro del servidor. Como cookie que es viajará al servidor en cada petición y éste y sabrá encontrar la información de sesión para ese usuario a partir de este identificador.
Y a partir de aquí, todo se ha ido complicando más y más. ¿que hacemos cuando hay muchos usuarios y la sesión tiene bastante información? pues que la necesidad de memoria del servidor aumente proporcioalmente a este número de usuarios.
Ahora bien, si tenemos un sistema de alta disponiblidad con varios servidores (nodos) que dan servicio para la misma apliación. ¿qué pasa si un servidor se cae? pues que la sesión de los usuarios que estuviesen en ese momento en la memoria se destruirían sin más. ¿cómo solucioamos esto? pues estableciendo un complejo mecanismo de copia de las sesiones de un servidor a otro. De tal manera que si se cae, prestará servicio al usuario otro servidor con sus datos de sesión copiados.
¿Y cómo pasamos el contenido de la sesión de un servidor a otro? pues necesitamos tener un medio para hacerlo, puede ser fichero o base de datos. Ahora bien, cómo hacemos para volcar el contenido de la memoria en disco o en base de datos. Mediante la serialización de la memoria. En Java por ejemplo, es obligatorio que todos los objetos que se guarden en sesión implementen el interfaz Serializable. Si por lo que sea, encuentra un objeto que no lo sea, la serialización no puede hacerse. Si ocurre lo peor, y se cae el nodo, donde está la sesión del usuario, entonces no puede darse servicio.
Recapitulando, el uso de la sesión en el servidor, tiene tres grandes problemas:
- necesita un espacio de memoria directamente proporcional al número de usuarios que están usando la aplicación
- es necesario un mecanismo de serialización de la memoria. Esto implica consumo de recursos para mantener la sesión replicada en todos los nodos.
- a consecuencia de lo anterior, con una sesión web de este tipo, la aplicación no será altamente escalable.
¿qué alternativas hay?
Las modernas aplicaciones web, con uso intensivo de javascript y CSS, dentro del estándar HTML5 pueden perfectamente manejar en el navegador la vista, el controlador y parte del modelo (los objetos que contienen la información de negocio). Y pueden perfectamente basarse en servicios REST stateless en el servidor para intercambiar estos objetos del modelo con el backend, en definitiva con los servicios de negocio y al final en el repositorio de datos.
Peligros
Todo lo que implica el uso de tecnologías en el cliente (en el navegador) tiene un riesgo desde el punto de vista de la seguridad. Al fin y al cabo el código de la aplicación de interfaz de usuario se ejecuta en el lado del cliente (bajo su control) no desde el nuestro. Y un usuario, digamos que seducido por el lado oscuro, podría intentar hackear la aplicación con no muy buenas intenciones.
Evidentemente, en este caso, tendremos que securizar los servicios del servidor, y por supuesto hacer todas las validaciones de formato para evitar los ataques tipo SQL injection, XSS, CSFR, y demás ralea.
Control del flujo
Otro posible motivo para tener sesión en el servidor, es el control del flujo de pantallas. Si necesitamos ejecutar un flujo determinado de pantallas, con un cierto orden, siguiendo un workflow, querremos asegurarnos de que el usuario siga una cierta secuencia de pantallas.
Personalmente, no creo que esto sea necesario al fin y al cabo. Desde siempre, SOA proporciona servicios sin estado, con todo la lógica de negocio de la aplicación. Y para estos servicios, poco les importa la secuencia de pantallas que ha seguido el usuario.
Conclusión
En una aplicación web moderna, donde la vista y el control residen en el navegador, no veo razón para mantener la arquitectura clásica de guardar la sesión el servidor. Son muchos los problemas de rendimiento y escalabilidad que plantea tener el implementar esto.
¿Se os ocurre alguna razón para mantener la sesión en el servidor?
12/07/2012 at 14:58
Mover toda la capa lógica de presentación a la capa física del cliente puede parecer la solución perfecta a nivel teórico, pero me parece que, a nivel práctico, hoy en día seguimos teniendo demasiados inconvenientes. Además de los problemas que ya mencionaste (seguridad, wizards), yo creo que hay otro más grave que es el de transladar una capa que es parte del Middleware al navegador web. Programar en JavaScript, a mí parecer, sigue siendo muy difícil, incluso usando todos esos nuevos frameworks (jQuery, Prototype, ExtJS). Ni hablar que hoy las interfaces de las aplicaciones web tienen que ser Web 2.0 y super User-Friendly con miles de animaciones y atajos como si de una aplicación Desktop se tratara. Sé que todo es cuestión de buen diseño, pero me da la impresión de que con este modelo de clientes tan ricos y a la vez tan inteligentes, corremos mucho riesgo de pegar demasiado la vista con el controlador. Es una opinión; nunca programé con una arquitectura de este tipo. Pienso que sin una capa de presentación stateful en el Middleware, los desarrolladores de aplicaciones web Java se sentirían demasiado perdidos. Hablo desde la ignorancia, pero no veo a JavaScript con la capacidad modularizadora que tiene Java (ni hablar de que es scripting, lenguaje no tipado, interpretado, dependiente de la versión de navegador web, y todas las contras que acarrea todo esto). Si tenemos los controllers en la capa web en el server y guardamos estado en las sesiones, por lo menos nos aseguramos que ese estado y esa lógica la ejecuta un tipo de intérprete único, o en este caso una única máquina virtual (la VM en la que corre el servidor de aplicaciones). ¡Ojo! No digo que sea un modelo perfecto. No digo que no sea un modelo que hay que mejorar. Pero no veo como solución mover todo el estado y la lógica de navegación a los navegadores web. Por lo menos no como la definitiva.
12/07/2012 at 22:11
Hola Adrían:
tienes razón en que el desarrollo de páginas con mucho javascript, con jquery o dojo por ejemplo, es bastante complicado. No hay herramientas avanzadas para hacer esto, más alla de un editor de código con colorines para resaltar la sintaxis. Sin embargo, es una tendencia que ya siguen muchos sitios el pasar gran parte de la vista y el controlador a la parte cliente.
Además, estrictamente hablando, para que la aplicación o tenga sesión no es necesario hacerlo todo en javascript. Siempre se han podido hacer páginas JSP (en el mundo java) que no usan sesión. Lo que necesitamos es un sitio en el navegador donde almacenar los campos que va introduciendo el usuario en las páginas anteriores pero las páginas se pueden seguir haciendo con tags en el servidor.
No obstante, seguro que las herramientas van tener un progreso significativo en los próximos meses. En nuestra empresa, por ejemplo, hemos hecho un editor visual para crear páginas en el que confiamos, y mucho, para reducir el tiempo de desarrollo.
Saludos
28/08/2012 at 14:48
Hola
De hecho en las aplicaciones móviles, tan de moda ahora, todo el control de la parte gráfica la dejas en manos del cliente, puesto que el software corre en el terminal del cliente.
También es cierto que esto hace que los servicios sean mas complejos, para hacerlos mas robusto (validaciones de negocio para ver si esa operación se puede ejecutar porque previamente se haya realizado un paso previo, cuestiones de seguridad)
Eso si programar con JavaScript tiene su aquel…..
06/09/2012 at 16:51
pues lo mejor es usar la sesión para guardar solo la información necesaria del usuario, lo mejor es dejar la demas informacion en cookies siempre que no sea sensible, lo mejor es usar la sesión solo para los datos que realmente son importantes. aunque eso implica más trabajo a la larga es lo mejor debido a que las aplicaciones quedan mas robustas.