Секреты и API-ключи: ловушка открытого ключа
Секрет — это всё, что даёт доступ: ключи (Application Programming Interface), пароли от базы, токены платёжных провайдеров, ключи подписи. Самая частая — и самая дорогая — ошибка vibe coding заключается в том, чтобы один из них утёк.
Две ловушки ловят людей постоянно:
- Секреты в клиентском коде. Всё, что находится в вашем фронтенде (JavaScript, который выполняется в браузере), — публично. Пользователи могут открыть dev tools и прочитать это. AI, которого попросили вызвать API из React-компонента, с радостью вставит ваш секретный ключ прямо туда — и теперь любой, кто зайдёт на ваш сайт, может его скопировать и накрутить вам счёт. Секретным ключам место на сервере, а не в коде, который уходит в браузер.
- Секреты в репозитории. Ключ, захардкоженный в файле, попадает в коммит . Даже если вы потом его удалите, он навсегда останется в истории git, а боты сканируют публичные репозитории ровно на это в течение нескольких минут после push.
Правильный дом для секрета — это переменная окружения (env): значение, которое подаётся приложению во время выполнения и полностью держится вне кода:
// VULNERABLE: ключ в исходниках, попадёт в коммит git
const stripe = new Stripe("sk_live_51H8xQ2eZvK...");
// SAFE: ключ читается из окружения, никогда не пишется в коде
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
У секрета ровно один безопасный дом — на стороне сервера, прочитанный из окружения. Браузер — это публичное место: всё, что отправлено туда, может прочитать любой, кто откроет dev-инструменты.
┌──────────────────────────────────────────┐
│ .env (в gitignore, не коммитить) │
│ STRIPE_SECRET_KEY=sk_live_... │
└───────────────────┬──────────────────────┘
│ внедряется в старт
▼
┌──────────────────────┐ ┌──────────────────────┐
│ SERVER │ │ BROWSER (клиент) │
│ process.env.KEY ✓ │ ✗──────│ доступно всем │
│ вызов Stripe тут │ НИКОГДА │ dev tools · "view │
│ │ не шли │ source" · network │
└──────────────────────┘ сюда └──────────────────────┘
безопасно: приватно публично: = утечка
Добавьте .env (и .env.local, и т. д.) в свой .gitignore до того, как напишете хоть один секрет. Если ключ всё-таки попал в код или историю, считайте его сгоревшим: ротируйте его (сгенерируйте новый и отзовите старый) — удалить строку недостаточно, потому что старый ключ всё ещё действителен и всё ещё гуляет где-то снаружи.