Idb-keyval — это лёгкая обёртка над IndexedDB, предоставляющая простой API для асинхронного хранения данных в браузере. Она позволяет хранить ключ-значение без необходимости самостоятельно управлять транзакциями и открытием базы данных. Основные функции включают:
get(key) — извлечение значения по ключу.set(key, value) — сохранение значения по ключу.del(key) — удаление записи.clear() — очистка всех данных.keys() — получение массива всех ключей.Idb-keyval работает с любыми сериализуемыми объектами, включая строки, числа, массивы и JSON-объекты, что делает её удобной для хранения токенов, настроек и других небольших данных.
Idb-keyval позволяет создавать отдельные хранилища, что полезно для
логической изоляции данных. Для этого используется объект
Store:
import { Store, get, set } from 'idb-keyval';
const myStore = new Store('my-database', 'tokens');
await set('accessToken', '123456', myStore);
const token = await get('accessToken', myStore);
Преимущество кастомного хранилища заключается в возможности разделять чувствительные данные (например, токены доступа) и общие настройки приложения, уменьшая риск случайного удаления критических данных.
Токены аутентификации (access token, refresh token) часто требуют безопасного хранения на клиенте. Idb-keyval хранит данные на стороне браузера, но это не обеспечивает криптографической защиты. Для минимизации рисков:
crypto.subtle для
симметричного шифрования токенов перед записью:const encoder = new TextEncoder();
const data = encoder.encode('my-secret-token');
const encrypted = await crypto.subtle.encrypt(
{ name: 'AES-GCM', iv: window.crypto.getRandomValues(new Uint8Array(12)) },
cryptoKey,
data
);
await set('accessToken', encrypted, myStore);
Изоляция данных — хранение токенов в отдельном хранилище помогает снизить вероятность случайного доступа другими частями приложения.
Ограничение времени жизни — access-токены лучше
хранить с учетом их срока действия. Можно хранить объект вида
{ token, expiresAt } и проверять актуальность перед
использованием.
Idb-keyval подходит для хранения данных, которые не требуют строгой защиты на уровне операционной системы. Сюда входят:
Нельзя хранить в чистом виде: пароли, секретные
ключи API или любые данные, которые при утечке могут дать полный доступ
к учетной записи или серверу. Для таких целей требуется использование
защищённого хранилища (например, Web Crypto или secure
storage в мобильных приложениях).
Idb-keyval полностью асинхронна. Для стабильной работы приложения
необходимо использовать try/catch:
try {
await set('refreshToken', 'xyz', myStore);
const token = await get('refreshToken', myStore);
} catch (error) {
console.error('Ошибка при работе с IndexedDB', error);
}
Это важно, так как IndexedDB может быть недоступна в приватном режиме браузера или из-за ограничений пользователя.
Для удобства работы с токенами и связанными метаданными рекомендуется хранить их в виде объектов:
const accessData = {
token: 'abc123',
issuedAt: Date.now(),
expiresIn: 3600
};
await set('accessData', accessData, myStore);
Такой подход упрощает проверку срока действия токена и управление несколькими типами токенов одновременно.
Store.Такой подход позволяет эффективно использовать Idb-keyval для хранения токенов и других данных, соблюдая базовые принципы безопасности и удобства работы.