База знаний
Telegram Mini Apps: DeviceStorage и SecureStorage — локальное и защищённое хранилище
В Bot API 9.0 у Telegram Mini Apps появились DeviceStorage и SecureStorage — локальное и защищённое хранилища прямо на устройстве. Разбираем, чем они отличаются от CloudStorage, как ими пользоваться и что туда класть.
СейчасДля кого это руководство
- Для кого это руководство
- Как выбрать хранилище
- Методы DeviceStorage
- Методы SecureStorage
- Подключение и проверка поддержки
- 1. Подключите официальный SDK
- 2. Проверьте версию и наличие объекта
- 3. Подготовьте обработку асинхронного результата
- Запись, чтение и восстановление
- Запись обычного значения
- Чтение чувствительного значения
- Восстановление защищённого элемента
- Полезные сценарии
- Быстрый старт интерфейса из локального состояния
- Офлайн-кэш с последующим обновлением
- Разделение данных при миграции с CloudStorage
- Стабильное локальное назначение варианта интерфейса
- Что делать, если хранилище не работает
- Официальные источники
- Следующий шаг
- Связанные материалы
Мини-приложения Telegram (Mini Apps) получают два локальных хранилища: DeviceStorage подходит для кэша и состояния интерфейса, а SecureStorage — для небольших чувствительных значений. Оба объекта доступны через Telegram.WebApp; общую синхронизацию между устройствами следует строить через CloudStorage или собственный сервер.
Проверено 5 сентября 2026 года. Telegram добавил поляDeviceStorageиSecureStorage11 апреля 2025 года в Bot API 9.0. На момент проверки официальная документация уже описывает Bot API 10.1 и по-прежнему содержит оба поля.
Содержание
- Для кого это руководство
- Как выбрать хранилище
- Методы DeviceStorage
- Методы SecureStorage
- Подключение и проверка поддержки
- Запись, чтение и восстановление
- Полезные сценарии
- Что делать, если хранилище не работает
- Официальные источники
Для кого это руководство
Материал рассчитан на разработчиков Telegram Mini Apps, которые уже подключают клиентский JavaScript-комплект Telegram (SDK) и выбирают место для локальных настроек, кэша или чувствительных данных.
Руководство основано на официальной документации Telegram. Описанные операции в рамках этого редакторского прохода не запускались на реальном устройстве.
Как выбрать хранилище
| Хранилище | Где находятся данные | Основное назначение | Лимит |
DeviceStorage | На текущем устройстве пользователя | Кэш, настройки и состояние интерфейса | До 5 МБ на пользователя для одного бота |
SecureStorage | В защищённом хранилище текущего устройства | Небольшие чувствительные значения | До 10 элементов на пользователя для одного бота |
CloudStorage | В облаке Telegram | Данные, которые должны быть доступны на разных устройствах | До 1024 ключей; значение до 4096 символов |
DeviceStorage и SecureStorage не являются общим каналом синхронизации. SecureStorage поддерживает отдельный сценарий восстановления, но для общего состояния приложения используйте CloudStorage либо сервер.
DeviceStorage концептуально похож на браузерный localStorage, однако работает через асинхронные методы Telegram и колбэки. SecureStorage рассчитан на чувствительные значения, но не отменяет серверную проверку initData, ограничение срока и области действия учётных данных и возможность их отзыва.
Методы DeviceStorage
Операции вызываются через Telegram.WebApp.DeviceStorage. Результат передаётся через колбэк. Для записи, удаления и очистки второй аргумент сообщает об успехе.
| Метод | Что делает | Результат через колбэк |
setItem(key, value, [callback]) | Записывает строковое значение | Ошибка и признак успешной записи |
getItem(key, callback) | Читает значение по ключу | Ошибка и значение; для отсутствующего ключа используется null |
removeItem(key, [callback]) | Удаляет один ключ | Ошибка и признак успешного удаления |
clear([callback]) | Удаляет все данные текущего приложения в этом хранилище | Ошибка и признак успешной очистки |
Используйте префиксы вроде ui: и cache: для соглашения об именах и миграций. API не предоставляет выборочную очистку по префиксу: приложение должно само знать перечень принадлежащих подсистеме ключей и удалять их по одному.
Не считайте запись завершённой до вызова колбэка. Если setItem вернул ошибку, не обновляйте состояние приложения так, будто значение уже сохранено.
Методы SecureStorage
Операции доступны через Telegram.WebApp.SecureStorage.
| Метод | Что делает | Результат через колбэк |
setItem(key, value, [callback]) | Сохраняет чувствительное значение | Ошибка и признак успешной записи |
getItem(key, callback) | Читает значение | Ошибка, значение и признак canRestore |
restoreItem(key, [callback]) | Запрашивает восстановление доступного для восстановления элемента | Ошибка и восстановленное значение |
removeItem(key, [callback]) | Удаляет один элемент | Ошибка и признак успешного удаления |
clear([callback]) | Удаляет все защищённые элементы текущего приложения | Ошибка и признак успешной очистки |
Третий аргумент колбэка getItem — canRestore. Если значения нет, но canRestore равно true, приложение может предложить пользователю восстановление через restoreItem. Не запускайте восстановление автоматически: операция может потребовать взаимодействия с пользователем.
Подключение и проверка поддержки
1. Подключите официальный SDK
Загрузите https://telegram.org/js/telegram-web-app.js до остальных скриптов приложения. После загрузки SDK объект должен быть доступен как window.Telegram.WebApp.
2. Проверьте версию и наличие объекта
Сначала убедитесь, что существует window.Telegram.WebApp и что у него есть функция isVersionAtLeast. Затем вызовите tg.isVersionAtLeast('9.0'), где tg обозначает объект Telegram.WebApp.
Ветка работы с хранилищем считается доступной только при двух условиях: проверка версии вернула true, и нужное поле существует. Для DeviceStorage проверьте tg.DeviceStorage, для SecureStorage — tg.SecureStorage.
Одного номера версии недостаточно: наличие конкретного объекта защищает код от обращения к отсутствующему API в старом или несовместимом окружении. Эта проверка не заменяет проверку подлинности данных Mini App на сервере.
Если поддержка не подтверждена, предложите обновить Telegram или используйте заранее выбранный резервный канал. Для кросс-девайсных настроек подходит CloudStorage; обычное браузерное хранилище внутри WebView нельзя считать эквивалентом SecureStorage по модели защиты.
3. Подготовьте обработку асинхронного результата
Сначала проверяйте первый аргумент колбэка с ошибкой и только затем используйте значение или признак успеха. Ожидаемый результат успешной записи: ошибка отсутствует, а колбэк сообщает об успешной операции.
После успешной записи выполните контрольное чтение того же ключа. Проверка пройдена, если чтение вернуло ожидаемое значение без ошибки.
Запись, чтение и восстановление
Запись обычного значения
- Получите
Telegram.WebApp.DeviceStorageпосле проверки поддержки. - Вызовите
setItem('ui:theme', 'dark', callback)со строковым ключом и значением. - Если колбэк вернул ошибку, оставьте рабочее состояние приложения без изменений.
- После успешной записи вызовите
getItem('ui:theme', callback). - Считайте проверку пройденной, если чтение вернуло
darkбез ошибки.
Для отсутствующего ключа обрабатывайте результат null как штатное состояние и применяйте значение по умолчанию.
Чтение чувствительного значения
- После проверки поддержки получите
Telegram.WebApp.SecureStorage. - Вызовите
getItem(key, callback). - При ошибке перейдите к безопасному резервному сценарию и не раскрывайте значение или технические подробности в пользовательском сообщении.
- Если значение получено, передайте его только компоненту, которому оно необходимо. Не выводите его в консоль и аналитику.
- Если значения нет и
canRestoreравноfalse, запросите повторную авторизацию или создайте новое значение.
Восстановление защищённого элемента
- Предлагайте восстановление только после результата
getItem, в которомcanRestoreравноtrue. - Объясните пользователю, зачем потребуется системное подтверждение.
- После согласия вызовите
restoreItem(key, callback). - При успехе используйте возвращённое значение без журналирования его содержимого.
- При отмене или ошибке оставьте доступным обычный сценарий повторной авторизации.
Проверяемый результат: приложение либо получает восстановленное значение, либо корректно переходит к повторной авторизации, не зависая и не считая отмену успешным восстановлением.
Полезные сценарии
Быстрый старт интерфейса из локального состояния
Задача. Сохранить тему, язык, последний открытый раздел и другие некритичные настройки.
Действие. Запишите настройки в DeviceStorage, а при следующем запуске прочитайте их до загрузки необязательных данных с сервера.
Проверяемый результат. После перезапуска Mini App на том же устройстве сохранённая настройка восстанавливается.
Ограничение. На другом устройстве локальное значение может отсутствовать; общее состояние храните в CloudStorage или на сервере.
Офлайн-кэш с последующим обновлением
Задача. Быстро показать ранее загруженные списки, справочные данные или контент, пока сеть запрашивает свежую версию.
Действие. Положите кэш в DeviceStorage, сохраните рядом версию формата или время обновления, покажите совместимую запись и параллельно запросите актуальные данные.
Проверяемый результат. При старте отображается допустимый кэш, а после ответа сервера интерфейс обновляется свежими данными.
Ограничение. Этот сценарий не подходит для данных, которые должны быть одинаковыми на всех устройствах или всегда отражать актуальное состояние операции.
Разделение данных при миграции с CloudStorage
Разложите существующие ключи по назначению:
- локальные настройки и воспроизводимый кэш перенесите в
DeviceStorage; - данные, нужные на разных устройствах, оставьте в
CloudStorageили на сервере; - небольшие чувствительные значения храните в
SecureStorage; - серверные источники истины не заменяйте локальной копией.
После миграции проверьте запуск на прежнем и новом устройстве, отсутствие значения, очистку хранилища и переход на резервный сценарий.
Стабильное локальное назначение варианта интерфейса
Задача. Закрепить вариант интерфейса на одном устройстве, чтобы пользователь не переходил между группами при каждом запуске.
Действие. Сохраните идентификатор варианта в DeviceStorage и используйте его при следующем запуске.
Проверяемый результат. На одном устройстве вариант остаётся тем же после перезапуска Mini App.
Ограничение. Если эксперимент должен закрепляться за пользователем на всех устройствах, назначение храните на сервере или в синхронизируемом хранилище.
Что делать, если хранилище не работает
- Нет
Telegram.WebApp. Проверьте загрузку официального SDK и запуск страницы внутри Telegram. - Нет
DeviceStorageилиSecureStorage. Проверьте наличиеisVersionAtLeast, результатisVersionAtLeast('9.0')и самого поля; при необходимости предложите обновить клиент. - Колбэк вернул ошибку. Не считайте операцию успешной, не затирайте рабочее состояние и предложите повторить действие.
- После записи чтение пустое. Проверьте совпадение ключа, дождитесь колбэка записи и повторите контрольное чтение.
- Данные есть на одном устройстве, но отсутствуют на другом. Для локальных хранилищ это ожидаемое ограничение; используйте
CloudStorageили серверную синхронизацию. ДляSecureStorageотдельно проверьтеcanRestore. SecureStorage.getItemне вернул значение. ПриcanRestore: trueпредложите восстановление, приfalseпереходите к повторной авторизации.- Пользователь отменил восстановление. Не запускайте бесконечный повтор и оставьте обычный способ входа.
- Достигнут лимит. Для
DeviceStorageудалите ненужный кэш или уменьшите объём данных; дляSecureStorageсократите число элементов и не используйте его для крупного состояния. - Нужно удалить часть данных. Используйте
removeItemдля известных ключей.clearудаляет всё хранилище соответствующего типа для текущего приложения на устройстве, поэтому перед вызовом проверьте область удаления.
Официальные источники
- Telegram Mini Apps: техническая документация
- DeviceStorage
- SecureStorage
- CloudStorage
- Изменения Bot API от 11 апреля 2025 года
Следующий шаг
Если хранилище — только часть Mini App, следующим шагом полезно сверить остальные возможности бота в справочнике «Возможности Telegram-ботов — справочник по Bot Features».
Связанные материалы
- Люди + агенты в одном чате: как мы собрали рабочий контур в Telegram
- Redis — хранилище данных в памяти
- Варианты управляемого S3-хранилища в России
При выборе хранилища полезно сопоставить требования к синхронизации, объёму и защите данных с архитектурой всего приложения. Обсуждение особенно пригодится команде, которая проектирует Mini App и серверную часть одновременно.
Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov
Если хотите разобрать свою задачу — напишите мне Если хотите разобрать свою задачу — напишите мне.
Можно прийти с идеей, черновым контекстом или уже живой задачей. Помогу быстро понять, где реальный следующий шаг, а где лишний шум.
Обычно хватает 2–3 сообщений, чтобы понять, могу ли я здесь реально помочь и в каком формате лучше двигаться дальше.
Дальше по теме
MCP Apps — первое официальное расширение Model Context Protocol, которое позволяет MCP-серверам возвращать интерактивные UI-компоненты: дашборды, формы, визуализации, многошаговые…