Guías JWT

Cómo depuro JWT key rotation sin romper verification

Reviso kid, old/new JWKS keys, cache refresh, token lifetime y la diferencia entre rollover planificado y revocación urgente para mantener verification segura.

Por JWTDecoder.toolsÚltima verificación 2026-09-13

Voz editorial: la primera persona describe el flujo de trabajo documentado de JWTDecoder.tools; JWTDecoder.tools es el editor y autor organizacional.

KEY A → A + B → KEY B
KEY A → A + B → KEY B · TTL · cache · exp

Cuando verification empieza a fallar justo alrededor de un cambio de signing key, lo trato como key lifecycle problem, no solo como invalid signature. El token puede estar bien y el verifier también; el fallo puede estar en overlap old/new, selección por kid o cache de JWKS.

Mi pregunta central es:

¿El token está firmado con una key que el verifier todavía puede encontrar y confiar durante el lifetime restante del token?

Empiezo con JWKS Validator si tengo token y current key set.

Paso 1: leo kid, issuer y expiration

{
  "alg": "RS256",
  "kid": "signing-key-2026-09"
}
{
  "iss": "https://login.example.com/",
  "exp": 1789203600
}

Necesito saber quién debería poseer la key, qué kid selecciona el token y cuánto tiempo debería seguir verificando.

Paso 2: comparo kid con current JWKS

Durante una rotación normal puedo esperar old/new public keys simultáneamente:

{
  "keys": [
    { "kid": "signing-key-2026-06", "kty": "RSA", "alg": "RS256", "use": "sig" },
    { "kid": "signing-key-2026-09", "kty": "RSA", "alg": "RS256", "use": "sig" }
  ]
}

Si un token old aún no expiró pero su key desapareció, reviso si se eliminó demasiado pronto o estoy mirando wrong issuer/environment.

Paso 3: planned rollover no es emergency revocation

En planned rotation suelo mantener old verification key el tiempo necesario para tokens ya emitidos.

En emergency rotation por compromise, mantener old key confiable puede ser lo incorrecto. Tokens aún no expirados pueden tener que invalidarse inmediatamente.

Por eso no creo una regla universal “old key siempre hasta el último exp”.

Paso 4: inspecciono cache de JWKS

Busco:

  • cache TTL;
  • refresh controlado ante unknown kid;
  • caches en gateway/framework;
  • instances con estados diferentes;
  • CDN/proxy stale;
  • errores que dejan old JWKS fijado indefinidamente.

Un kid miss puede justificar refresh desde la trusted JWKS location, no desde una URL elegida por el token.

Paso 5: confirmo que new key pertenece al issuer correcto

expected issuer
      ↓
trusted metadata/config
      ↓
trusted JWKS
      ↓
matching kid
      ↓
compatible JWK
      ↓
signature verification

No considero una rotation correcta si production token se verifica con un staging key set accidental.

La guía de issuer validation cubre esa relación.

Paso 6: reviso key metadata

Aunque kid coincida, reviso kty, alg, use y key_ops cuando existen. El token algorithm y key type deben ser compatibles.

Además, allowed algorithms vienen de application config.

Paso 7: comparo timing de rotation y token lifetime

11:59 token firmado con old key
12:00 new signing key activo
12:01 old public key eliminado
12:30 old token todavía tiene 29 minutos de vida

En planned rollover eso crea un verification gap.

El overlap debe considerar maximum token lifetime, cache y buffer operativo. No es un número fijo definido por JWT.

Paso 8: reproduzco con old y new token

Comparo un token inmediatamente anterior y otro posterior a rotation contra current trusted JWKS.

Así separo missing old key, missing new key, stale cache, wrong issuer y un signature problem independiente.

Si aparece kid not found, uso la guía de JWT kid.

No desactivo verification para salvar el rollout

Si new key aún no llegó, arreglo publication/cache/distribution. No convierto temporalmente la API en un sistema que acepte claims sin firma.

Mi secuencia saludable para planned rotation

1. Publicar new public key en trusted JWKS
2. Mantener old public key
3. Empezar a firmar con new private key / kid
4. Verifiers aceptan old y new
5. Esperar fin de old-token acceptance window
6. Retirar old public key cuando policy lo permita

Mi checklist de key rotation

  1. Leo iss, alg, kid, exp.
  2. Confirmo expected issuer.
  3. Inspecciono current trusted JWKS.
  4. Busco token kid.
  5. Reviso kty, alg, use, key_ops.
  6. Verifico con JWKS Validator.
  7. Reviso cache age y refresh.
  8. Comparo token lifetime con old-key availability.
  9. Distingo rollover de emergency revocation.
  10. Mantengo signature verification activa.

JWT key rotation es coordinar token lifetime, publicación de public keys, key selection, cache refresh e issuer trust, no solo cambiar una private key.

Fuentes y referencias

Guías relacionadas