In sintesi: Quando la dimensione del cookie supera il limite di 4KB del browser, dividilo in più cookie più piccoli e ricostruiscili sul lato server. Questa soluzione funziona particolarmente bene per le piattaforme serverless senza richiedere infrastrutture aggiuntive.
Uso dei cookie negli SDK di Logto#
Nella maggior parte degli SDK di Logto per app web tradizionali, memorizziamo i dati della sessione in cookie HTTP-only per sicurezza. Ecco il nostro approccio:
Quando l'SDK esegue azioni che richiedono dati di sessione, essa:
- Li cripta utilizzando la crittografia simmetrica
- Memorizza la stringa crittografata in un cookie HTTP-only
- Imposta flag sicuri per garantire la trasmissione solo HTTPS
Questo approccio non richiede archiviazione esterna e può essere distribuito direttamente su popolari piattaforme serverless come Vercel, senza apportare modifiche infrastrutturali aggiuntive.
Il problema: errore di superamento della dimensione del cookie#
Tuttavia, quando si implementa il supporto multi-organizzazione, abbiamo riscontrato una limitazione. La nostra dimensione del cookie è cresciuta oltre il limite di 4KB del browser perché dovevamo memorizzare:
- Accesso e altri dati di sessione
- Token ID per l'autenticazione utente
- Token di aggiornamento
- Token di accesso con diversi indicatori di risorsa
- Token dell'organizzazione, che è un JWT con payload, uno per organizzazione, che può essere piuttosto grande nel caso in cui più organizzazioni siano attive contemporaneamente
Questo ha generato l'errore:
I browser impongono limiti stretti sulla dimensione dei cookie, con la maggior parte che limita i singoli cookie a 4KB e la dimensione totale dei cookie a 8KB per dominio.
E utilizzare un'archiviazione esterna?#
L'utilizzo di un'archiviazione esterna come Redis o un database richiederebbe una configurazione infrastrutturale aggiuntiva, aumentando sia i costi che la complessità per gli utenti dell'SDK. Questo va contro il nostro obiettivo di fornire una soluzione a misura di sviluppatore.
Mentre l'archiviazione in memoria potrebbe essere un'alternativa, non funziona bene per ambienti serverless dove le istanze sono effimere e la memoria non è condivisa tra le richieste.
La soluzione: divisione dei cookie#
Una soluzione semplice è dividere grandi cookie in pezzi più piccoli. Questo articolo dimostra l'approccio utilizzando Next.js come esempio:
1. Dividi i dati della sessione#
2. Memorizza i pezzi#
3. Ricostruisci su richiesta#
Best practices per l'implementazione#
1. Gestione delle dimensioni dei pezzi#
2. Gestione pulita della sessione#
Monitorare la dimensione totale dei cookie:#
Conclusione#
La divisione dei cookie offre una soluzione elegante, sia facile da implementare che minimamente distruttiva per l'architettura dell'applicazione esistente. Semplicemente suddividendo i cookie grandi in pezzi più piccoli, gli sviluppatori possono superare le limitazioni di dimensione del browser senza modificare il loro approccio alla gestione della sessione principale o aggiungere dipendenze esterne.