DanLevy.net

Защита токенов, API‑ключей и секретов

Публичный? Приватный? Что?

Hero image for Защита токенов, API‑ключей и секретов

Когда защищать токены?

Защита API‑ключей и токенов критически важна!

Одна ошибка может привести к потере контроля над сервером и данными в руки хакеров!

Определять, должен ли конкретный токен быть скрыт, не должно быть сложно — даже опираясь на официальную документацию!

Ситуацию только усложняет «суп» из связанных терминов, с которыми вы сталкиваетесь: tokens, keys, credentials, secrets, private и public.

Переформулируем это как различие между secret и non-secret.

🔒 Secret keys

** ‼️ Важно:** Secret keys ДОЛЖНЫ игнорироваться Git‑ом И исключаться из любого кода, исполняемого в браузере. Как использовать dotenv


Как понять, что вы имеете дело с Secret key?


👍 Ориентир: серверы, которые возвращают ошибки CORS, не поддерживают работу из браузера. Это сильный сигнал, что их НАДО проксировать, рассматривая их как secret.

👍 Ориентир: дорогостоящие сервисы почти всегда следует проксировать или скрывать.

👍 Ориентир: если вы выполняете операцию записи (загрузка файла, вставка строки в БД), вероятно, имеете дело с secret keys.


Сценарии использования и возможности: Secret‑ключи

Чек‑лист: безопасное обращение с секретами

Краткий обзор

Выполните следующие шаги, чтобы удалить секреты из кода:

НЕ ДЕЛАЙТЕ создание файла .env на продакшн‑серверах. Пользуйтесь средствами управления переменными окружения, предоставляемыми вашим хостингом (например, Heroku, Netlify, AWS EC2): через панель управления или командную строку.

Связанная статья: Безопасное использование dotenv в NodeJS


🌍 Non-secret keys

👍 Правило‑навык: если ключ необходимо отправлять в браузер в коде или инлайн (например, через тег <script src="https://my-api/?apiKey=123-abc-456">), это однозначно non-secret. Типичный пример — Google Maps.


Сценарии применения и особенности: Non-secret‑ключи

✅ Обращение с non‑secret‑ключами:

Можно безопасно хардкодить non‑secret (публичные) ключи!

Упростите долгосрочное управление, вынеся их в общий config.js для вашего приложения.

Пример:

config.js
module.exports = {
googleMapsKey: '123-abc'
};
load-map.js
const config = require('./config.js');
const key = config.googleMapsKey;
const src = `//maps.googleapis.com/maps/api/js?key=${key}`;
// ...

Примечание: Существуют и другие сценарии использования переменных окружения. Некоторые из них я не охватил: CI/CD/тестирование, флаги функций и конфигурация выполнения для специальных окружений!