API-ключи
Секретная строка, которую приложение прикладывает к каждому запросу, чтобы API понял, кто обращается, и посчитал лимиты и оплату.
Что такое API-ключ
API-ключ (API key) — длинная случайная строка, которую сервис выдаёт при регистрации приложения. Клиент прикладывает её к каждому запросу, а сервер по ключу понимает, кто пришёл: какие права у этого клиента, сколько запросов ему положено и кому выставить счёт.
Ключ — это одновременно логин и пароль в одной строке. Отдельного имени пользователя нет: кто предъявил ключ, тот и владелец. Отсюда все правила обращения с ним — как с паролем, а не как с идентификатором.
sk_live_51H8xY2eZvKq3mN7pR4tW9dF1
└──┬──┘└─┬┘└──────────┬──────────┘
тип среда случайная часть
Многие сервисы делают префикс осмысленным: по нему видно тип и среду (test или live), а автоматические сканеры находят утёкшие ключи в публичных репозиториях именно по такому префиксу.
Как передают ключ
# Заголовок Authorization — самый распространённый вариант
curl https://api.example.com/v1/orders \
-H "Authorization: Bearer $API_KEY"
# Отдельный заголовок — тоже нормально
curl https://api.example.com/v1/orders \
-H "X-API-Key: $API_KEY"
# Query-параметр — так делать не надо
curl "https://api.example.com/v1/orders?api_key=$API_KEY"
Третий вариант встречается в старых API, но он плох: query-строка оседает в логах Nginx, в истории браузера, в заголовке Referer и в системах мониторинга. Ключ, попавший в логи, считайте скомпрометированным. Передавать ключ можно только по HTTPS: в открытом HTTP он летит по сети текстом.
Ключ, JWT и OAuth
| API-ключ | JWT | OAuth | |
|---|---|---|---|
| Кого опознаёт | приложение | пользователя или сервис | пользователя через провайдера |
| Срок жизни | до отзыва | минуты или часы | токен обновляется |
| Содержит данные | нет, просто строка | да, права и срок внутри | зависит от потока |
| Проверка | поиск в хранилище | подпись, без обращения к БД | по протоколу |
| Где уместен | сервер-сервер, интеграции | сессии пользователей, SPA | вход через чужой аккаунт |
Практическое правило: API-ключ — для машин, токен — для людей. Ключ в браузерном JavaScript — это ключ, опубликованный в интернете: код фронтенда открыт любому. Если фронтенду нужен внешний API, запрос проксируют через свой бэкенд, а ключ остаётся на сервере.
Как хранить и не потерять
- Переменные окружения, не код. Ключ читают из окружения или файла
.env, который добавлен в.gitignore. Захардкоженный ключ уезжает в репозиторий навсегда — удаление в новом коммите не помогает, история остаётся. - Секреты в CI. В CI/CD ключи кладут в secrets, а не в текст пайплайна. Значение маскируется в логах сборки.
- Хранилище секретов. Для команды и нескольких окружений — HashiCorp Vault или встроенный secrets-механизм Kubernetes: доступ по ролям и журнал обращений.
- Минимум прав. Если сервис умеет ограничивать ключ областью (только чтение) и списком IP — используйте это. Ключ читалки, попавший наружу, не спишет деньги.
- Ротация. Отдельный ключ на каждое приложение и окружение и плановая замена. Хороший API позволяет держать два активных ключа одновременно — чтобы менять без простоя.
- Отзыв. Утёк — отзывайте немедленно, а не после разбирательства. Проверьте историю вызовов: чужие запросы обычно видны по всплеску активности.
# Ключ живёт в окружении, а не в исходниках
export OPENAI_API_KEY="sk-..."
python app.py
import os
api_key = os.environ["API_KEY"] # падаем сразу, если ключа нет
Ключ от платного API — это ваши деньги. Утёкший ключ к сервису с GPU-инференсом чужие люди утилизируют быстрее, чем вы заметите счёт, поэтому лимиты трат и алерты на аномальный расход настраивают заранее.
Связанные термины
- API — то, к чему открывает доступ ключ
- JWT и токены — альтернатива для пользовательских сессий
- OAuth — делегированный доступ без передачи пароля
- Аутентификация — общий контекст проверки, кто обращается
- HashiCorp Vault — где хранить ключи командой
- URI и query-параметры — почему ключу не место в URL
Готовы запустить GPU-задачу?
Запустить GPU-сервер