Web Storage: localStorage y sessionStorage | Nicolás Garzón
Web Storage
JavaScript
Copiar localStorage;
sessionStorage; JavaScript
Copiar storage. setItem ( key, value) ;
storage. getItem ( key) ;
storage. removeItem ( key) ;
storage. clear ( ) ;
storage. key ( index) ;
storage. length; getItem devuelve null cuando la clave no existe.
JavaScript
Copiar localStorage. setItem ( "count" , 10 ) ;
localStorage. getItem ( "count" ) ; JavaScript
Copiar localStorage. setItem (
"preferences" ,
JSON . stringify ( preferences) ,
) ; JavaScript
Copiar const rawValue = localStorage. getItem ( "preferences" ) ;
const preferences = rawValue === null
? null
: JSON . parse ( rawValue) ; El resultado debe validarse. El dato puede estar corrupto, desactualizado o haber sido modificado manualmente.
Persiste entre sesiones del navegador hasta que se elimina o el usuario limpia almacenamiento.
Se comparte normalmente entre documentos del mismo origen.
No se envía automáticamente al servidor.
JavaScript
Copiar localStorage. setItem ( "theme" , "dark" ) ; Persistente no significa permanente: el usuario, navegador, políticas de privacidad o límites de almacenamiento pueden eliminarlo.
Está asociado a una sesión de página y a una pestaña o contexto superior.
Sobrevive a recargas dentro de esa pestaña.
Se elimina normalmente al cerrar ese contexto.
Otra pestaña del mismo origen no comparte necesariamente la misma instancia.
JavaScript
Copiar sessionStorage. setItem (
"checkout-step" ,
"delivery" ,
) ; Abrir una pestaña desde otra puede comenzar con una copia inicial en algunos casos, pero después los almacenes evolucionan de forma independiente.
El almacenamiento está separado por origen:
Texto
Copiar scheme + host + portTexto
Copiar https://example.com
http://example.com
https://example.com:8443representan orígenes distintos.
El comportamiento para esquemas como file: no debe utilizarse como contrato portable.
JavaScript
Copiar localStorage. setItem ( key, largeValue) ; La serialización y escritura ocurren en el hilo actual. Operaciones frecuentes o datos grandes pueden bloquear la interfaz.
Usa IndexedDB cuando necesitas:
Mayor volumen.
Datos estructurados.
Consultas.
Escritura asíncrona.
Transacciones.
JavaScript
Copiar try {
localStorage. setItem ( key, value) ;
} catch ( error) {
if ( error. name === "QuotaExceededError" ) {
handleStorageFull ( ) ;
} else {
throw error;
}
} El acceso también puede fallar por políticas del navegador, privacidad, sandboxing o restricciones del usuario.
No dependas de una cifra fija de megabytes como garantía universal.
Cuando otro documento del mismo origen modifica localStorage, otras ventanas pueden recibir:
JavaScript
Copiar window. addEventListener ( "storage" , ( event ) => {
console. log (
event. key,
event. oldValue,
event. newValue,
) ;
} ) ; El documento que realizó el cambio no recibe normalmente su propio evento storage.
sessionStorage tiene un alcance más reducido y sus eventos solo aplican a contextos que comparten esa sesión.
Cada operación es individual.
JavaScript
Copiar const value = Number ( localStorage. getItem ( "count" ) ?? 0 ) ;
localStorage. setItem ( "count" , String ( value + 1 ) ) ; Dos pestañas pueden leer el mismo valor y sobrescribir actualizaciones. Web Storage no ofrece transacciones ni compare-and-swap.
JavaScript
Copiar const storedPreferences = {
version : 2 ,
value : preferences,
} ;
Migra.
Descarta de forma segura.
Conserva defaults.
Registra errores de parseo.
JavaScript
Copiar function readJson ( storage, key, parse ) {
const rawValue = storage. getItem ( key) ;
if ( rawValue === null ) {
return null ;
}
try {
return parse ( JSON . parse ( rawValue) ) ;
} catch {
storage. removeItem ( key) ;
return null ;
}
} La función no solo parsea JSON: valida y define qué hacer con datos inválidos.
Cualquier JavaScript que se ejecute en el origen puede leer Web Storage.
Por eso no es una ubicación segura para:
Contraseñas.
Claves privadas.
Tokens de larga vida cuya exposición permita tomar una cuenta.
Datos sensibles sin una evaluación de riesgo.
Una vulnerabilidad XSS puede acceder al almacenamiento. Cifrar en frontend con una clave disponible al mismo JavaScript no elimina ese riesgo.
No existe una respuesta universal para todas las arquitecturas, pero almacenar tokens de sesión accesibles a JavaScript aumenta el impacto de XSS.
Para sesiones web tradicionales suelen preferirse cookies HttpOnly, Secure y con una política SameSite apropiada, junto con protección CSRF y diseño del servidor.
Web Storage puede guardar estado de UI, pero no debe presentarse como un sistema de autenticación seguro por sí solo.
Preferencia de tema.
Filtros no sensibles.
Borrador de formulario con consentimiento y expiración lógica.
Estado temporal de navegación.
Cache pequeña y recreable.
Fuente de verdad única de información importante.
Datos que necesitan sincronización transaccional.
Grandes colecciones.
Información que debe enviarse automáticamente al servidor.
Secretos.
JavaScript
Copiar const STORAGE_KEY = "preferences:v2" ;
function savePreferences ( preferences ) {
localStorage. setItem (
STORAGE_KEY ,
JSON . stringify ( {
version : 2 ,
value : preferences,
} ) ,
) ;
}
function loadPreferences ( ) {
return readJson (
localStorage,
STORAGE_KEY ,
( data ) => {
if (
data?. version !== 2 ||
typeof data. value?. theme !== "string"
) {
throw new Error ( "Invalid preferences" ) ;
}
return data. value;
} ,
) ;
}
Guardar objetos sin serializarlos.
Hacer JSON.parse(null) sin distinguir ausencia.
Confiar en datos sin validarlos.
Afirmar una cuota fija para todos los navegadores.
Guardar secretos o tokens sensibles por comodidad.
Escribir grandes cantidades en cada evento input.
Usar localStorage como base de datos transaccional.
Confundir sessionStorage con una sesión segura del servidor.
Asumir que persistencia significa que el dato nunca se perderá.
Esperar que el evento storage ocurra en la misma pestaña que escribió.
Web Storage guarda strings y es síncrono.
localStorage persiste; sessionStorage pertenece a una sesión de pestaña.
Ambos están separados por origen.
Los datos pueden desaparecer o el acceso puede fallar.
No existen transacciones para flujos de varias operaciones.
Los cambios entre pestañas pueden observarse mediante storage.
El contenido debe versionarse y validarse.
No es almacenamiento seguro para secretos.
¿Por qué sessionStorage no convierte una sesión de autenticación en segura?
Respuesta Porque cualquier JavaScript ejecutado en la página puede acceder a sus datos. Una vulnerabilidad XSS podría leer el token igual que en localStorage.
Cookies explica el mecanismo que el navegador puede enviar automáticamente en solicitudes HTTP.