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.
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.