Ключи 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 не ходят напрямую — только через свой бэкенд.
  • Утёк — сразу отзывайте.
Проверьте себя
1. Почему нельзя хранить ключ API прямо в исходном коде?
AКод будет медленнее работать
BКлюч попадёт в git-историю и может утечь; боты сканируют репозитории и используют чужие ключи
CПровайдер запрещает длинные строки в коде
DЭто увеличивает размер программы
2. Где должен выполняться запрос к LLM в веб-приложении с фронтендом?
AВ браузере, чтобы было быстрее
BНа вашем бэкенде, который хранит ключ; фронтенд обращается к вашему серверу
CПрямо во фронтенде с ключом в коде
DВ сервис-воркере браузера
3. Что нужно сделать сразу при утечке ключа?
AСменить пароль от почты
BОтозвать (revoke) скомпрометированный ключ и выпустить новый
CПодождать, пока он истечёт сам
DУдалить аккаунт
Поддержать проект