Если секреты хранятся в JavaScript на стороне клиента, они уже не секреты. Любой пользователь может открыть DevTools и увидеть ключи, токены или приватные URL.
Это может привести к расходу лимитов, утечке данных, действиям от имени проекта и блокировке внешнего сервиса.
Коротко: секретные ключи должны жить на сервере, а frontend должен обращаться к безопасному backend-слою.Почему это происходит
Проблема появляется, когда frontend напрямую обращается к API, который требует приватный ключ, или когда env-переменные сборки ошибочно считают защищенными после попадания в bundle.
Что проверить сначала
- есть ли ключи в исходном HTML или JS bundle
- какие API вызываются напрямую из браузера
- можно ли ограничить ключ доменом
- нужна ли ротация уже раскрытого секрета
- какие права есть у ключа
Как я решаю такую задачу
Я сначала оцениваю масштаб утечки, затем переношу опасные операции на backend и ограничиваю права ключей.
- нахожу секреты в frontend
- определяю, что уже нужно перевыпустить
- создаю backend endpoint или proxy
- ограничиваю ключи по правам и доменам
- проверяю, что bundle больше не содержит секреты
Что подготовить
- ссылку на сайт или репозиторий
- какие сервисы подключены
- где используются ключи
- доступ к backend или хостингу
- какие ключи можно перевыпустить
Каким должен быть результат
После исправления frontend не должен содержать приватные ключи, а все опасные запросы должны проходить через backend с проверками и логами.
Чего лучше не делать
Не считайте переменные сборки секретными, если они попадают в клиентский bundle. В браузере их можно увидеть.
FAQ
Можно ли хранить публичный ключ?
Да, если сервис специально выдает public key с ограниченными правами.
Нужно ли менять уже засвеченный ключ?
Да, если это приватный ключ или токен с доступом к данным.
Помогает ли минификация?
Нет, она не защищает секреты.
Что делать с картами и виджетами?
Использовать публичные ключи с ограничением по домену и лимитам.
Нужна похожая задача?
Напишите в Telegram @rabotator_support или оставьте заявку на сайте. Коротко опишите проблему, приложите ссылку или пример ошибки, и я скажу, как безопасно подойти к исправлению.
Итог
Секреты в клиентском JavaScript - это не мелкая недоработка, а реальный риск, который нужно закрывать архитектурно.