No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Protección de sesiones en el cliente

7/13
Recursos

¿Qué importancia tiene la configuración adecuada en la seguridad web?

La seguridad web es uno de los pilares fundamentales para cualquier aplicación que requiera autenticación de usuarios. OWASP resalta que las brechas de seguridad, en muchos casos, provienen de malas configuraciones o implementaciones parciales. Un ejemplo típico es cuando una sesión se mantiene activa en el frontend, incluso si el usuario ya ha cerrado su sesión en otro navegador o dispositivo, permitiendo el acceso no autorizado a sus datos. En este ejercicio vamos a corregir este error aplicando las herramientas adecuadas.

¿Cómo reparar un hueco de seguridad en Next.js?

Para abordar este problema, utilizamos useSession de NextAuth.js. Este hook permite gestionar las sesiones de los usuarios y actualiza la información automáticamente cuando se produce un cambio de estado en las pestañas. Sin embargo, es vital implementar una lógica de revisión que controle si la sesión se ha invalidado para desconectar al usuario.

import { useSession } from 'next-auth/react';

function Wall() {
  const { data: session } = useSession();

  if (!session) {
    return <AccessDenied />;
  }

  // Resto de la página
}

En este fragmento de código, useSession se encarga de verificar la sesión y, cuando no existe, muestra un componente de acceso denegado en vez del contenido restringido.

¿Cómo integrar un componente reutilizable para proteger recursos?

A medida que nuestras aplicaciones crecen, es ideal tener componentes que manejen la lógica de autenticación de manera eficaz. Crearemos un componente Protected que mostrará su contenido solo si el usuario está autenticado.

import { useSession } from 'next-auth/react';

function Protected({ children }) {
  const { data: session } = useSession();

  if (!session) {
    return <AccessDenied />;
  }

  return children;
}

Este componente permite envolver secciones completas de nuestra aplicación, asegurando que únicamente sean accesibles cuando el usuario tenga una sesión activa.

¿Cómo mejorar la experiencia del usuario con componentes inteligentes?

Mejorar la experiencia del usuario es crucial para mantener el flujo positivo de interacción. Para esto, el componente Protected puede incorporar estados de carga y error. Este manejo asegura que el usuario tenga retroalimentación sobre lo que está sucediendo, ya sea una sesión que se inicia o un problema de conexión.

function Protected({ children }) {
  const { data: session, status } = useSession();

  if (status === "loading") {
    return <Loading />;
  }

  if (!session) {
    return <AccessDenied />;
  }

  return children;
}

Implementar estos componentes otorga a nuestras aplicaciones una capa adicional de seguridad y funcionalidad, reduciendo vulnerabilidades y mejorando la UX. Sigamos fortaleciendo nuestros sistemas de seguridad y aprendiendo mejores prácticas para la gestión de sesiones. ¡La seguridad es una tarea continua y cada mejora cuenta!

Aportes 3

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

  • Desde el servidor se proteje las rutas con una redireccion:

    if (session == null) {
    	return {
     	 redirect: {
        	destination: '/api/auth/signin',
        	permanent: false,
    	  },
     }
    }
    
  • En el cliente se protege usando la verificacion del hook useSession:

    if (session == null) {
       return <AccessDenied />
      }
    
  • Componente reutilizable que verifica la existencia de sesion:

El trabajo del componente Protected se podria hacer tambien de forma automatica desde src/pages/middleware.ts, con la función de Middleware de NextAuth, que me protege bien sea toda la aplicación o solo las páginas que se le indiquen en el matcher. La información está acá: https://next-auth.js.org/configuration/nextjs#middleware

Pero en este aplicaría esta vulnerabilidad ya que se esta manejando todo de manera local por así decirlo, en un caso practico por ejemplo con un token de sesión el servidor me retornaría un 401 y eso dispararía el cierre de sesión del usuario