¿Cuál es el punto de actualizar el token?

Tengo que confesar que he tenido esta pregunta durante mucho tiempo, nunca entendí realmente.

digamos que el token de autenticación es como una llave para una caja fuerte, cuando caduca ya no se puede usar. ahora recibimos un token de actualización mágica, que se puede usar para obtener otra clave utilizable, y otra... hasta que la clave mágica expire. Entonces, ¿por qué no simplemente establecer la caducidad del token de autenticación como el token de actualización? ¿Por qué molestarse en absoluto?

¿Cuál es la razón válida para ello, tal vez histórica? realmente quiero saber Gracias

preguntado el 22 de mayo de 12 a las 14:05

el token de actualización NO se trata de actualizar la función del usuario o revocar el acceso, ni se trata de solicitar el usuario/pase solo por primera vez. Puede lograr todo eso con solo un token de acceso. Se trata principalmente de reducir el servicio de ataque. Para más ver aquí -

5 Respuestas

Estaba leyendo un artículo el otro día por Taiseer Joudeh y me parece muy útil dijo:

En mi opinión, hay tres beneficios principales para usar tokens de actualización, que son:

  1. Actualización del contenido del token de acceso: como sabe, los tokens de acceso son tokens autónomos, contienen todos los reclamos (información) sobre el usuario autenticado una vez que se generan, ahora si emitimos un token de larga duración (1 mes, por ejemplo) para un usuario llamado "Alex" y lo inscribió en el rol "Usuarios", luego esta información se incluye en el token que generó el servidor de Autorización. Si decidió más tarde (2 días después de que obtuvo el token) agregarlo al rol de "Administrador", entonces no hay forma de actualizar esta información contenida en el token generado, debe pedirle que se vuelva a autenticar nuevamente. por lo que el servidor de Autorización agrega esta información a este token de acceso recién generado, y esto no es factible en la mayoría de los casos. Es posible que no pueda llegar a los usuarios que obtuvieron tokens de acceso de larga duración. Entonces, para superar este problema, debemos emitir tokens de acceso de corta duración (30 minutos, por ejemplo) y usar el token de actualización para obtener un nuevo token de acceso. Una vez que obtenga el nuevo token de acceso, el servidor de autorización podrá agregar un nuevo reclamo para el usuario. "Alex", que lo asigna al rol de "Administrador" una vez que se genera el nuevo token de acceso

  2. Revocación del acceso de usuarios autenticados: una vez que el usuario obtiene un token de acceso de larga duración, podrá acceder a los recursos del servidor siempre que su token de acceso no haya caducado. No existe una forma estándar de revocar los tokens de acceso a menos que el servidor de autorización implemente una lógica personalizada. lo que lo obliga a almacenar el token de acceso generado en la base de datos y realizar comprobaciones de la base de datos con cada solicitud. Pero con los tokens de actualización, un administrador del sistema puede revocar el acceso simplemente eliminando el identificador del token de actualización de la base de datos, de modo que una vez que el sistema solicite un nuevo token de acceso utilizando el token de actualización eliminado, el servidor de autorización rechazará esta solicitud porque el token de actualización ya no está disponible. (Vamos a entrar en esto con más detalles).

  3. No es necesario almacenar ni solicitar el nombre de usuario y la contraseña: el uso de tokens de actualización le permite solicitar al usuario su nombre de usuario y contraseña solo una vez una vez que se autentica por primera vez, luego el Servidor de autorización puede emitir un token de actualización de larga duración (1 año para ejemplo) y el usuario permanecerá conectado durante todo este período a menos que el administrador del sistema intente revocar el token de actualización. Puede pensar en esto como una forma de acceder sin conexión a los recursos del servidor, esto puede ser útil si está creando una API que será consumida por la aplicación front-end donde no es factible seguir solicitando el nombre de usuario/contraseña con frecuencia.

respondido 05 mar '15, 21:03

