Introduzione: Che cos’è localStorage e a cosa serve
Nel vasto panorama dello sviluppo web, uno dei compiti più frequenti è la gestione dei dati lato client, in particolare quando si tratta di rendere l’esperienza utente più fluida e personalizzata. Alcuni anni fa, prima dell’avvento di tecnologie più moderne, l’unico modo per conservare informazioni tra una pagina e l’altra (o tra una sessione e l’altra) era l’utilizzo dei cookie. I cookie, infatti, sono file di testo che possono conservare dati sul browser dell’utente, ma come ogni tecnologia, hanno dei limiti.
Con l’arrivo di HTML5, è stato introdotto il concetto di Web Storage, che include due principali oggetti per la memorizzazione di dati lato client: sessionStorage e localStorage. Mentre i cookie vengono inviati al server ad ogni richiesta (andando a gravare sulla larghezza di banda e sulla performance generale), il Web Storage rimane esclusivamente sul client, fornendo un metodo di lettura e scrittura veloce e flessibile. In questa nuova realtà, localStorage è diventato un vero e proprio “game changer”.
In questo articolo esploreremo a fondo:
- Le differenze tra cookie, localStorage e sessionStorage
- I vantaggi principali di localStorage (tra cui velocità e capienza)
- Esempi pratici di utilizzo (dark mode, form temporanei, preferenze utente)
- Aspetti di sicurezza, limiti e best practice
- Quando evitare localStorage e perché
- Una checklist rapida delle situazioni ideali per usare localStorage
L’obiettivo è farti capire non solo come usare localStorage in JavaScript, ma soprattutto quando usarlo in modo efficace e sicuro, distinguendo i casi d’uso in cui la scelta di localStorage è ottimale e quando invece conviene puntare su altre soluzioni.
Differenze principali tra cookie, localStorage e sessionStorage
Quando si parla di persistenza dei dati lato client, spesso si fa confusione tra i vari approcci possibili. Ecco quindi un confronto chiaro tra queste tre tecnologie:
- Cookie
- Capienza: in genere limitata a circa 4 KB per singolo cookie, anche se il limite varia leggermente da browser a browser.
- Scopo: ideati inizialmente per conservare informazioni di tracciamento e sessioni di login. Oggi, vengono usati in parte anche per questioni di analisi, tracciamento marketing (vedi cookie di terze parti), e salvataggio di preferenze di base.
- Inoltro al server: ogni volta che il browser effettua una richiesta HTTP al server, i cookie associati al dominio vengono inviati, aumentando il payload della richiesta e, di conseguenza, consumando banda.
- Scadenza: i cookie possono essere di sessione (si cancellano alla chiusura del browser) o persistenti (scadenza impostata dal server o dal client).
- Sicurezza: possono essere protetti con attributi come
HttpOnly
(per evitare l’accesso via JavaScript) oSecure
(trasmissione protetta solo su HTTPS), ma sono comunque inclini ad attacchi come session hijacking e XSS se non gestiti correttamente.
- sessionStorage
- Capienza: simile a localStorage (spesso diversi MB), ma varia leggermente in base al browser.
- Scopo: memorizzare dati relativi a una singola sessione di navigazione. Appena la finestra o la tab del browser viene chiusa, i dati vengono eliminati.
- Inoltro al server: i dati non vengono inviati al server ad ogni richiesta. Rimangono sul client.
- Scadenza: i dati rimangono finché la tab è aperta. Se chiudi la tab o il browser, i dati spariscono.
- Sicurezza: come localStorage, non vengono inviati al server, riducendo possibili falle di sicurezza. Tuttavia, se il sito è vulnerabile a XSS (Cross-Site Scripting), i dati in sessionStorage possono essere letti e manipolati da attaccanti.
- localStorage
- Capienza: in genere offre uno spazio di archiviazione che va da 2 MB a 10 MB (o più), dipende dal browser. Comunque è molto maggiore rispetto a 4 KB dei cookie.
- Scopo: memorizzazione di dati su base per-browser e per-dominio, senza scadenza definita di default. Permette di salvare preferenze, impostazioni e quant’altro, garantendo che, anche dopo la chiusura del browser, i dati siano ancora disponibili alla riapertura.
- Inoltro al server: non viene inviato nulla al server ad ogni richiesta, riducendo il carico di rete. Tutta la lettura e scrittura avviene localmente tramite JavaScript.
- Scadenza: i dati persistono fino a quando non vengono esplicitamente rimossi dal codice JavaScript o manualmente dall’utente (ad esempio, pulendo la cache del browser).
- Sicurezza: come sessionStorage, non si inviano dati al server. Resta vulnerabile a potenziali attacchi XSS se il sito non è ben protetto.
Differenza localStorage e cookie in breve
- Spazio di archiviazione: localStorage ha una capienza molto maggiore rispetto ai cookie.
- Performance: i cookie appesantiscono le richieste HTTP, mentre localStorage no.
- Persistenza: i cookie possono avere una scadenza, localStorage rimane finché non viene rimosso.
- Uso pratico: localStorage è ottimo per salvare impostazioni e preferenze di un’app web “offline”, i cookie sono fondamentali per gestire l’autenticazione o per conservare informazioni che il server deve ricevere a ogni richiesta.
Vantaggi di localStorage (velocità, dimensione, accesso client-side)
Perché localStorage è considerato una soluzione superiore ai cookie in molti scenari? Ecco una panoramica dei suoi principali vantaggi.
- Maggiore capacità
Se i cookie mettono a disposizione pochi KB di spazio, localStorage porta la memorizzazione locale a livelli di qualche MB. Questo significa poter archiviare dati più corposi senza dover ricorrere a server esterni o a database. In certe applicazioni, soprattutto quelle che necessitano di funzionare anche offline, disporre di più spazio in locale è cruciale. - Velocità
Poiché localStorage non viene incluso in ogni singola richiesta HTTP, il caricamento delle pagine risulta più leggero e veloce. Immagina di avere un e-commerce con centinaia di richieste al server al giorno per utente: se utilizzi cookie di grandi dimensioni, stai aumentando la dimensione di ogni richiesta, con effetti negativi sulle performance. - Semplicità di utilizzo con JavaScript
L’API di localStorage è estremamente intuitiva. Hai a disposizione metodi comesetItem()
,getItem()
eremoveItem()
. Per esempio: javascriptCopiaModifica// Questo snippet di codice NON è incluso nel conteggio parole localStorage.setItem('chiave', 'valore'); const datoSalvato = localStorage.getItem('chiave'); console.log(datoSalvato); // Stampa "valore"
Non sono necessarie librerie esterne, configurazioni particolari o manipolazioni di stringhe come spesso avviene con i cookie. - Persistenza senza scadenza
A differenza dei cookie (che hanno spesso una data di scadenza, dopo la quale vengono eliminati), i dati in localStorage rimangono fino a quando non vengono rimossi manualmente. Questo è molto utile per conservare preferenze a lungo termine o per gestire funzioni di “ricorda i miei dati” in moduli complessi. - Riduzione del carico sul server
Non inoltrando i dati ad ogni richiesta, localStorage riduce la quantità di informazioni che il server deve elaborare, con benefici in termini di performance complessive. - Maggiore controllo sulle informazioni
Con localStorage, hai un controllo più diretto sulle informazioni: decidi tu quando scrivere, leggere o cancellare. Non c’è il rischio che un header HTTP errato possa sovrascrivere un cookie, né c’è la necessità di specificare domini e path di validità.
Esempi pratici di utilizzo (salvare preferenze, dark mode, form temporanei)
Uno dei modi migliori per capire la potenza di localStorage è vederlo in azione con esempi concreti.
3.1 Salvare preferenze utente
Immagina un’applicazione web dove l’utente può scegliere la lingua preferita (italiano, inglese, spagnolo, ecc.). Grazie a localStorage:
- Puoi salvare la lingua selezionata in locale.
- Alla successiva apertura del sito, la pagina viene già caricata in quella lingua, senza dover chiedere nuovamente la preferenza.
Esempio di codice (non conteggiato nella lunghezza del testo):
// Salvataggio lingua
function salvaLingua(lingua) {
localStorage.setItem('linguaPreferita', lingua);
}
// Lettura lingua
function getLingua() {
return localStorage.getItem('linguaPreferita') || 'it'; // default italiano
}
3.2 Dark mode
Oggi molte applicazioni includono un “Dark Mode” (o tema scuro) per migliorare la leggibilità di notte e per motivi di stile. Con localStorage, mantenere la scelta dell’utente è semplice:
- L’utente attiva la modalità scura con un toggle (interruttore).
- Scrivi in localStorage il valore
temaScelto = "dark"
otemaScelto = "light"
. - Al caricamento della pagina, leggi
temaScelto
e applichi dinamicamente le classi CSS per il tema.
// Esempio di gestione Dark Mode
const toggleDarkMode = document.getElementById('darkModeToggle');
toggleDarkMode.addEventListener('click', () => {
document.body.classList.toggle('dark-mode');
const isDarkMode = document.body.classList.contains('dark-mode');
localStorage.setItem('darkMode', isDarkMode ? 'enabled' : 'disabled');
});
// Al caricamento
window.addEventListener('load', () => {
const darkStatus = localStorage.getItem('darkMode');
if (darkStatus === 'enabled') {
document.body.classList.add('dark-mode');
}
});
3.3 Form temporanei
Potrebbe capitare di voler salvare i dati di un form in modo temporaneo, soprattutto se l’utente rischia di perdere tutto se ricarica la pagina o chiude accidentalmente la tab. Ad esempio, in un form di contatto con molti campi, potresti:
- Salvare i campi ogni tot secondi o ad ogni modifica.
- Se l’utente lascia la pagina e poi ritorna, i dati compilati in precedenza sono ancora lì.
// Ogni volta che l'utente modifica un campo, salviamo in localStorage
const formFields = document.querySelectorAll('.campoForm');
formFields.forEach(field => {
field.addEventListener('input', () => {
localStorage.setItem(field.name, field.value);
});
});
// Al caricamento della pagina, ripristiniamo i valori
formFields.forEach(field => {
const savedValue = localStorage.getItem(field.name);
if (savedValue) {
field.value = savedValue;
}
});
Sicurezza, limiti e best practice
4.1 Sicurezza localStorage
Anche se localStorage non viene inviato al server, i dati che contiene non sono crittografati di default. Significa che:
- Se un malintenzionato riesce ad eseguire JavaScript iniettato (XSS) sulla pagina, potrà leggere e modificare i dati presenti in localStorage.
- Non è consigliabile conservare dati sensibili come password in localStorage. In caso di XSS, i dati potrebbero essere esfiltrati.
- L’unico modo per proteggere i dati in localStorage è assicurarsi che l’applicazione sia immune da XSS e, se necessario, applicare tecniche di crittografia prima di scrivere i valori. Tuttavia, anche in quel caso, la chiave di crittografia dovrebbe stare da qualche parte nel codice JavaScript (quindi potenzialmente accessibile).
4.2 Limiti dimensionali e restrizioni
Nonostante i diversi MB disponibili, esistono dei limiti:
- Ogni browser ha un limite massimo (in genere tra 2.5 MB e 10 MB).
- Se un utente disabilita il JavaScript o utilizza estensioni che bloccano l’accesso al Web Storage, localStorage potrebbe non funzionare correttamente.
- In alcuni contesti (ad esempio estensioni browser o incognito mode con restrizioni), localStorage può essere bloccato o resettato di frequente.
4.3 Best practice
- Non archiviare dati critici: come token di accesso, sessioni, password. Se devi farlo, valuta di usare HTTP-only cookies o altri sistemi di sicurezza.
- Rimani minimalista: salva solo il necessario. Evita di occupare spazio con dati superflui.
- Attenzione a JSON: in localStorage ogni valore è una stringa. Se devi salvare oggetti complessi, serializzali in JSON e deserializzali alla lettura.
- Gestione degli errori: usa
try/catch
quando accedi a localStorage, per gestire eventuali eccezioni (ad esempio, quando lo spazio è pieno). - Crittografia opzionale: se proprio devi memorizzare dati sensibili, valuta una crittografia lato client (con tutti i limiti di cui abbiamo parlato).
Quando NON usare localStorage e cosa usare al posto
Nonostante i numerosi vantaggi, localStorage non è sempre la scelta giusta. Ecco i casi in cui dovresti evitarlo:
- Gestione di sessioni di login
È generalmente sconsigliato gestire token di autenticazione in localStorage a causa delle vulnerabilità XSS. Molti framework moderni preferiscono utilizzare i cookie con l’attributoHttpOnly
. Oppure, se devi usare un token JWT, è consigliabile memorizzarlo in una session cookie sicura (HttpOnly e Secure). - Dati di grandi dimensioni
Se hai bisogno di memorizzare una quantità enorme di dati (superiore a qualche MB), localStorage non è la soluzione. Potrebbe servire un database lato client più sofisticato come IndexedDB, che offre più flessibilità e spazio. - Informazioni soggette a scadenza rapida
Se i dati cambiano frequentemente o devono scadere in tempi brevi, usare localStorage potrebbe crearti confusione, perché i dati persistono finché non li rimuovi manualmente. In tal caso, potresti preferire i cookie di sessione o i sessionStorage. - Sicurezza massima
Se hai bisogno di garantire la massima sicurezza dei dati, localStorage non è l’opzione migliore, a meno che tu non disponga di un sistema server-side che gestisca opportunamente la crittografia e la validazione. In molti scenari, i cookie HTTP-only, combinati con un’architettura sicura lato server, restano la soluzione più robusta.
Cosa usare al posto di localStorage?
- Cookie HTTP-only: per dati sensibili, autenticazione, sessioni.
- sessionStorage: per dati che devono persistere solo durante la sessione.
- IndexedDB: per grosse quantità di dati strutturati, con query complesse.
- Cache di Service Worker: se vuoi gestire contenuti offline in modo avanzato, le PWA (Progressive Web App) spesso usano la cache dei Service Worker per conservare asset e dati richiesti.
Conclusione + checklist delle situazioni ideali per usare localStorage
La tecnologia localStorage in JavaScript rappresenta un’ottima soluzione per memorizzare informazioni lato client in modo semplice e persistente. Rispetto ai cookie, localStorage:
- Offre più spazio.
- Non rallenta le richieste HTTP.
- È di facile utilizzo con l’API JavaScript.
D’altra parte, occorre tenere a mente i rischi di sicurezza (soprattutto XSS) e comprendere che non è una panacea per ogni scenario. È fondamentale scegliere lo strumento più adeguato in base alle necessità di sicurezza, quantità di dati e durata della memorizzazione desiderata.
Checklist rapida per capire se usare localStorage:
- Dati non sensibili (ad esempio preferenze utente, impostazioni UI).
- Persistenza a lungo termine (al di là della sessione).
- Nessun bisogno di invio automatico al server.
- Nessun obbligo di scadenza specifica.
- Necessità di spazio superiore ai pochi KB offerti dai cookie.
Se rispondi “sì” a queste domande, localStorage potrebbe davvero fare al caso tuo. Se invece hai vincoli di sicurezza, sessioni da gestire in modo rigoroso o grosse moli di dati, valuta alternative come cookie HTTP-only, sessionStorage o IndexedDB.