W3docs

Cookie: document.cookie

Impara a leggere, scrivere ed eliminare i cookie con document.cookie in JavaScript, con attributi, sicurezza e confronto con localStorage.

I cookie sono piccoli frammenti di dati (massimo ~4 KB ciascuno) che un sito memorizza nel browser e che vengono allegati automaticamente a ogni richiesta inviata alla stessa origine. Proprio quest'ultimo aspetto li distingue dagli altri meccanismi di memorizzazione lato client: i cookie viaggiano verso il server, quindi rappresentano il meccanismo classico per gli identificatori di sessione, i token "ricordami" e le preferenze di lingua o tema che il server deve conoscere. Questa guida spiega come leggere, scrivere ed eliminare i cookie con document.cookie, gli attributi che ne controllano l'ambito e il ciclo di vita, e quando conviene utilizzare un'opzione di memorizzazione diversa.

Come funziona document.cookie

document.cookie è una proprietà ingannevolmente semplice. Leggerla restituisce tutti i cookie del documento corrente come un'unica stringa separata da punti e virgola di coppie name=value. Scriverci imposta un cookie alla volta — e in modo fondamentale, assegnarle un valore non sovrascrive l'intera stringa. Il browser analizza l'assegnazione e unisce quel singolo cookie all'insieme esistente:

// Reading: returns everything as one string
document.cookie; // "theme=dark; lang=en; sessionId=abc123"

// Writing: adds/updates ONE cookie, leaves the rest intact
document.cookie = "username=John";

Gli attributi che si aggiungono (path, expires, Secure, …) sono di sola scrittura — configurano il cookie ma non vengono mai restituiti quando si legge document.cookie. Si ottengono sempre e solo coppie name=value.

Per creare un cookie, si assegna una stringa name=value a document.cookie, seguita opzionalmente da attributi separati da ;. Se il valore contiene spazi, punti e virgola o altri caratteri speciali, codificarlo con encodeURIComponent per evitare errori di analisi:

javascript— editable

Questo crea un cookie denominato username con il valore John Doe (codificato per gestire lo spazio), che scade l'8 giugno 2025 ed è accessibile in tutto il sito (path=/).

Gli attributi vengono aggiunti alla stringa di assegnazione e controllano dove viene inviato il cookie e per quanto tempo rimane attivo. I più importanti:

AttributoFunzione
pathLimita il cookie a un prefisso di percorso URL. path=/ (la scelta più comune) lo rende disponibile su tutto il sito; path=/admin lo circoscrive a /admin e alle sue sottopagine.
domainControlla quali host ricevono il cookie. Per impostazione predefinita si applica solo all'host corrente. domain=example.com lo condivide con tutti i sottodomini (app.example.com, shop.example.com). È possibile impostare solo un dominio su cui ci si trova attualmente.
expiresUna Date in formato stringa UTC (toUTCString()). Dopo tale data, il browser elimina il cookie.
max-ageDurata in secondi a partire dal momento corrente — un'alternativa più semplice a expires. max-age=0 elimina il cookie.
SecureInvia il cookie solo tramite HTTPS.
SameSiteStrict, Lax (predefinito nei browser moderni) o None — controlla se il cookie viene incluso nelle richieste cross-site.

Senza expires o max-age, si ottiene un cookie di sessione che scompare alla chiusura del browser.

Impostare una scadenza

Usare expires per una data assoluta o max-age per una durata relativa in secondi. max-age è generalmente più comodo perché non richiede la formattazione di una data:

javascript— editable

Questo cookie userSettings scade 24 ore (86.400 secondi) dopo la sua creazione.

Poiché document.cookie restituisce tutti i cookie in un'unica stringa, ottenere un singolo valore richiede di analizzarla. Una funzione helper robusta aggiunge il prefisso ; alla stringa in modo che la stessa suddivisione funzioni per il primo cookie come per qualsiasi altro:

javascript— editable

Se è necessario esaminare ogni cookie, dividere su ; e analizzare ciascuna coppia singolarmente:

javascript— editable

Non esiste un comando "elimina" — si elimina un cookie reimpostandolo con una scadenza nel passato (o max-age=0). L'insidia che inganna tutti: occorre usare lo stesso path e domain con cui il cookie è stato creato, altrimenti il browser lo tratta come un cookie diverso e lascia intatto l'originale.

javascript— editable

Impostare expires=Thu, 01 Jan 1970 00:00:00 UTC produce lo stesso effetto per i browser che preferiscono expires a max-age.

Quando un cookie contiene dati sensibili (soprattutto un token di sessione), gli attributi sono importanti quanto il valore:

  • Secure — invia il cookie solo tramite HTTPS, evitando che possa trapelare su una connessione HTTP non cifrata.
  • SameSite — controlla se il cookie viene allegato alle richieste cross-site. Lax (il valore predefinito moderno) lo blocca nella maggior parte delle richieste cross-site, mitigando il CSRF; Strict è il più restrittivo; None (che richiede Secure) è destinato ai casi d'uso genuinamente cross-site.
  • HttpOnly — nasconde completamente il cookie a JavaScript, proteggendo i token di sessione dai furti tramite XSS. Non può essere impostato da document.cookie; il server deve inviarlo tramite l'intestazione di risposta Set-Cookie. È per questo che i cookie di sessione sono tipicamente gestiti lato server.
Attenzione

Su un sito HTTPS, aggiungere Secure a ogni cookie. Non memorizzare mai password o altri segreti in un cookie leggibile da JavaScript — tutto ciò che si può leggere con document.cookie, un attacco XSS riuscito può leggerlo altrettanto.

document.cookie = "sessionId=abc123; expires=Sat, 08 Jun 2025 12:00:00 UTC; path=/; Secure; SameSite=Lax";

I cookie non sono l'unico archivio lato client e, per la maggior parte dei dati, non sono la scelta migliore. Conviene usare i cookie solo quando il server ha bisogno dei dati a ogni richiesta:

CookielocalStorage
Inviati al serverSì, a ogni richiestaNo, rimangono nel browser
Capacità~4 KB per cookie~5–10 MB per origine
Durataexpires / max-age, altrimenti sessioneFino a cancellazione esplicita
Accesso JSdocument.cookie (a meno di HttpOnly)localStorage.getItem/setItem
Utilizzo tipicoID di sessione, token di autenticazione, preferenze lette dal serverStato UI, cache, bozze

Se si deve solo ricordare qualcosa sul client e il server non lo legge mai, localStorage o sessionStorage è più semplice e capiente; lo Storage API lo tratta in modo approfondito. Poiché i cookie vengono inviati automaticamente con le richieste, interagiscono anche con le regole CORS — vedere le richieste cross-origin con Fetch per inviare credenziali tra origini diverse.

Conclusione

I cookie rimangono il metodo standard per condividere piccoli frammenti di stato con il server — sessioni, autenticazione e preferenze lette dal server. Si scrivono uno alla volta con document.cookie, si circoscrivono con path/domain, se ne controlla la durata con expires/max-age e si mettono in sicurezza con Secure, SameSite e (lato server) HttpOnly. Per dati più voluminosi e solo lato client, è preferibile utilizzare Web Storage.

Esercizio

Pratica
Quali attributi puoi usare per migliorare la sicurezza dei cookie in JavaScript?
Quali attributi puoi usare per migliorare la sicurezza dei cookie in JavaScript?
Was this page helpful?