¿Por qué no un token de acceso de corta duración en el que se comprueban las credenciales cuando ha caducado? Si el usuario aún es válido, restablezca el vencimiento del token de acceso. No entiendo la necesidad de un token de actualización. - Rick alegre

"... contienen todos los reclamos (Información) sobre el usuario autenticado una vez que se generan..." Y aquí pensé que poner cualquier información relacionada con el usuario, incluso si está encriptada, en un token se considera una mala práctica. - bklaric

Bueno, depende de qué información de usuario estés hablando. dice "Toda la información de reclamos" no toda la información del usuario - Kiarash

@RickJolly: los tokens de acceso generalmente incluyen suficiente información para identificar al usuario y su función, sin necesidad de acceder a la base de datos. Esto generalmente se logra con un token firmado y encriptado (por ejemplo, firma hmac). Un solo carácter agregado, eliminado o cambiado en el contenido original le brinda un token firmado completamente diferente. Entonces, si después de firmar y cifrar "userid:alex;role:user;client:foobar.com;ts:1552806134" el token se ve como 'kE4ia6', se verá completamente diferente para "userid:alex;role:admin;client: barbaz.net;ts:1552806565", aunque sea el mismo usuario. - miguel ekoka

@RickJolly: un token de actualización, por otro lado, es solo una clave opaca que apunta a un solo usuario. Debe consultar la base de datos para encontrar a quién pertenece cada vez (golpe de rendimiento). En efecto, es una representación ofuscada de las credenciales del usuario. Entonces, en lugar de almacenar nombre de usuario: contraseña en su cliente, puede almacenarlo en su lugar (mejor práctica). En un nuevo proyecto, puede usarlo de la misma manera que usa un token de acceso, pero debido a las limitaciones mencionadas anteriormente, es posible que desee algo más escalable. La configuración del token de actualización/token de acceso es una buena opción. - miguel ekoka

Me gustaría añadir a esto otra perspectiva.

Autenticación sin estado sin tocar la base de datos en cada solicitud

Supongamos que desea crear un mecanismo de seguridad sin estado (sin sesión) que pueda realizar la autenticación de millones de usuarios, sin tener que realizar una llamada a la base de datos para realizar la autenticación. ¡Con todo el tráfico que recibe su aplicación, vale mucho la pena guardar una llamada DB en cada solicitud! Y debe ser sin estado para que pueda agruparse fácilmente y ampliarse a cientos o incluso miles de servidores.

Con las sesiones antiguas, el usuario inicia sesión, momento en el que leemos su información de usuario de la base de datos. Para evitar tener que leerlo una y otra vez, lo almacenamos en una sesión (generalmente en la memoria o en algún caché agrupado). Enviamos el ID de sesión al cliente en una cookie, que se adjunta a todas las solicitudes posteriores. En solicitudes posteriores, usamos el ID de sesión para buscar la sesión, que a su vez contiene la información del usuario.

Ponga la información del usuario directamente en el token de acceso

Pero no queremos sesiones. Entonces, en lugar de almacenar la información del usuario en la sesión, simplemente pongámosla en un token de acceso. Firmamos el token para que nadie pueda manipularlo y listo. Podemos autenticar solicitudes sin una sesión y sin tener que buscar la información de usuario de la base de datos para cada solicitud.

Sin sesión ... ¿no hay forma de prohibir a los usuarios?

Pero no tener una sesión tiene un gran inconveniente. ¿Qué pasa si este usuario está prohibido, por ejemplo? En el escenario anterior, simplemente eliminamos su sesión. Luego tiene que volver a iniciar sesión, lo que no podrá hacer. Prohibición completada. Pero en el nuevo escenario no hay sesión. Entonces, ¿cómo podemos prohibirlo? Tendríamos que pedirle (muy cortésmente) que elimine su token de acceso. ¿Comprobar cada solicitud entrante con una lista de prohibición? Sí, funcionaría, pero ahora nuevamente tenemos que hacer esa llamada a la base de datos que no queremos.

Compromiso con tokens de corta duración

