Esta respuesta ha sido elaborada con la ayuda de dos desarrolladores senior (John Brayton y David Jennes).
La razón principal para usar un token de actualización es reducir la superficie de ataque.
Supongamos que no hay una clave de actualización y veamos este ejemplo:
Un edificio tiene 80 puertas. Todas las puertas se abren con la misma llave. La clave cambia cada 30 minutos. Al final de los 30 minutos, tengo que darle la vieja llave al creador de llaves y obtener una nueva.
Si soy el hacker y obtengo tu llave, al final de los 30 minutos, se la enviaré al creador de llaves y obtendré una nueva llave. Voy a ser capaz de forma continua abrir todas las puertas sin tener en cuenta el cambio clave.
Pregunta: Durante los 30 minutos, ¿cuántas oportunidades de pirateo tuve contra la clave? Tuve 80 oportunidades de pirateo, cada vez que usaste la clave (piensa en esto como hacer una solicitud de red y pasar el token de acceso para identificarte). Entonces esa es la superficie de ataque 80X.
Ahora veamos el mismo ejemplo, pero esta vez supongamos que hay una clave de actualización.
Un edificio tiene 80 puertas. Todas las puertas se abren con la misma llave. La clave cambia cada 30 minutos. Para obtener una nueva clave, no puedo pasar el token de acceso anterior. Solo debo pasar la clave de actualización.
Si soy el hacker y obtengo tu clave, puedo usarla durante 30 minutos, pero al final de los 30 minutos enviarla al creador de claves no tiene ningún valor. Si lo hago, el creador de claves solo diría este token de actualización incorrecto. Para poder extender mi pirateo, tendría que hackear el servicio de mensajería al creador de llaves. El servicio de mensajería tiene una clave distinta (piense en esto como un token de actualización).
Pregunta: Durante los 30 minutos, ¿cuántas oportunidades de pirateo tuve contra la tecla de actualización? 80? No. Solo tuve 1 oportunidad de hackear. Durante el tiempo, el servicio de mensajería se comunica con el keymaker. Entonces esa es la superficie de ataque 1X. Tuve 80 oportunidades de pirateo contra la clave, pero no son buenas después de 30 minutos.
Un servidor verificaría un token de acceso basado en credenciales y firma (típicamente) de un JWT.
Una fuga de token de acceso es mala, pero una vez que expira ya no es útil para un atacante. Una pérdida de token de actualización es mucho peor, pero presumiblemente es menos probable. (Creo que hay espacio para cuestionar si la probabilidad de una fuga de token de actualización es mucho menor que la de una fuga de token de acceso, pero esa es la idea).
El punto es que el token de acceso se agrega a cada solicitud que realice, mientras que un token de actualización solo se usa durante el flujo de actualización, por lo que hay menos posibilidades de que un MITM vea el token
La frecuencia ayuda a un atacante. Heartbleed posibles fallas de seguridad similares a en SSL, las posibles fallas de seguridad en el cliente y las posibles fallas de seguridad en el servidor hacen posible la filtración.
Además, si el servidor de autorización está separado del servidor de aplicaciones que procesa otras solicitudes de clientes, ese servidor de aplicaciones nunca verá tokens de actualización. Solo verá tokens de acceso que no vivirán por mucho más tiempo.
La compartimentación es buena para la seguridad.
Por último, pero no menos importante, vea esta increíble respuesta
¿De qué NO se trata el token de actualización?
La capacidad de actualizar / revocar el nivel de acceso a través de tokens de actualización es un subproducto de elegir usar tokens de actualización, de lo contrario, un token de acceso independiente podría revocarse o modificarse su nivel de acceso cuando caduque y los usuarios obtengan un nuevo token