API key — самый простой способ авторизации: вы получаете при регистрации длинную строку, и в каждом запросе её прикладываете. Сервер по строке понимает, что вы — именно ваш аккаунт.
Никаких логинов, паролей, токенов с истечением. Ключ один, живёт долго (до явного отзыва или ротации), везде один и тот же.
Как выглядит
Обычно ключ — длинная случайная строка букв и цифр, иногда с префиксом, обозначающим тип:
sk_live_4eC39HqLyjWDarjtT1zdp7dc ← Stripe (live secret key)
ghp_abcDEFghijKLMNopQRSTuv0123456789 ← GitHub personal access token
AIzaSyAbcDeF1234567890_xyzABC ← Google Maps API key
Префиксы — не обязаловка, но удобно: по первым символам видно, какой это сервис и какой тип ключа (production/test, full/scoped).
Как передаётся
Конкретный способ описан в документации каждого API. Самые частые варианты:
1. В заголовке Authorization:
const response = await fetch('https://api.example.com/v1/data', {
headers: {
'Authorization': 'Bearer sk_live_4eC39...',
},
});
Иногда без слова «Bearer» — просто значение. Иногда с другой схемой, например Authorization: Token sk_live_....
2. В кастомном заголовке:
const response = await fetch('https://api.example.com/v1/data', {
headers: {
'X-API-Key': 'sk_live_4eC39...',
},
});
3. В query-параметре (антипаттерн, но встречается у старых API):
const url = `https://api.example.com/v1/data?api_key=sk_live_...`;
const response = await fetch(url);
Способ через query опасен тем, что URL попадает в логи, в историю браузера, в заголовок Referer. Ключ постоянный — утечёт раз, утёк навсегда. Если выбора нет — пользуйтесь, но помните о риске.
Где такое работает хорошо
API key подходит, когда:
- Доступ нужен серверу-к-серверу (бэкенд вашего сайта зовёт стороннее API). Ключ лежит в переменных окружения бэка, в браузер никогда не попадает.
- API дешёвый, лимиты разумные, риск утечки приемлем (тренировочные сервисы, тестовые ключи).
- Действия идемпотентны и нечувствительны (получить погоду, получить статистику).
Где API key — плохая идея
Ключ нельзя зашивать в JS-код, который грузится в браузер. Любой пользователь откроет DevTools, скопирует ключ из сетевых запросов или прямо из исходников — и пойдёт расходовать ваш бюджет.
Если фронту нужно общаться со сторонним API, для которого нужен секретный ключ — ставите свой бэкенд-прокси: фронт идёт к /api/weather, бэкенд внутри добавляет ключ и обращается к OpenWeather. Ключ живёт только на сервере.
Из этого правила есть смягчение: некоторые сервисы делят ключи на publishable (можно публиковать в JS) и secret (только на сервере). У Stripe, например, есть pk_* и sk_*; pk_* можно использовать на фронте, но он умеет только то, что не страшно отдать в чужие руки (создать токен карты, но не списать с неё деньги).
Что делать при утечке
Любой нормальный сервис позволяет отозвать ключ в один клик из админки. Алгоритм при подозрении на утечку:
- Сразу сгенерировать новый ключ.
- Подменить старый на новый везде, где он использовался.
- Отозвать старый.
- Проверить логи на подозрительную активность за период от утечки.
Хорошие сервисы поддерживают ротацию — одновременную работу старого и нового ключа в течение некоторого срока, чтобы не было даунтайма при подмене.
Краткая шпаргалка
| Что | Хорошо для API key | Плохо для API key |
| Среда | Бэкенд (Node, Python, Go) | Браузерный JS (без публичной ветки) |
| Транспорт | Заголовок Authorization / X-API-Key | Query-параметр (попадает в логи) |
| Срок жизни | Долгий, с возможностью ротации | — |
| Чувствительность операций | Низкая или средняя | Финансы, персональные данные |
Для чувствительных операций и для веб-приложений с пользовательскими сессиями нужны более изощрённые штуки — токены с истечением. О них — следующая глава.