Si creemos que es aceptable que un usuario aún pueda usar su cuenta durante, digamos, 10 minutos después de haber sido prohibido, podemos crear una situación que sea un compromiso entre verificar la base de datos cada solicitud y solo al iniciar sesión. Y ahí es donde entran los tokens de actualización. Nos permiten usar un mecanismo sin estado con tokens de acceso de corta duración. No podemos revocar estos tokens ya que no se realiza una verificación de la base de datos para ellos. Solo comparamos su fecha de caducidad con la hora actual. Pero una vez que caduquen, el usuario deberá proporcionar el token de actualización para obtener un nuevo token de acceso. En este punto, verificamos la base de datos y vemos que el usuario ha sido prohibido. Entonces denegamos la solicitud de un token de acceso y la prohibición entra en vigor.

Respondido 24 Oct 16, 21:10

"Pero una vez que caduquen, el usuario deberá proporcionar el token de actualización para obtener un nuevo token de acceso". ¿Por qué un token de actualización? ¿Por qué no volver a validar al usuario en función de las credenciales en el token original y luego, si es válido, restablecer la fecha de vencimiento de ese token? - Rick alegre

@RickJolly Porque el token de acceso generalmente no contiene credenciales (tampoco el token de actualización). La forma en que funciona es que los tokens están firmados por el emisor. Entonces, el emisor sabe que los tokens son válidos (hasta que caduquen). Por lo general, el token contiene cosas como el nombre de usuario y los roles/permisos que tiene el usuario. Ambas partes pueden usar el token para mostrar dicha información sin tener que hacer primero llamadas a la base de datos/red. - Stijn de Witt

Ok, gracias, pero si ignoramos lo que escribí sobre la revalidación del usuario en función de las credenciales en el token de acceso (que podría ser simplemente una verificación de que la identificación del usuario todavía está permitida), todavía no veo ninguna razón para actualizar el token. Y esa es mi pregunta: "¿Por qué un token de actualización?" - Rick alegre

@RickJolly Punto tomado. Supongo que los diseñadores del protocolo concluyeron que es más fácil dividir las dos tareas: proporcionar el token de acceso para todas las acciones y proporcionar un token de actualización solo para obtener un token de acceso. Esto pone la responsabilidad de actualizar en manos de los clientes, reduciendo la complejidad para el servidor. - Stijn de Witt

La respuesta a la que se hace referencia (a través de @Anders) es útil, dice:

En caso de compromiso, la ventana de tiempo para la que es válido es limitada, pero los tokens se usan sobre SSL, por lo que es poco probable que se vean comprometidos.

Creo que la parte importante es que los tokens de acceso a menudo se registran (especialmente cuando se usan como un parámetro de consulta, lo cual es útil para JSONP), por lo que es mejor que duren poco.

Hay algunas razones adicionales, con implementaciones a gran escala de OAuth 2.0 por parte de los proveedores de servicios:

  1. Los servidores API pueden validar de forma segura los tokens de acceso sin búsquedas en bases de datos ni llamadas RPC si está bien no preocuparse por la revocación. Esto puede tener fuertes beneficios de rendimiento y reducir la complejidad de los servidores API. Es mejor si está de acuerdo con que la revocación de un token tome 30-60 m (o cualquiera que sea la longitud del token de acceso). Por supuesto, los servidores API también podrían mantener una lista en memoria de los tokens revocados en la última hora.

  2. Dado que los tokens pueden tener múltiples ámbitos con acceso a múltiples servicios de API diferentes, tener tokens de acceso de corta duración impide que un desarrollador del servicio de API obtenga acceso de por vida a los datos de un usuario en el servicio de API B. La compartimentación es buena para la seguridad.

Respondido el 07 de Septiembre de 17 a las 08:09

