Короткий ответ
Статический API-ключ прост, но сложно ротируется и не несёт встроенного срока жизни; OAuth2 client credentials даёт короткоживущие токены с возможностью централизованной ротации и отзыва через сервер авторизации; подписанный JWT, выпущенный доверенной стороной, подходит, когда нужна самодостаточная проверка без обращения к центральному серверу при каждом запросе — выбор зависит от требований к ротации, отзыву доступа и инфраструктурной сложности, которую команда готова поддерживать.
Как это работает подробнее
статический ключ сравнивается напрямую на сервере (обычно хранится как хэш); OAuth2 client credentials flow требует отдельного запроса за access-токеном к серверу авторизации перед обращением к ресурсному серверу, токен имеет TTL и подлежит обновлению; JWT содержит подписанные claims (кем выпущен, для кого, срок действия), которые ресурсный сервер может проверить локально по публичному ключу без похода к серверу авторизации на каждый запрос.
Пример кода
import jwt
from datetime import datetime, timedelta, timezone
def issue_service_token(service_name: str, private_key: str) -> str:
now = datetime.now(timezone.utc)
payload = {
"iss": "internal-auth",
"aud": "orders-service",
"sub": service_name,
"iat": now,
"exp": now + timedelta(minutes=10), # короткий TTL снижает риск долгоживущей компрометации
}
return jwt.encode(payload, private_key, algorithm="RS256")
def verify_service_token(token: str, public_key: str) -> dict:
return jwt.decode(token, public_key, algorithms=["RS256"], audience="orders-service")Что использовать на практике
- Рекомендация. для простых внутренних интеграций в контролируемой сети статический ключ с механизмом ротации (поддержка двух активных ключей на время перехода) может быть достаточным и самым простым в поддержке решением. Для интеграций с множеством внешних партнёров и требованием оперативного отзыва доступа OAuth2 даёт централизованный контроль. JWT предпочтителен при высокой частоте запросов и желании избежать дополнительного сетевого вызова на каждую проверку, но отзыв конкретного токена до истечения его срока действия сложнее (требует черного списка или короткого TTL).
Подводные камни
- Риски. использовать статический ключ без возможности ротации без даунтайма (нет поддержки одновременно двух валидных ключей на переходный период); выдавать JWT с неограниченно долгим сроком действия, теряя смысл его срочности и усложняя отзыв компрометированного токена; не проверять
aud/iss/expclaims JWT на стороне получателя, принимая токен, выпущенный для другого сервиса или уже просроченный.