• cookie
  • nextjs
  • serverless

Как исправить ошибку превышения размера cookie, разбив cookies

Решение для ошибки превышения размера cookie: разбить cookie на несколько меньших и восстановить их на стороне сервера. Это решение особенно хорошо работает для безсерверных платформ без необходимости дополнительной инфраструктуры.

Sijie
Sijie
Developer

Короче говоря: Когда размер вашего cookie превышает лимит 4КБ в браузере, разбейте его на несколько меньших и восстановите их на стороне сервера. Это решение особенно хорошо работает для безсерверных платформ без необходимости дополнительной инфраструктуры.

В большинстве Logto SDK для традиционных веб-приложений мы храним данные сеанса в cookie только HTTP для безопасности. Вот наш подход:

Когда SDK выполняет действия, требующие данных сеанса, он:

  • Шифрует их с помощью симметричного шифрования
  • Сохраняет зашифрованную строку в cookie только HTTP
  • Устанавливает флаги безопасности для обеспечения передачи только через HTTPS

Этот подход не требует внешнего хранения и может быть развернут напрямую на популярных безсерверных платформах, таких как Vercel, без каких-либо изменений в инфраструктуре.

Однако при реализации поддержки нескольких организаций мы столкнулись с ограничением. Наш размер cookie превысил лимит 4КБ браузера, так как нам нужно было хранить:

  • Данные о входе и другие данные сеанса
  • ID токены для аутентификации пользователей
  • Токены обновления
  • Токены доступа с различными идентификаторами ресурсов
  • Токены организации, которые представляют собой JWT с полезной нагрузкой, один на организацию, что может быть довольно большим в случае, когда несколько организаций активны одновременно

Это привело к ошибке:

Браузеры строго ограничивают размер cookie: большинство ограничивают отдельные cookie 4КБ, а общий размер cookie до 8КБ на домен.

Что насчет использования внешнего хранилища?

Использование внешнего хранилища, например Redis или базы данных, потребует дополнительных настроек инфраструктуры, увеличивающих как затраты, так и сложность для пользователей SDK. Это противоречит нашей цели предоставить удобное для разработчиков решение.

Хотя хранилище в памяти могло бы быть альтернативой, оно плохо работает в безсерверных средах, где экземпляры эфемерны и память не общая между запросами.

Простое решение заключается в том, чтобы разбить большие cookie на меньшие части. В этой статье демонстрируется подход на примере Next.js:

1. Разделение данных сеанса

2. Хранение частей

3. Восстановление по запросу

Лучшие практики для реализации

1. Управление размером частей

2. Удаление сеансов

Заключение

Разделение cookie предлагает элегантное решение, которое как легко реализовать, так и минимально нарушает существующую архитектуру приложения. Просто разбив большие cookie на меньшие части, разработчики могут преодолеть ограничения по размеру в браузерах без изменения своей основной стратегии управления сеансами или добавления внешних зависимостей.