Gracias. sin embargo, creo que ambas razones adicionales no son lo suficientemente fuertes. 1, para los sitios grandes que tienen millones de aplicaciones, es imposible mantener todos los tokens de acceso en la memoria, las búsquedas de db o las llamadas rpc son inevitables. por supuesto que no tengo datos para respaldar mi argumento. 2, creo que el alcance de los tokens de acceso es el mismo que el de los tokens de actualización, al menos en la implementación de Google. por lo tanto, el ataque de alcance cruzado no es posible incluso si se filtra el token de actualización. - Wangii

Creo que evitar que los tokens de acceso se registren es una mejor razón, pero solo fuerte si el sitio A está autorizado por el usuario B para acceder a la información del emisor C, y de alguna manera el token se envía a la cuarta parte. me parece que sucede si el sitio A está alojado en el servidor de la cuarta parte... pero si la cuarta parte tiene acceso total al servidor, sigue siendo inútil, ¿verdad? - Wangii

@wangii - Re n.º 1: los tokens de acceso pueden autovalidarse mediante encriptación o firmas, por lo que no es necesario realizar búsquedas en bases de datos ni llamadas RPC. Los tokens de actualización pueden permanecer opacos y revocables en el proveedor de OAuth. Re #2 - Sí, el alcance de los tokens de acceso es el mismo. Sin embargo, dar a un desarrollador del servicio (A) acceso de por vida a los datos de un usuario en el servicio (B) es mucho peor que darle acceso solo cuando el usuario está usando activamente el servicio (A). - ryan boyd

no entiendo eso También debe verificar un token de actualización en la base de datos/sesión, haciéndolo con estado. Además, debe cifrar el token de actualización antes de almacenarlo y verificarlo en la lista negra, lo que genera una sobrecarga adicional. Dado un token de acceso de corta duración, es posible que tenga que hacer esta verificación mucho... ¿puede aclararlo? - html_programador

@KimGysen lo siento, no estoy seguro de qué parte no entiendes. Un token de actualización debe verificarse con una base de datos o una lista de revocación, pero la idea es que un token de acceso se use muchas veces para cada actualización. (es decir, XX o XXX solicitudes de API. - ryan boyd

Respuesta posible más corta:

Los tokens de actualización permiten tiempos de decaimiento diferentes o de ámbito de los tokens. Los tokens de recursos reales son de corta duración, mientras que el token de actualización puede seguir siendo válido durante años (aplicaciones móviles). Esto viene con mejor seguridad (los tokens de recursos no tienen que estar protegidos) y rendimiento (solo la API del token de actualización tiene que verificar la validez con la base de datos).

Respondido 05 ago 16, 22:08

Esta me parece la mejor y más clara respuesta... gracias. - jess

Lo siguiente es una adición a los beneficios de los tokens de actualización que ya se mencionaron.

¡Seguridad primero!

Los tokens de acceso son de corta duración. Si alguien roba un token de acceso, tendrá acceso a los recursos solo hasta que expire el token de acceso.

"... Pero, ¿y si se roba un token de actualización?"

Si un atacante roba el token de actualización, puede obtener un token de acceso. Por esta razón, se recomienda que se emita un nuevo token de actualización cada vez que se obtenga un nuevo token de acceso. Si el mismo token de actualización se usa dos veces, probablemente signifique que el token de actualización ha sido robado.

Cuando el token de actualización cambia después de cada uso, si el servidor de autorización alguna vez detecta que se usó dos veces un token de actualización, significa que es probable que un atacante lo haya copiado y lo esté utilizando, y el servidor de autorización puede revocar todos los tokens de acceso y tokens de actualización asociados. con ella inmediatamente.

https://www.oauth.com/oauth2-servers/making-authenticated-requests/refreshing-an-access-token/

Por supuesto, esto es solo otra capa de seguridad. El atacante aún puede tener tiempo para obtener tokens de acceso, hasta que el token de actualización se use por segunda vez (ya sea por el atacante o por el usuario real).

Tenga siempre en cuenta que el token de actualización debe almacenarse de la forma más segura posible.

Respondido el 23 de enero de 22 a las 22:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.