DevHub Global Solutions | Educativo

LocalStorage y SessionStorage: persistencia de datos

Domina el almacenamiento web con localStorage y sessionStorage para crear experiencias persistentes en el navegador. Aprende técnicas seguras para guardar datos del usuario, preferencias y estado de aplicaciones.
LocalStorage y SessionStorage: persistencia de datos
Diagrama comparativo entre localStorage y sessionStorage

Conceptos Básicos

Diferencias clave entre localStorage y sessionStorage:

// Guardar datos
localStorage.setItem('usuario', JSON.stringify({
  id: 1,
  nombre: 'Carlos',
  email: 'carlos@ejemplo.com'
}));

sessionStorage.setItem('token', 'abc123xyz');

// Leer datos
const usuario = JSON.parse(localStorage.getItem('usuario'));
const token = sessionStorage.getItem('token');

// Eliminar datos
localStorage.removeItem('usuario');

// Limpiar todo
sessionStorage.clear();

Siempre serializa objetos con JSON.stringify() antes de guardar

Característica localStorage sessionStorage
Persistencia Persiste entre sesiones Solo durante la sesión
Alcance Mismo origen, todas pestañas Mismo origen, misma pestaña
Capacidad 5-10MB según navegador 5-10MB según navegador
Acceso window.localStorage window.sessionStorage

Casos de Uso Prácticos

Aplicaciones comunes para almacenamiento web:

Preferencias

Tema, idioma, configuraciones

Carritos

Guardar temporalmente compras

Formularios

Guardar progreso no enviado

Juegos

Progreso, puntuaciones

// Guardar preferencias de usuario
function guardarPreferencias(prefs) {
  localStorage.setItem('preferencias', JSON.stringify(prefs));
}

// Cargar preferencias al inicio
function cargarPreferencias() {
  const prefsGuardadas = localStorage.getItem('preferencias');
  return prefsGuardadas ? JSON.parse(prefsGuardadas) : {};
}

// Autoguardado de formulario
const formulario = document.getElementById('miFormulario');

formulario.addEventListener('input', () => {
  const datosFormulario = new FormData(formulario);
  const datos = Object.fromEntries(datosFormulario);
  sessionStorage.setItem('formularioAutoguardado', JSON.stringify(datos));
});

// Cargar al recargar
window.addEventListener('load', () => {
  const datosGuardados = sessionStorage.getItem('formularioAutoguardado');
  if (datosGuardados) {
    const datos = JSON.parse(datosGuardados);
    // Rellenar formulario...
  }
});

Limitaciones y Seguridad

Consideraciones importantes para uso seguro:

// Patrón seguro para almacenamiento
const safeStorage = {
  set: (key, value) => {
    try {
      localStorage.setItem(key, JSON.stringify(value));
      return true;
    } catch (error) {
      console.error('Error en localStorage:', error);
      return false;
    }
  },
  
  get: (key) => {
    try {
      const item = localStorage.getItem(key);
      return item ? JSON.parse(item) : null;
    } catch (error) {
      console.error('Error al leer localStorage:', error);
      return null;
    }
  }
};

// Uso
safeStorage.set('config', { theme: 'dark' });
const config = safeStorage.get('config');
Limitación Solución/Alternativa
Solo strings Serializar con JSON
Sincrónico Usar en pequeñas cantidades
Sin cifrado No almacenar datos sensibles
Origen único Usar IndexedDB para más capacidad
XSS Vulnerable Sanitizar datos, usar HttpOnly cookies

Eventos y Optimización

Mejores prácticas para almacenamiento eficiente:

// Detectar cambios en storage
window.addEventListener('storage', (event) => {
  console.log(`Cambio en ${event.key}:`, {
    oldValue: event.oldValue,
    newValue: event.newValue,
    url: event.url,
    storageArea: event.storageArea
  });
  
  // Sincronizar entre pestañas
  if (event.key === 'preferencias') {
    actualizarPreferencias(JSON.parse(event.newValue));
  }
});

// Optimizar escrituras
function guardarDatosEficiente(datos) {
  // Agrupar actualizaciones
  const datosActualizados = { ...datosExistente, ...datos };
  
  // Usar debounce para escrituras frecuentes
  clearTimeout(guardarTimeout);
  guardarTimeout = setTimeout(() => {
    localStorage.setItem('datos', JSON.stringify(datosActualizados));
  }, 500);
}
DO

Sobre el autor

Especialista en desarrollo frontend con foco en experiencia de usuario. Ha implementado sistemas de persistencia para aplicaciones con millones de usuarios.