Recientemente lancé un sitio que utiliza la representación del lado del servidor (con next.js). El sitio tiene una funcionalidad de inicio de sesión en la que, si una cookie de autenticación está presente desde la solicitud de un usuario, generará una vista de inicio de sesión para ese usuario en el servidor y devolverá la vista de inicio de sesión al navegador de los usuarios. Si el usuario no tiene una cookie de autenticación presente, muestra una vista de sesión cerrada en el servidor y la devuelve al navegador de los usuarios.
Actualmente funciona muy bien, pero me encontré con un problema al intentar servir el sitio a través de un CDN. Mi problema es que el CDN almacenará en caché la respuesta de un servidor para acelerarlo, por lo que lo que sucederá es que el primer usuario que ingrese al sitio web en el CDN tendrá su vista de inicio de sesión almacenada en caché y devuelta al navegador. Esto, a su vez, significa que debido a que se almacena en caché, otros usuarios que visitan el sitio también ven a los otros usuarios que iniciaron sesión en lugar de ver los suyos propios, ya que eso es lo que ha almacenado en caché la CDN. No es ideal.
Estoy tratando de pensar cuál sería la mejor manera de resolver este problema. ¿Me encantaría escuchar alguna sugerencia sobre las mejores prácticas para evitar esto?
Una forma en la que he pensado sería potencialmente devolver siempre una solicitud de vista de cierre de sesión en la primera visita a la página y, por lo tanto, la autenticación / inicio de sesión en el lado del cliente y, a partir de ese momento, siempre realizar la autenticación en el servidor. Sin embargo, este método solo funcionaría si next.js solo hace la representación del lado del servidor en la primera solicitud y las solicitudes posteriores hacen toda la representación en el cliente y no estoy seguro de si ese es el caso.
¡Gracias y me encantaría toda la ayuda / sugerencias que pudiera obtener!
ACTUALIZAR
Por lo que puedo deducir hasta ahora de las respuestas, parece que la mejor manera de solucionar esto será ofrecer una vista de sesión desconectada en caché de CDN a cada usuario cuando visite el sitio por primera vez. Luego puedo iniciar sesión manualmente desde la interfaz si hay un token de autenticación presente en sus cookies. Todas las páginas después de la primera página en la que aterrizan tendrán que devolver una vista de inicio de sesión. ¿Es esto posible con Next.js? ¿Sería esta una buena manera de hacerlo? Aquí hay un resumen de estos pasos:
Lo que entiendo de su pregunta es que cuando un usuario inicia sesión, la vista de inicio de sesión se almacena en caché en la CDN y cuando el usuario cierra la sesión, el sitio también se muestra en la vista de inicio de sesión desde la caché de CDN.
Hay algunas soluciones a este problema son las siguientes:
Intente agregar un encabezado de control de caché a sus páginas requeridas de autenticación.
Control de caché: Privado
La directiva de respuesta privada indica que un recurso es específico del usuario; aún se puede almacenar en caché, pero solo en un dispositivo cliente. Por ejemplo, un navegador de escritorio puede almacenar en caché una respuesta de página web marcada como privada, pero no una red de entrega de contenido (CDN).
Para los proxies de almacenamiento en caché que funcionan bien (que debería ser su CDN), hay dos encabezados de respuesta que debe usar:
Establecer este encabezado de respuesta significa que los proxies intermediarios no pueden almacenar en caché la respuesta. (El navegador aún puede almacenarlo en caché, si es apropiado hacerlo. Si desea evitar el almacenamiento en caché, en su lugar, usaría no-store ).
Ver también: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
Este encabezado de respuesta indica que los datos de la respuesta dependen del encabezado de solicitud de Cookie . Es decir, si mi solicitud tiene el encabezado Cookie: asdf y su solicitud tiene el encabezado Cookie: zxcv , entonces las solicitudes se consideran diferentes y se almacenarán en caché de forma independiente. Tenga en cuenta que el uso de este encabezado de respuesta puede afectar drásticamente su almacenamiento en caché si se usan cookies para cualquier cosa en su dominio... y apuesto a que lo son.
Consulte también: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary
Un enfoque alternativo común en estos días es manejar todos los usuarios que enfrentan datos dinámicos del lado del cliente. De esa manera, puede realizar una solicitud a algún servidor API que no tenga CDN de almacenamiento en caché. Luego, la página se llena del lado del cliente con los datos necesarios. Las partes estáticas del sitio se sirven directamente desde la CDN.
Todos los datos de caché y distribución de CDN se basan en el cache header en la respuesta HTTP. Debe considerar estas dos notas simples para obtener el mejor rendimiento sin perder el poder de CDN.
Cache-Control: no-cache .Cache-Control: max-age=31536000 .