• cookie
  • nextjs
  • serverless

Come risolvere l'errore di superamento della dimensione dei cookie dividendo i cookie

Una soluzione per l'errore di superamento della dimensione del cookie: dividere il cookie in più cookie più piccoli e ricostruirli sul lato server. Questa soluzione funziona particolarmente bene per le piattaforme serverless senza richiedere infrastrutture aggiuntive.

Sijie
Sijie
Developer

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.

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.

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.

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

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.