Cookie, Local Storage и IndexedDB: что такое сессия на самом деле

Вход записывает данные в три разных места. Понимание различий объясняет, почему сессии переживают одно, ломаются от другого и почему при синхронизации профиля нужно переносить все три.
«Быть авторизованным» кажется чем-то одним. На деле это как минимум три вещи, хранящиеся в трёх разных местах с тремя разными сроками жизни, и эта разница объясняет большую часть непонятного поведения при переносе сессий между компьютерами.
Cookie
Небольшие пары «ключ — значение», автоматически отправляемые с каждым запросом на сайт, который их установил. Обычно именно здесь лежит токен сессии.
- Привязаны к домену и пути, имеют срок действия.
- Cookie с атрибутом `Secure` отправляется только по HTTPS; cookie с `HttpOnly` невидима для JavaScript страницы.
- Сессионная cookie не имеет срока действия и должна исчезнуть при закрытии браузера.
Cookie — самое маленькое хранилище из трёх и самое ответственное. Потеряете их — и вы разлогинены.
Local Storage и Session Storage
Строковое хранилище «ключ — значение», которое читает и записывает JavaScript страницы, в пределах origin. Оно никогда не отправляется с запросом. Страница должна прочитать его сама.
Приложения хранят здесь настройки, кэшированные данные профиля, флаги функций и часто токен обновления. Local Storage сохраняется, пока его не очистят; Session Storage живёт только пока открыта вкладка.
IndexedDB
Настоящая база данных в браузере: структурированные записи, индексы, транзакции. Здесь современное веб-приложение хранит всё существенное: кэшированную историю сообщений, офлайн-очереди, ключи шифрования для функций со сквозным шифрованием.
Почему это важно для профиля
Это придаёт слову «изоляция» точный смысл. Два профиля изолированы, когда раздельны все три хранилища, а также кэш и состояние расширений. Инструмент, который изолирует cookie, но делит IndexedDB, решил лишь лёгкую треть задачи.
Это также задаёт планку для переноса профиля между компьютерами. Перенос одних cookie воспроизводит форму сессии, но не её содержание.
| Хранилище | Кто записывает | Что обычно хранит |
|---|---|---|
| Cookie | Сервер и скрипт страницы | Токен сессии, настройки, идентификаторы отслеживания |
| Local Storage | Скрипт страницы | Токены обновления, состояние интерфейса, кэшированные данные профиля |
| Session Storage | Скрипт страницы | Состояние отдельной вкладки, сбрасывается при закрытии вкладки |
| IndexedDB | Скрипт страницы | Кэшированные данные, офлайн-очереди, ключи шифрования |
Перенос сессии между вашими компьютерами
PowerOps сохраняет cookie, Local Storage и IndexedDB при закрытии профиля и восстанавливает их, когда он открывается в другом месте. Каждая категория включается отдельным переключателем — для всего рабочего пространства или для одного профиля, так что вы переносите ровно столько, сколько задумали.
О том, как это работает, стоит знать два свойства:
- Снимок шифруется на компьютере, откуда он получен, ключом, принадлежащим рабочему пространству, и расшифровывается на компьютере, который открывает профиль. Это не сквозное шифрование: сервис хранит копию этого ключа, чтобы ваши другие компьютеры могли получить снимок.
- Профиль открыт на одном компьютере за раз. Пока он открыт, он удерживает аренду, а другому устройству сообщают, у какого устройства он находится, вместо того чтобы позволить расщепить сессию на две расходящиеся копии.
Второй пункт — намеренное ограничение. Два компьютера, независимо редактирующие одну сессию, дают две наполовину действительные сессии и нередко разлогиненный аккаунт на обоих. У хранилища cookie нет способа разрешить конфликт слияния.
Практический вывод
Закрывайте профили, а не убивайте их. Запись при закрытии делает сессию переносимой, и это самая дешёвая привычка в этом списке.

