← Назад к вопросам

Какой максимальный размер хранилища у sessionStorage?

2.0 Middle🔥 192 комментариев
#Браузер и сетевые технологии

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Максимальный размер sessionStorage

SessionStorage — это часть Web Storage API, которая позволяет хранить данные на стороне клиента в течение сессии одной вкладки браузера. В отличие от localStorage, данные в sessionStorage очищаются при закрытии вкладки.

Технические ограничения по объёму

Спецификация W3C явно не определяет максимальный размер для sessionStorage и localStorage. Однако на практике стандартом де-факто стал лимит в 5 МБ (мегабайт) на один домен (origin — комбинация протокола, домена и порта). Этот лимит является суммарным для localStorage, sessionStorage и IndexedDB в некоторых браузерах, хотя чаще sessionStorage и localStorage разделяют этот лимит поровну или почти поровну.

Вариации между браузерами

Лимиты могут значительно отличаться в зависимости от браузера и условий:

  • Chrome, Firefox, Edge (современные версии): Обычно 5-10 МБ на домен для sessionStorage. В Chrome, например, лимит составляет 10 МБ, но может быть уменьшен в мобильных версиях или при работе в режиме инкогнито.
  • Safari (настольный и мобильный): В мобильном Safari (iOS) и настольном Safari лимит строже — около 5 МБ. При превышении лимита Safari может полностью очистить хранилище для домена.
  • Internet Explorer (8+): Ограничение составляет 10 МБ, но с учётом того, что IE использовал собственную реализацию.

Как определить лимит на практике

Поскольку спецификация не гарантирует точный размер, а браузеры могут его менять, наиболее надёжный подход — предусмотреть обработку ошибок при записи. При превышении квоты браузер выбросит исключение QuotaExceededError. Вот пример безопасной записи:

function safeSessionStorageSet(key, value) {
    try {
        sessionStorage.setItem(key, value);
        console.log('Данные успешно сохранены');
    } catch (e) {
        if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {
            console.error('Достигнут лимит хранилища. Невозможно сохранить данные.');
            // Здесь может быть логика очистки устаревших данных или уведомление пользователя
        } else {
            console.error('Неизвестная ошибка при записи в sessionStorage:', e);
        }
    }
}

// Пример использования
safeSessionStorageSet('largeData', JSON.stringify({ some: 'very large object' }));

Ключевые факторы, влияющие на доступный объём

  1. Политика браузера: Браузер может уменьшать лимиты в приватных режимах (инкогнито/приватный просмотр).
  2. Вмешательство пользователя: Пользователь может вручную очистить данные сайта или установить глобальные ограничения.
  3. Дисковое пространство: На устройствах с малым объёмом свободной памяти браузеры могут снижать лимиты.
  4. Совокупная квота домена: Как упоминалось, в некоторых реализациях sessionStorage делит общий лимит с localStorage и другими клиентскими базами данных.

Рекомендации для разработчиков

  • Не рассчитывайте на точный объём: Всегда пишите код, который обрабатывает ошибки переполнения.
  • Используйте сжатие данных: Для хранения больших объёмов текстовых данных (например, JSON) можно применять сжатие, например, с помощью библиотек типа pako (gzip) или lz-string.
  • Альтернативы для больших данных: Если нужно хранить значительно больше 5-10 МБ, рассмотрите:
    *   **IndexedDB** — поддерживает значительно большие объёмы (обычно 50% от свободного места на диске) и асинхронную работу.
    *   **Кэш API (Cache Storage)** — для хранения ресурсов (изображений, скриптов) в рамках Progressive Web Apps.
    *   **Серверное хранение** с синхронизацией через API.

Пример проверки доступного объёма (оценочный)

Прямое измерение доступного объёма в спецификации не предусмотрено, но можно сделать приблизительную оценку:

function estimateSessionStorageCapacity() {
    const testKey = 'testQuota';
    let data = 'a';
    // Создаём строку размером примерно 1 МБ
    while (data.length < 1024 * 1024) {
        data += data;
    }
    
    try {
        for (let i = 0; i < 20; i++) { // Пробуем записать до ~20 МБ
            sessionStorage.setItem(testKey + i, data.substring(0, 1024 * 1024));
        }
    } catch (e) {
        const used = Object.keys(sessionStorage).reduce((total, key) => {
            return total + (sessionStorage.getItem(key) || '').length;
        }, 0);
        console.log('Примерно использовано: ' + Math.round(used / (1024 * 1024)) + ' МБ');
        // Очищаем тестовые данные
        for (let i = 0; i < 20; i++) {
            sessionStorage.removeItem(testKey + i);
        }
    }
}
// Внимание: этот код может привести к очистке существующих данных в sessionStorage
// Используйте с осторожностью, только для диагностики!

Важно: Такой тест может перезаписать существующие данные и должен использоваться исключительно в диагностических целях в контролируемых условиях.

Таким образом, хотя типичный практический лимит sessionStorage составляет 5-10 МБ на домен, единственно правильным подходом является написание кода, который не полагается на конкретный объём, а корректно обрабатывает ситуацию исчерпания квоты.