• ciasteczka
  • nextjs
  • bezserwerowy

Jak naprawić błąd przekroczenia rozmiaru ciasteczka poprzez dzielenie ciasteczek

Rozwiązanie dla błędu przekroczenia rozmiaru ciasteczka: podziel ciasteczko na kilka mniejszych i odbuduj je po stronie serwera. To rozwiązanie działa szczególnie dobrze na platformach bezserwerowych, nie wymagając dodatkowej infrastruktury.

Sijie
Sijie
Developer

TL;DR: Kiedy rozmiar twojego ciasteczka przekracza limit 4KB przeglądarki, podziel je na kilka mniejszych ciasteczek i odbuduj je po stronie serwera. To rozwiązanie działa szczególnie dobrze na platformach bezserwerowych, nie wymagając dodatkowej infrastruktury.

Użycie ciasteczek w logice SDK

W większości SDK Logto dla tradycyjnych aplikacji internetowych przechowujemy dane sesji w ciasteczkach HTTP-only dla bezpieczeństwa. Oto nasze podejście:

Kiedy SDK wykonuje akcje wymagające danych sesji, to:

  • Szyfruje je przy użyciu szyfrowania symetrycznego
  • Przechowuje zaszyfrowany ciąg w ciasteczku HTTP-only
  • Ustawia flagi zabezpieczeń, aby zapewnić przesyłanie tylko przez HTTPS

To podejście nie wymaga zewnętrznego magazynu i można je wdrożyć bezpośrednio na popularnych platformach bezserwerowych, takich jak Vercel, bez dodatkowych zmian infrastruktury.

Problem: Błąd przekroczenia rozmiaru ciasteczka

Jednak podczas implementacji obsługi wielu organizacji napotkaliśmy ograniczenie. Rozmiar ciasteczka przekroczył limit 4KB przeglądarki, ponieważ musieliśmy przechowywać:

  • Zalogowane i inne dane sesyjne
  • Tokeny ID do uwierzytelniania użytkownika
  • Tokeny odświeżania
  • Tokeny dostępu z różnymi wskaźnikami zasobów
  • Tokeny organizacji, które są w formacie JWT z ładunkiem, po jednym na organizację, co może być dość duże w przypadku, gdy wiele organizacji jest aktywnych jednocześnie

To skutkowało błędem:

Przeglądarki ściśle ograniczają rozmiary ciasteczek, większość ogranicza do 4KB na pojedyncze ciasteczko i do 8KB na domenę.

Co z używaniem zewnętrznego magazynu?

Użycie zewnętrznego magazynu, takiego jak Redis lub baza danych, wymaga dodatkowej konfiguracji infrastruktury, co zwiększa zarówno koszty, jak i złożoność dla użytkowników SDK. To przeczy naszemu celowi, jakim jest zapewnienie rozwiązania przyjaznego dla programistów.

Chociaż pamięć ulotna mogłaby być alternatywą, nie działa dobrze w środowiskach bezserwerowych, gdzie instancje są efemeryczne, a pamięć nie jest współdzielona między żądaniami.

Rozwiązanie: Dzielenie ciasteczek

Proste rozwiązanie to podzielenie dużych ciasteczek na mniejsze fragmenty. Ten artykuł demonstruje podejście, używając Next.js jako przykładu:

1. Podziel dane sesji

2. Przechowuj fragmenty

3. Odbuduj przy żądaniu

Najlepsze praktyki dotyczące wdrożenia

1. Zarządzanie rozmiarem fragmentów

2. Czyste zarządzanie sesją

Monitoruj całkowity rozmiar ciasteczek:

Wnioski

Dzielenie ciasteczek oferuje eleganckie rozwiązanie, które jest łatwe do wdrożenia i minimalnie ingeruje w istniejącą architekturę aplikacji. Po prostu rozbijając duże ciasteczka na mniejsze fragmenty, programiści mogą pokonać ograniczenia rozmiaru przeglądarki bez zmiany swojego centralnego podejścia do zarządzania sesjami ani dodawania zewnętrznych zależności.