Как исправить ошибку превышения размера cookie, разбив cookies
Решение для ошибки превышения размера cookie: разбить cookie на несколько меньших и восстановить их на стороне сервера. Это решение особенно хорошо работает для безсерверных платформ без необходимости дополнительной инфраструктуры.
Короче говоря: Когда размер вашего cookie превышает лимит 4КБ в браузере, разбейте его на несколько меньших и восстановите их на стороне сервера. Это решение особенно хорошо работает для безсерверных платформ без необходимости дополнительной инфраструктуры.
Использование cookie в Logto SDK
В большинстве Logto SDK для традиционных веб-приложений мы храним данные сеанса в cookie только HTTP для безопасности. Вот наш подход:
Когда SDK выполняет действия, требующие данных сеанса, он:
- Шифрует их с помощью симметричного шифрования
- Сохраняет зашифрованную строку в cookie только HTTP
- Устанавливает флаги безопасности для обеспечения передачи только через HTTPS
Этот подход не требует внешнего хранения и может быть развернут напрямую на популярных безсерверных платформах, таких как Vercel, без каких-либо изменений в инфраструктуре.
Проблема: ошибка превышения размера cookie
Однако при реализации поддержки нескольких организаций мы столкнулись с ограничением. Наш размер cookie превысил лимит 4КБ браузера, так как нам нужно было хранить:
- Данные о входе и другие данные сеанса
- ID токены для аутентификации пользователей
- Токены обновления
- Токены доступа с различными идентификаторами ресурсов
- Токены организации, которые представляют собой JWT с полезной нагрузкой, один на организацию, что может быть довольно большим в случае, когда несколько организаций активны одновременно
Это привело к ошибке:
Браузеры строго ограничивают размер cookie: большинство ограничивают отдельные cookie 4КБ, а общий размер cookie до 8КБ на домен.
Что насчет использования внешнего хранилища?
Использование внешнего хранилища, например Redis или базы данных, потребует дополнительных настроек инфраструктуры, увеличивающих как затраты, так и сложность для пользователей SDK. Это противоречит нашей цели предоставить удобное для разработчиков решение.
Хотя хранилище в памяти могло бы быть альтернативой, оно плохо работает в безсерверных средах, где экземпляры эфемерны и память не общая между запросами.
Решение: Разделение cookie
Простое решение заключается в том, чтобы разбить большие cookie на меньшие части. В этой статье демонстрируется подход на примере Next.js:
1. Разделение данных сеанса
2. Хранение частей
3. Восстановление по запросу
Лучшие практики для реализации
1. Управление размером частей
2. Удаление сеансов
Мониторинг общего размера cookie:
Заключение
Разделение cookie предлагает элегантное решение, которое как легко реализовать, так и минимально нарушает существующую архитектуру приложения. Просто разбив большие cookie на меньшие части, разработчики могут преодолеть ограничения по размеру в браузерах без изменения своей основной стратегии управления сеансами или добавления внешних зависимостей.