Una configuración incorrecta en los ajustes del servidor WebAuthn puede generar problemas de experiencia de usuario (UX) e interrumpir las passkeys existentes. Esta guía ayuda a los desarrolladores a configurar servidores WebAuthn.
Vincent
Created: August 20, 2025
Updated: August 21, 2025
See the original blog version in English here.
Our mission is to make the Internet a safer place, and the new login standard passkeys provides a superior solution to achieve that. That's why we want to help you understand passkeys and its characteristics better.
Las passkeys y el protocolo subyacente WebAuthn están revolucionando el panorama de la autenticación. Sin embargo, configurar un servidor WebAuthn de la manera correcta puede ser una tarea complicada. Una configuración incorrecta no solo puede introducir vulnerabilidades, sino también inutilizar las passkeys existentes si necesitas cambiarlas más adelante. El siguiente artículo te ayudará a comprender mejor las especificaciones, a menudo complejas, de WebAuthn y te dará consejos sobre qué ajustes son los mejores para tu caso de uso.
Recent Articles
📝
Cómo construir un verificador de credenciales digitales (Guía para desarrolladores)
📝
Cómo construir un emisor de credenciales digitales (Guía para desarrolladores)
📖
Clave residente de WebAuthn: credenciales descubribles como passkeys
🔑
Acceso con tarjetas físicas y Passkeys: Guía técnica
🔑
MFA obligatoria y transición a Passkeys: Buenas prácticas
WebAuthn opera con tres entidades principales:
A continuación, se describe el flujo de datos de alto nivel durante un proceso de autenticación (ya sea inicio de sesión o registro).
Ben Gould
Head of Engineering
I’ve built hundreds of integrations in my time, including quite a few with identity providers and I’ve never been so impressed with a developer experience as I have been with Corbado.
Más de 10 000 desarrolladores confían en Corbado y hacen que Internet sea más seguro con passkeys. ¿Tienes preguntas? Hemos escrito más de 150 artículos de blog sobre passkeys.
Únete a la comunidad de PasskeysEl flujo de proceso de alto nivel descrito anteriormente detalla los procesos de registro e inicio de sesión de WebAuthn. Las passkeys se basan en WebAuthn. Originalmente, el término passkeys se usaba como un término más memorable y menos técnico que WebAuthn para describir lo mismo. Además, las passkeys ofrecen más funciones en comparación con el estándar WebAuthn, como la posibilidad de sincronizar passkeys a través de cuentas en la nube o gestores de contraseñas.
Para comprender mejor las siguientes secciones, definiremos algunos términos importantes en el protocolo WebAuthn para tener un entendimiento común.
Las claves residentes (RKs) y las claves no residentes (NRKs) son dos tipos de claves criptográficas utilizadas en el protocolo WebAuthn, y se diferencian principalmente en su ubicación de almacenamiento y mecanismo de recuperación.
Definición:
Las claves residentes se almacenan directamente en el propio autenticador. Este podría ser una llave de seguridad (por ejemplo, YubiKey), un enclave seguro de la plataforma (por ejemplo, el Secure Enclave del iPhone) o un módulo de plataforma segura (TPM) en un portátil. La IU condicional (autorrelleno de passkeys) solo funciona con claves residentes y el grupo de trabajo de WebAuthn actualmente requiere que las claves residentes se consideren como una passkey.
A las claves residentes a menudo se las llama también credenciales descubribles, porque el cliente puede descubrir una lista de posibles claves del autenticador que coinciden con el ID de la Relying Party (rpID) en cuestión y mostrar una lista de posibles / almacenados user handles (por ejemplo, correos electrónicos, números de teléfono, nombres de usuario) del dispositivo.
En la siguiente captura de pantalla, se ve una lista de todas las claves residentes (ID de credencial, rpID, nombre de usuario, nombre para mostrar) que están almacenadas en una YubiKey. Las claves no residentes no están en la lista, ya que no se almacenan en el autenticador:
Flujo de inicio de sesión:
Fuente: William Brown
Durante el proceso de inicio de sesión, la Relying Party envía una solicitud sin especificar credenciales al cliente (navegador), que comienza a consultar al autenticador (en el gráfico: llave de seguridad). El autenticador descubre todas las claves residentes para la Relying Party correspondiente y el cliente (navegador) selecciona la clave residente deseada. Esta clave residente se utiliza para firmar el desafío. La firma se envía desde el autenticador a través del cliente a la Relying Party.
Ventajas:
Desventajas:
Casos de uso: Ideal para dispositivos donde el usuario se autentica con frecuencia, como smartphones o portátiles personales.
Definición:
Las claves no residentes, en cambio, no se almacenan en el autenticador. En su lugar, el autenticador genera un nuevo par de claves (basado en su clave maestra protegida internamente) y envía la clave pública de este nuevo par de claves al servidor (Relying Party) junto con el ID de credencial (que contiene una semilla) durante el registro. El servidor asocia entonces esta clave pública con la cuenta del usuario. Para autenticaciones posteriores, el autenticador vuelve a derivar la clave privada al recibir el ID de credencial, extrayendo la semilla y combinándola con la clave maestra. Debido a que la clave solo está disponible temporalmente en la memoria protegida del autenticador, a veces se le llama clave efímera en el lenguaje criptográfico.
A las claves no residentes también se las suele llamar credenciales no descubribles, porque el autenticador no puede descubrir / buscar claves para un ID de Relying Party (rpID) específico. Sin el ID de la credencial, el autenticador ni siquiera sabe que podría haber una clave.
Flujo de inicio de sesión:
Fuente: William Brown
Durante el proceso de inicio de sesión, la Relying Party primero debe identificar qué usuario está solicitando la autenticación (por ejemplo, pidiendo un user handle, como correo electrónico, número de teléfono o nombre de usuario) y luego envía los ID de credencial que conoce para el usuario solicitante al cliente (navegador). El cliente los reenvía al autenticador (aquí: llave de seguridad). El autenticador utiliza el ID de la credencial junto con la clave maestra del autenticador para derivar la clave privada temporal, firma el desafío con la clave generada y la devuelve al cliente (aquí: navegador), que la reenvía a la Relying Party. Las claves no residentes se usaban originalmente como segundo factor antes de la introducción de las passkeys. Por lo tanto, identificar primero al usuario era parte del proceso de inicio de sesión regular.
Ventajas:
Desventajas:
Casos de uso: Ideal para autenticadores itinerantes como las llaves de seguridad (por ejemplo, YubiKeys) que se utilizan en múltiples servicios o plataformas.
Imagina que tienes una llave de seguridad (por ejemplo, YubiKey) y la registras en dos servicios en línea: Servicio A y Servicio B. Para el Servicio A, usas una clave residente. Para el Servicio B, una clave no residente. Cuando te autenticas en el Servicio A, simplemente tocas tu llave de seguridad (por ejemplo, YubiKey) y ya estás dentro, sin necesidad de especificar un nombre de usuario. Para el Servicio B, primero proporcionarías tu nombre de usuario en el navegador / aplicación nativa. El servicio envía entonces el ID de credencial asociado a tu llave de seguridad (por ejemplo, YubiKey), que luego regenera la clave privada efímera para la autenticación.
En esencia, aunque tanto las claves residentes como las no residentes mejoran la seguridad al aprovechar la autenticación criptográfica, sus experiencias de usuario y mecanismos de almacenamiento difieren, atendiendo a casos de uso variados.
La IU condicional es una característica fundamental de las passkeys / WebAuthn. Simplifica aún más las cosas para el usuario, ya que este no solo no necesita recordar una contraseña, sino que tampoco necesita recordar el user handle (por ejemplo, correo electrónico, número de teléfono, nombre de usuario) con el que se registró en una Relying Party. Especialmente en casos donde los servicios de las Relying Parties se usan solo ocasionalmente, este es un gran paso.
Esto funciona porque tan pronto como se abre la página de inicio de sesión, el servidor de la Relying Party envía un desafío en segundo plano al cliente (recuerda que no se requiere enviar un ID de credencial en esta llamada). El cliente toma este desafío y comprueba qué passkeys coinciden con el ID de la Relying Party en este autenticador y ofrece la selección a través del menú de autorrelleno, donde el usuario puede seleccionar la passkey apropiada.
Además, también le ahorra al usuario un clic adicional en el botón de inicio de sesión, porque tan pronto como se selecciona la passkey del menú de autorrelleno, comienza el proceso de inicio de sesión.
La IU condicional (autorrelleno de passkeys) solo funciona para claves residentes.
El CTAP es un protocolo fundamental en el estándar FIDO2, que cierra la brecha de comunicación entre clientes (como navegadores) y autenticadores (como llaves de seguridad, por ejemplo, YubiKeys, o smartphones). Para comprender mejor el CTAP, echemos un primer vistazo breve a las diferentes versiones del protocolo antes de analizar el impacto en las claves residentes y no residentes.
La versión anterior, a menudo denominada Universal 2nd Factor (U2F), fue diseñada principalmente para la autenticación de segundo factor. En U2F, el servidor proporciona un desafío y el autenticador proporciona una respuesta, demostrando la posesión de la clave privada. Sin embargo, U2F no admite claves residentes, lo que significa que siempre requiere una búsqueda del lado del servidor para identificar qué clave usar para un usuario, ya que esto era parte del proceso al solicitar un segundo factor.
El sucesor de U2F, CTAP2, introdujo el soporte para claves residentes, permitiendo la autenticación sin contraseña y sin nombre de usuario. Con las claves residentes, el autenticador almacena el nombre de usuario y el ID de credencial del usuario (junto con el ID de la Relying Party), eliminando la necesidad de que el servidor de la Relying Party lo proporcione durante la autenticación. Este es un salto significativo hacia una experiencia de usuario más fluida.
Sin embargo, CTAP2 viene con desafíos. Un problema notable es la gestión de las claves residentes. Por ejemplo, eliminar una clave residente específica en un dispositivo CTAP2.0 a menudo requiere un restablecimiento completo del dispositivo (lo que también restablece tu clave maestra, lo que significa que todas tus claves no residentes tampoco funcionarán), lo cual no es fácil para el usuario y puede ser problemático en escenarios donde se almacenan múltiples claves residentes en un solo dispositivo. Esto hace que las claves residentes en un dispositivo CTAP2.0 sean un compromiso serio. Realmente no quieres llenar accidentalmente ese espacio limitado que a menudo tienes, especialmente en las llaves de seguridad (por ejemplo, YubiKeys).
CTAP2.1 es una versión posterior de CTAP2, que aporta características y mejoras adicionales al protocolo. Algunos puntos clave sobre CTAP 2.1 incluyen:
Después de haber echado un vistazo a las claves residentes, las claves no residentes y las diferentes versiones de CTAP, ahora analizaremos el lado de la Relying Party y, por lo tanto, el lado del servidor WebAuthn con más profundidad.
La flexibilidad de WebAuthn (pero también su complejidad) se atribuye en gran medida a la configuración de su servidor, particularmente dentro del objeto authenticatorSelection. Este objeto guía al cliente en la selección del autenticador adecuado para la tarea.
{ "rp": { "name": "corbado.com", "id": "corbado.com" }, "user": { "id": "dGVzdefEyMjE", "name": "test-username", "displayName": "test-username" }, "challenge": "mhanjsapJjCNaN_Ttasdfk1C0DymR-V_w_0UVOPsdfdfJG2ON_FK5-ODtqp33443tgqHzuuDjv-NUUmMAE4hg", "pubKeyCredParams": [ { "type": "public-key", "alg": -7 }, { "type": "public-key", "alg": -257 } ], "timeout": 60000, "excludeCredentials": [], "authenticatorSelection": { "authenticatorAttachment": "platform", "residentKey": "preferred", "requireResidentKey": false, "userVerification": "preferred" }, "attestation": "none", "extensions": { "credProps": true } }
Esta opción de servidor especifica cómo está conectado el autenticador al dispositivo cliente. Proporciona información sobre cómo el autenticador se comunica con el cliente:
Valores posibles
Casos de uso y ejemplos
En la especificación WebAuthn Nivel 1, esta opción de servidor se llamaba
requireResidentKey
y podía tener los valores booleanos true
(el autenticador debe
crear una clave residente) o false
(el autenticador debe crear una clave no residente).
WebAuthn Nivel 2
reemplazó esta opción de servidor con la nueva opción de servidor residentKey
:
Valores posibles
Casos de uso y ejemplos
La verificación del usuario se refiere al proceso que garantiza que la persona que interactúa con el autenticador es el propietario legítimo, generalmente requiriendo un gesto de autenticación específico como introducir un PIN, proporcionar una huella dactilar o usar reconocimiento facial.
A veces, la presencia del usuario (UP) también se menciona o se usa de manera similar a la verificación del usuario, pero tiene algunas diferencias. La presencia del usuario solo confirma que alguien, cualquier persona, está físicamente presente e interactuando con el dispositivo. No verifica la identidad de esa persona. Un simple toque de una llave de seguridad, sin más comprobaciones de identidad, puede ser suficiente para la presencia del usuario. Para las passkeys / WebAuthn, el usuario siempre debe estar presente.
Valores posibles
Casos de uso y ejemplos
Patrón
platform
required
required
Ejemplo: Una aplicación corporativa quiere que los empleados inicien sesión sin contraseñas en sus portátiles proporcionados por la empresa utilizando los lectores de huellas dactilares integrados. La credencial se almacena en el dispositivo y el usuario debe verificar con una huella dactilar cada vez.
Patrón
cross-platform
required
required
Ejemplo: Un usuario registra una llave de seguridad (por ejemplo, YubiKey) para su banca en línea. Puede usar esta llave para autenticarse en cualquier dispositivo proporcionando la llave de seguridad (por ejemplo, YubiKey), sin necesidad de introducir un nombre de usuario.
Muchas llaves de seguridad basadas en hardware (por ejemplo, YubiKeys) tienen restricciones de almacenamiento inherentes. Esta limitación se debe a la memoria física disponible en el dispositivo y a las consideraciones de diseño del fabricante.
Ejemplo: Una YubiKey podría tener la capacidad de almacenar solo 20 claves residentes. Una vez que se alcanza este límite, no se pueden agregar claves residentes adicionales sin eliminar las existentes.
Solución:
Diferentes autenticadores pueden manejar las solicitudes de claves residentes de manera diferente. Algunos pueden crear una clave residente por defecto incluso si no se solicita explícitamente, mientras que otros pueden requerir una instrucción explícita.
El comportamiento inconsistente para diferentes opciones de
servidor WebAuthn en diferentes plataformas es un
problema importante. Por ejemplo, iOS siempre creará
una clave residente independientemente de las opciones de
servidor WebAuthn pasadas, mientras que
Android requiere una suscripción voluntaria (por
ejemplo, con residentKey: preferred
o residentKey: required
).
Además del comportamiento, es aún peor que, basándose en los datos almacenados del lado del servidor, no se puede decir con un 100 % de certeza si una credencial almacenada es una clave residente o no residente. En cambio, se pueden seguir algunas comprobaciones y acotarlo (ver más abajo), pero aún así hay que esperar que el comportamiento de la credencial sea el que uno cree.
La razón detrás de esto es que hay una
sugerencia de WebAuthn para
almacenar información sobre el tipo de credencial (clave residente o no residente) en la
extensión de propiedades de la credencial
(clientExtensionResults.credProps.rk
, que es true
o false
). Sin embargo,
proporcionar esta información a la RP no está garantizado, ya que todas las extensiones de
WebAuthn son opcionales; por ejemplo, iOS no la envía
(por lo que no se sabe si es una clave residente o no residente).
Durante nuestra investigación, intentamos probar el comportamiento en diferentes
plataformas y autenticadores (Windows 10, Windows 11,
Android 7,
Android 13, iOS17, macOS Ventura, YubiKey) con dos
páginas de demostración de WebAuthn que proporcionan más detalles sobre las credenciales
creadas: https://webauthn.io y
https://webauthntest.identitystandards.io/.
La última ofrece la posibilidad de trabajar con la propiedad heredada requireResidentKey
(WebAuthn Nivel 1) e incluso combinarla con la propiedad residentKey
(WebAuthn Nivel 2).
Sin embargo, los resultados no fueron fiables (por ejemplo, indicaba clave no residente
para iOS pero claramente funcionaba la
IU condicional).
El esquema de comprobación más fiable que encontramos es el siguiente:
residentKey: required
y se crea una credencial con éxito -> es una clave
residente.residentKey: preferred
o residentKey: discouraged
, pasa a la siguiente
comprobación.credProps.rk
y se almacena en la credencial en el servidor?
credProps.rk = true
, la credencial es una clave residente.credProps.rk = false
, la credencial es una clave no residente.credProps
está vacío, entonces el tipo de credencial es desconocido.Como puedes ver, esto ayuda a acotarlo, pero la opción desconocida persiste y no se puede determinar el tipo de clave con un 100 % de certeza.
Esto también está en línea con los hallazgos de William Brown de SUSE en su gran artículo que describe cómo las llaves de seguridad (por ejemplo, YubiKeys) podrían ser inútiles si las Relying Parties requieren claves residentes (hemos ampliado su tabla):
En la tabla, se ve para diferentes opciones de clave residente del servidor WebAuthn si se creó una clave residente (true), si se creó una clave no residente (false) o si sucedió algo más.
Solución:
residentKey
en required
(nota: esto podría llevar a otros desafíos con autenticadores con
capacidad limitada de claves residentes, ver arriba).Si un usuario alcanza el límite de almacenamiento en su llave de seguridad (por ejemplo, YubiKey), podría enfrentarse a errores o ser incapaz de registrar nuevas credenciales. Esto puede llevar a confusión y frustración.
Solución:
Como has visto anteriormente, la configuración del servidor WebAuthn que elijas puede afectar significativamente la experiencia del usuario y la seguridad de tu proceso de autenticación. Es esencial comprender los matices de esta configuración para tomar decisiones informadas.
Claves residentes vs. no residentes: Si la mayoría de tus usuarios acceden principalmente a tu servicio desde dispositivos personales como smartphones o portátiles, las claves residentes son una opción adecuada. Las claves residentes se almacenan en el propio dispositivo y ofrecen una experiencia de autenticación fluida para los usuarios que utilizan con frecuencia el mismo dispositivo. Sin embargo, para los usuarios que utilizan llaves de seguridad (por ejemplo, YubiKeys), que son claves no residentes, podría ser más apropiado.
Configuración de la verificación del usuario (UV): Dependiendo del nivel de seguridad
que desees alcanzar, puedes decidir cuán estricto debe ser el proceso de
verificación del usuario. Si buscas una alta
seguridad, es aconsejable requerir un PIN, huella dactilar o reconocimiento facial
(userVerification: preferred
o userVerification: required
).
Atestación y fiabilidad: La atestación te permite verificar el origen y la integridad del autenticador. Decide si quieres confiar en todos los autenticadores o solo en los de fabricantes específicos. Esto puede ser crucial si manejas datos sensibles y quieres asegurarte de que solo se utilicen autenticadores de alta calidad y confianza.
Mecanismos de respaldo: Siempre ten un mecanismo de respaldo. Si un usuario pierde su autenticador o si este funciona mal, debería tener una forma alternativa de acceder a su cuenta. Esto podría ser a través de códigos de respaldo, verificación por SMS, enlaces mágicos por correo electrónico u otros métodos de autenticación multifactor.
Educación continua: El panorama de las passkeys y WebAuthn está en constante evolución. Mantente actualizado con los últimos desarrollos, vulnerabilidades y parches. Anima a tu equipo de desarrollo a participar en talleres, seminarios web y conferencias relacionadas con las passkeys y WebAuthn.
Incorporación y educación del usuario: Al introducir la autenticación con passkeys, asegúrate de que tus usuarios entiendan sus beneficios y cómo funciona. Ofrece instrucciones claras durante el proceso de registro y proporciona recursos (como preguntas frecuentes o tutoriales en video) para ayudar a los usuarios a configurar y usar las passkeys.
Al adherirse a estas mejores prácticas, los desarrolladores y los gerentes de producto pueden asegurarse de que implementan la autenticación con passkeys de manera efectiva, equilibrando tanto la seguridad como la experiencia del usuario.
Si quieres implementar passkeys para una adopción generalizada en tu sitio web o aplicación y no necesitas admitir llaves de seguridad (por ejemplo, YubiKeys), ya que la mayoría de tus usuarios simplemente usarán su smartphone o portátil, recomendamos la siguiente configuración.
platform
required
required
Beneficios:
La configuración del servidor de WebAuthn, aunque compleja, ofrece un marco robusto y flexible para la autenticación. Dominar esta configuración es crucial, ya que no se trata solo de implementar un nuevo estándar; se trata de mejorar fundamentalmente la seguridad y la eficiencia de la autenticación de usuarios.
En esencia, comprender la configuración del servidor de WebAuthn es una inversión en la construcción de aplicaciones más seguras, eficientes y con visión de futuro. A medida que evoluciona el panorama digital, estar bien versado en tales tecnologías será indispensable. Para mantenerte actualizado, únete a nuestra comunidad de passkeys o suscríbete a nuestro boletín a continuación.
Related Articles
Table of Contents