JWKS-кэширование в jose строится вокруг механизма
createRemoteJWKSet, который решает задачу получения и
переиспользования JSON Web Key Set без постоянных сетевых запросов к
провайдеру идентификации. При корректной настройке кэша достигается
баланс между актуальностью ключей и производительностью проверки
JWT.
При верификации JWT с асимметричным алгоритмом (например, RS256, ES256) библиотеке требуется публичный ключ. Вместо хранения ключей локально используется JWKS endpoint, который возвращает набор ключей в формате JSON.
jose при использовании:
import { createRemoteJWKSet } from 'jose'
const JWKS = createRemoteJWKSet(new URL('https://example.com/.well-known/jwks.json'))
создаёт функцию-резолвер ключей, которая:
kidКлючевая идея заключается в том, что повторные проверки токенов не должны каждый раз инициировать сетевой запрос.
Внутренний кэш createRemoteJWKSet работает как in-memory
структура, привязанная к экземпляру функции. Он хранит:
kidПри последующих вызовах происходит:
Основной параметр управления временем жизни кэша —
cacheMaxAge. Он определяет, как долго JWKS считается
валидным без повторного запроса.
const JWKS = createRemoteJWKSet(
new URL('https://example.com/.well-known/jwks.json'),
{
cacheMaxAge: 60 * 60 * 1000 // 1 час
}
)
Выбор TTL напрямую влияет на поведение системы:
Практически TTL выбирается исходя из политики ротации ключей у провайдера идентификации.
Помимо cacheMaxAge, в jose присутствуют
дополнительные механизмы защиты от перегрузки и некорректных
обновлений.
Ограничивает частоту повторных запросов при ошибках или отсутствующих ключах.
const JWKS = createRemoteJWKSet(url, {
cooldownDuration: 30 * 1000
})
Поведение:
Определяет максимальное время ожидания ответа JWKS endpoint.
const JWKS = createRemoteJWKSet(url, {
timeoutDuration: 5000
})
Это важно для предотвращения блокировки потока проверки JWT при медленных или недоступных сервисах.
В разных версиях и конфигурациях можно встретить:
cacheMaxAge — основное управление TTLЕсли сервер возвращает:
Cache-Control: max-age=3600
то библиотека может учитывать это значение как ориентир, если явно не переопределено конфигурацией.
При ротации ключей важно понимать, что JWKS содержит набор ключей одновременно. Это означает:
Кэш в jose не ломает этот процесс, поскольку:
kid, а не по позицииПроблема возникает только при слишком длинном TTL, когда новый ключ ещё не загружен, а старый уже отозван.
Обычно используют TTL в диапазоне:
Для систем с высокой нагрузкой важно учитывать:
Практический подход:
Если TTL превышает жизненный цикл ключей:
invalid signatureЕсли createRemoteJWKSet вызывается на каждый запрос:
При нестабильном JWKS endpoint возможен:
Если endpoint временно недоступен:
Такой подход делает систему устойчивой к кратковременным сбоям внешнего провайдера.
Система кэширования строится на трёх слоях:
cacheMaxAgecooldownDuration и
timeoutDurationЭта комбинация позволяет добиться предсказуемой проверки JWT при минимальном количестве сетевых запросов и контролируемой актуальности криптографических ключей.