Ключи API и безопасность
Ключ API — это деньги и доступ. Урок о том, как его не потерять и не слить.
Ключ API — секретная строка, по которой провайдер опознаёт ваш аккаунт и списывает оплату за использование. Кто владеет ключом — тратит ваш бюджет.
Главное правило: ключ не попадает в код
Самая частая и самая дорогая ошибка — записать ключ прямо в исходник и закоммитить в git. Боты сканируют публичные репозитории за минуты; утёкший ключ начинают использовать сразу, и счёт может вырасти на тысячи долларов. Даже приватный репозиторий — плохое место для секрета: его видят все участники, он остаётся в истории коммитов навсегда.
# ТАК ДЕЛАТЬ НЕЛЬЗЯ — ключ в коде
api_key = "sk-ant-api03-СЕКРЕТ..." # утечёт при первом же коммите
Правильно: переменные окружения
Ключ держат в переменной окружения, а код читает её во время запуска. В коде — только имя переменной, не значение.
# Локально (один раз в сессии терминала)
export ANTHROPIC_API_KEY="sk-ant-..."
export OPENAI_API_KEY="sk-..."
import os
import anthropic
# SDK сам читает ANTHROPIC_API_KEY из окружения
client = anthropic.Anthropic()
# Или явно — но значение всё равно берём из окружения, не из строки
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
Файл .env и .gitignore
Для удобства локальной разработки секреты складывают в файл .env (его читает, например, библиотека python-dotenv). Этот файл обязательно добавляют в .gitignore, чтобы он не попал в репозиторий.
# .gitignore
.env
.env.local
# .env (НЕ коммитим!)
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
Никогда — во фронтенде
Ключ нельзя класть в код браузерного приложения (React, Vue, мобильный клиент). Всё, что выполняется у пользователя, можно прочитать через DevTools. Запросы к LLM делает ваш бэкенд, который хранит ключ у себя; фронтенд обращается к вашему серверу, а не к провайдеру напрямую.
В продакшене — секрет-менеджер
На сервере переменные окружения задают через настройки платформы (Docker secrets, Kubernetes Secrets, AWS Secrets Manager, Vault, переменные в панели хостинга). Принцип тот же: значение секрета нигде не в коде и не в образе контейнера.
Что делать, если ключ всё-таки утёк
- Немедленно отозвать (revoke) ключ в консоли провайдера — старый перестаёт работать.
- Создать новый и обновить переменные окружения.
- Проверить расходы за период утечки.
Итог
- Ключ — в переменных окружения, никогда в коде и не в git.
.env— в.gitignore.- Из браузера/мобильного клиента к LLM не ходят напрямую — только через свой бэкенд.
- Утёк — сразу отзывайте.