Des configurations incorrectes des serveurs WebAuthn peuvent entraîner des problèmes d'UX et perturber les passkeys existants. Ce guide aide les développeurs à configurer les serveurs 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.
Les passkeys et le protocole sous-jacent WebAuthn révolutionnent le paysage de l'authentification. Cependant, configurer correctement un serveur WebAuthn peut s'avérer délicat. Les erreurs de configuration peuvent non seulement introduire des vulnérabilités, mais aussi rendre inutilisables les passkeys existants si vous devez les modifier plus tard. Cet article de blog devrait vous aider à mieux comprendre les spécifications souvent complexes de WebAuthn et vous conseiller sur les meilleurs paramètres pour votre cas d'usage.
Recent Articles
📝
Comment construire un vérificateur d'identifiants numériques (Guide du développeur)
📝
Comment créer un émetteur d'identifiants numériques (Guide du développeur)
📖
Clé résidente WebAuthn : les informations d'identification détectables en tant que passkeys
🔑
Accès par badge physique et Passkeys : Guide technique
🔑
MFA obligatoire et transition vers les Passkeys : les bonnes pratiques
WebAuthn fonctionne avec trois entités principales :
Ci-dessous, nous décrivons le flux de données de haut niveau lors d'un processus d'authentification (connexion ou inscription).
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.
Plus de 10 000 développeurs font confiance à Corbado et rendent Internet plus sûr avec les passkeys. Des questions ? Nous avons rédigé plus de 150 articles de blog sur les passkeys.
Rejoindre la communauté PasskeysLe flux de processus de haut niveau décrit ci-dessus concerne les processus d'inscription et de connexion WebAuthn. Les passkeys sont construits sur WebAuthn. À l'origine, le terme « passkeys » était utilisé comme un terme plus mémorable et moins technique que WebAuthn pour décrire la même chose. De plus, les passkeys offrent plus de fonctionnalités que le standard WebAuthn, par exemple la possibilité de synchroniser les passkeys via des comptes cloud ou des gestionnaires de mots de passe.
Pour mieux comprendre les sections suivantes, nous allons définir quelques termes importants du protocole WebAuthn afin d'avoir une compréhension commune.
Les clés résidentes (RK) et les clés non résidentes (NRK) sont deux types de clés cryptographiques utilisées dans le protocole WebAuthn. Elles diffèrent principalement par leur lieu de stockage et leur mécanisme de récupération.
Définition :
Les clés résidentes sont stockées directement sur l'authentificateur lui-même. Il peut s'agir d'une clé de sécurité (par exemple, une YubiKey), d'une enclave sécurisée de plateforme (par exemple, l'enclave sécurisée de l'iPhone) ou d'un module de plateforme de confiance (TPM) sur un ordinateur portable. L'interface utilisateur conditionnelle (remplissage automatique des passkeys) ne fonctionne que pour les clés résidentes, et le groupe de travail WebAuthn exige actuellement que les clés résidentes soient considérées comme des passkeys.
Les clés résidentes sont aussi souvent appelées « informations d'identification détectables » (discoverable credentials), car le client peut découvrir une liste de clés possibles depuis l'authentificateur qui correspondent à l'ID de la Partie de confiance (rpID) en question et afficher une liste des identifiants utilisateur possibles / stockés (par exemple, e-mails, numéros de téléphone, noms d'utilisateur) de l'appareil.
Dans la capture d'écran suivante, vous voyez une liste de toutes les clés résidentes (Credential ID, rpID, nom d'utilisateur, nom d'affichage) qui sont stockées sur une YubiKey. Les clés non résidentes ne figurent pas dans la liste, car elles ne sont pas stockées sur l'authentificateur :
Flux de connexion :
Source : William Brown
Lors du processus de connexion, la Partie de confiance envoie une requête sans spécifier d'informations d'identification au client (navigateur), qui commence à interroger l'authentificateur (ici dans le graphique : clé de sécurité). L'authentificateur découvre toutes les clés résidentes pour la Partie de confiance correspondante et le client (navigateur) sélectionne la clé résidente souhaitée. Cette clé résidente est utilisée pour signer le défi. La signature est envoyée de l'authentificateur via le client à la Partie de confiance.
Avantages :
Inconvénients :
Cas d'usage : Idéal pour les appareils où l'utilisateur s'authentifie fréquemment, comme les smartphones personnels ou les ordinateurs portables.
Définition :
Les clés non résidentes, en revanche, ne sont pas stockées sur l'authentificateur. Au lieu de cela, l'authentificateur génère une nouvelle paire de clés (basée sur sa clé maîtresse protégée en interne) et envoie la clé publique de cette nouvelle paire de clés au serveur (Partie de confiance) avec le Credential ID (qui contient une graine ou seed) lors de l'inscription. Le serveur associe alors cette clé publique au compte de l'utilisateur. Pour les authentifications ultérieures, l'authentificateur dérive à nouveau la clé privée en recevant le Credential ID, en extrayant la graine et en la combinant avec la clé maîtresse. Parce que la clé n'est disponible que temporairement dans la mémoire protégée de l'authentificateur, elle est parfois appelée clé éphémère en langage cryptographique.
Les clés non résidentes sont aussi souvent appelées « informations d'identification non détectables » (non-discoverable credentials), car l'authentificateur ne peut pas découvrir / rechercher des clés pour un ID de Partie de confiance (rpID) spécifique. Sans le Credential ID, l'authentificateur ne sait même pas qu'il pourrait y avoir une clé.
Flux de connexion :
Source : William Brown
Lors du processus de connexion, la Partie de confiance doit d'abord identifier quel utilisateur demande l'authentification (par exemple, en demandant un identifiant utilisateur, comme un e-mail, un numéro de téléphone ou un nom d'utilisateur), puis envoie les Credential IDs qu'elle connaît pour l'utilisateur demandeur au client (navigateur). Le client les transmet à l'authentificateur (ici : clé de sécurité). L'authentificateur utilise le Credential ID avec la clé maîtresse de l'authentificateur pour dériver la clé privée temporaire, signe le défi avec la clé générée et le renvoie au client (ici : navigateur), qui le transmet à la Partie de confiance. Les clés non résidentes étaient initialement utilisées comme deuxième facteur avant l'introduction des passkeys. Par conséquent, l'identification de l'utilisateur en premier lieu faisait partie du processus de connexion normal.
Avantages :
Inconvénients :
Cas d'usage : Idéal pour les authentificateurs itinérants comme les clés de sécurité (par exemple, les YubiKeys) qui sont utilisées sur plusieurs services ou plateformes.
Imaginez que vous avez une clé de sécurité (par exemple, une YubiKey) et que vous l'enregistrez auprès de deux services en ligne : le service A et le service B. Pour le service A, vous utilisez une clé résidente. Pour le service B, une clé non résidente. Lorsque vous vous authentifiez auprès du service A, il vous suffit de toucher votre clé de sécurité (par exemple, YubiKey) et vous êtes connecté - pas besoin de spécifier un nom d'utilisateur. Pour le service B, vous devez d'abord fournir votre nom d'utilisateur dans le navigateur / l'application native. Le service envoie alors le Credential ID associé à votre clé de sécurité (par exemple, YubiKey), qui régénère alors la clé privée éphémère pour l'authentification.
En substance, bien que les clés résidentes et non résidentes améliorent la sécurité en tirant parti de l'authentification cryptographique, leurs expériences utilisateur et leurs mécanismes de stockage diffèrent, répondant à des cas d'usage variés.
L'interface utilisateur conditionnelle (Conditional UI) est une fonctionnalité phare des passkeys / WebAuthn. Elle soulage encore plus l'utilisateur, qui non seulement n'a pas besoin de se souvenir d'un mot de passe, mais n'a pas non plus besoin de se souvenir de l'identifiant utilisateur (par exemple, e-mail, numéro de téléphone, nom d'utilisateur) avec lequel il s'est inscrit auprès d'une Partie de confiance. C'est un grand pas en avant, surtout dans les cas où les services des Parties de confiance ne sont utilisés qu'occasionnellement.
Cela fonctionne car dès que la page de connexion est ouverte, le serveur de la Partie de confiance envoie un défi en arrière-plan au client (rappelez-vous qu'il n'y a pas de Credential ID à envoyer dans cet appel). Le client prend ce défi, vérifie quels passkeys correspondent à l'ID de la Partie de confiance sur cet authentificateur et propose la sélection via le menu de remplissage automatique, où l'utilisateur peut sélectionner le passkey approprié.
De plus, cela évite à l'utilisateur un clic supplémentaire sur le bouton de connexion, car dès que le passkey est sélectionné dans le menu de remplissage automatique, le processus de connexion démarre.
L'interface utilisateur conditionnelle (remplissage automatique des passkeys) ne fonctionne que pour les clés résidentes.
Le CTAP est un protocole fondamental de la norme FIDO2, comblant le fossé de communication entre les clients (comme les navigateurs) et les authentificateurs (comme les clés de sécurité, par exemple les YubiKeys, ou les smartphones). Pour mieux comprendre le CTAP, jetons d'abord un bref coup d'œil aux différentes versions du protocole avant d'analyser l'impact sur les clés résidentes et non résidentes.
La version antérieure, souvent appelée Universal 2nd Factor (U2F), était principalement conçue pour l'authentification à deux facteurs. Dans U2F, le serveur fournit un défi, et l'authentificateur fournit une réponse, prouvant la possession de la clé privée. Cependant, U2F ne prend pas en charge les clés résidentes, ce qui signifie qu'il nécessite toujours une recherche côté serveur pour identifier quelle clé utiliser pour un utilisateur, car cela faisait partie du processus lors de la demande d'un deuxième facteur.
Successeur de U2F, CTAP2 a introduit la prise en charge des clés résidentes, permettant une authentification sans mot de passe et sans nom d'utilisateur. Avec les clés résidentes, l'authentificateur stocke le nom d'utilisateur et le Credential ID (avec l'ID de la Partie de confiance), éliminant le besoin pour le serveur de la Partie de confiance de le fournir lors de l'authentification. C'est un bond en avant significatif vers une UX plus fluide.
Cependant, CTAP2 présente des défis. Un problème notable est la gestion des clés résidentes. Par exemple, la suppression d'une clé résidente spécifique dans un appareil CTAP2.0 nécessite souvent une réinitialisation complète de l'appareil (votre clé maîtresse est donc également réinitialisée, ce qui signifie que toutes vos clés non résidentes ne fonctionneront plus), ce qui n'est pas convivial et peut être problématique dans les scénarios où plusieurs clés résidentes sont stockées sur un seul appareil. Cela fait des clés résidentes sur un appareil CTAP2.0 un engagement sérieux. Vous ne voulez vraiment pas remplir accidentellement cet espace limité que vous avez souvent, en particulier sur les clés de sécurité (par exemple, les YubiKeys).
CTAP2.1 est une version ultérieure de CTAP2, apportant des fonctionnalités et des améliorations supplémentaires au protocole. Voici quelques points clés sur CTAP 2.1 :
Après avoir examiné les clés résidentes, les clés non résidentes et les différentes versions de CTAP, nous allons maintenant analyser plus en profondeur le côté de la Partie de confiance et donc le côté serveur WebAuthn.
La flexibilité (mais aussi la complexité) de WebAuthn est largement attribuée à ses paramètres de serveur, en particulier au sein de l'objet authenticatorSelection. Cet objet guide le client dans la sélection du bon authentificateur pour la tâche.
{ "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 } }
Cette option de serveur spécifie comment l'authentificateur est attaché à l'appareil client. Elle donne des indications sur la manière dont l'authentificateur communique avec le client :
Valeurs possibles
Cas d'usage et exemples
Dans la spécification WebAuthn de niveau 1, cette option de serveur s'appelait
requireResidentKey
et pouvait prendre les valeurs booléennes true
(l'authentificateur
doit créer une clé résidente) ou false
(l'authentificateur doit créer une clé non
résidente).
WebAuthn Niveau 2
a remplacé cette option de serveur par la nouvelle option residentKey
:
Valeurs possibles
Cas d'usage et exemples
La vérification de l'utilisateur fait référence au processus qui garantit que la personne interagissant avec l'authentificateur est le propriétaire légitime, généralement en exigeant un geste d'authentification spécifique comme la saisie d'un code PIN, la fourniture d'une empreinte digitale ou l'utilisation de la reconnaissance faciale.
Parfois, la présence de l'utilisateur (UP) est également mentionnée ou utilisée de manière similaire à la vérification de l'utilisateur, mais il y a quelques différences. La présence de l'utilisateur confirme seulement que quelqu'un - n'importe qui - est physiquement présent et interagit avec l'appareil. Elle ne vérifie pas l'identité de cette personne. Un simple contact sur une clé de sécurité, sans autre contrôle d'identité, peut suffire pour la présence de l'utilisateur. Pour les passkeys / WebAuthn, l'utilisateur doit toujours être présent.
Valeurs possibles
Cas d'usage et exemples
Modèle
Exemple : Une application d'entreprise souhaite que les employés se connectent sans mot de passe sur leurs ordinateurs portables fournis par l'entreprise en utilisant les lecteurs d'empreintes digitales intégrés. L'information d'identification est stockée sur l'appareil, et l'utilisateur doit se vérifier avec une empreinte digitale à chaque fois.
Modèle
Exemple : Un utilisateur enregistre une clé de sécurité (par exemple, une YubiKey) pour sa banque en ligne. Il peut utiliser cette clé pour s'authentifier sur n'importe quel appareil en présentant la clé de sécurité (par exemple, YubiKey), sans avoir besoin de saisir un nom d'utilisateur.
De nombreuses clés de sécurité matérielles (par exemple, les YubiKeys) ont des contraintes de stockage inhérentes. Cette limitation est due à la mémoire physique disponible sur l'appareil et aux considérations de conception du fabricant.
Exemple : Une YubiKey peut avoir la capacité de stocker seulement 20 clés résidentes. Une fois cette limite atteinte, aucune clé résidente supplémentaire ne peut être ajoutée sans en supprimer d'existantes.
Solution :
Différents authentificateurs peuvent gérer les demandes de clés résidentes différemment. Certains peuvent par défaut créer une clé résidente même si ce n'est pas explicitement demandé, tandis que d'autres peuvent nécessiter une instruction explicite.
Le comportement incohérent pour différentes options de
serveur WebAuthn sur différentes plateformes est
un problème majeur. Par exemple, iOS créera toujours
une clé résidente quelles que soient les options de
serveur WebAuthn transmises, tandis
qu'Android nécessite une adhésion explicite (par
exemple, avec residentKey: preferred
ou residentKey: required
).
Outre le comportement, ce qui est encore pire, c'est que sur la base des données stockées côté serveur, vous ne pouvez pas dire avec une certitude de 100 % si une information d'identification stockée est une clé résidente ou une clé non résidente. Au lieu de cela, vous pouvez suivre quelques vérifications et affiner votre estimation (voir ci-dessous), mais vous devez toujours espérer que le comportement de l'information d'identification est conforme à ce que vous croyez.
La raison en est qu'il existe une suggestion WebAuthn pour stocker des informations sur le
type d'information d'identification (clé résidente ou clé non résidente) dans
l'extension des propriétés de l'information d'identification
(clientExtensionResults.credProps.rk
qui est soit true
soit false
). Cependant, la
fourniture de cette information à la RP n'est pas garantie car toutes les extensions
WebAuthn sont facultatives, par exemple iOS ne
l'envoie pas (vous ne savez donc pas si c'est une clé résidente ou non résidente).
Au cours de nos recherches, nous avons essayé de tester le comportement sur différentes
plateformes et authentificateurs (Windows 10, Windows 11,
Android 7,
Android 13,
iOS 17, macOS Ventura, YubiKey) avec deux pages de
démonstration WebAuthn qui fournissent plus de détails sur les informations
d'identification créées : https://webauthn.io et
https://webauthntest.identitystandards.io/.
Cette dernière offre la possibilité de travailler avec l'ancienne propriété
requireResidentKey
(WebAuthn Niveau 1) et même de la combiner avec la propriété
residentKey
(WebAuthn Niveau 2). Cependant, les résultats n'étaient pas fiables (par
exemple, il indiquait une clé non résidente pour iOS
alors que l'interface utilisateur conditionnelle fonctionnait
clairement).
Le schéma de vérification le plus fiable que nous avons trouvé est le suivant :
credProps.rk
est-elle prise en charge et stockée dans l'information
d'identification sur le serveur ?
credProps.rk = true
, l'information d'identification est une clé résidentecredProps.rk = false
, l'information d'identification est une clé non résidentecredProps
est vide, alors le type d'information d'identification est inconnuComme vous pouvez le voir, cela aide à affiner, mais l'option inconnue demeure et vous ne pouvez pas déterminer le type de clé avec une certitude de 100 %.
Ceci est également conforme aux conclusions de William Brown de SUSE dans son excellent article soulignant comment les clés de sécurité (par exemple, les YubiKeys) pourraient être inutiles si les clés résidentes sont requises par les Parties de confiance (nous avons étendu son tableau) :
Dans le tableau, vous voyez pour différentes options de clé résidente du serveur WebAuthn si une clé résidente a été créée (true), si une clé non résidente a été créée (false) ou si autre chose s'est produit.
Solution :
residentKey
sur
required
(notez que cela peut entraîner d'autres défis avec
les authentificateurs à capacité de clé résidente limitée, voir ci-dessus).Si un utilisateur atteint la limite de stockage sur sa clé de sécurité (par exemple, YubiKey), il peut rencontrer des erreurs ou être incapable d'enregistrer de nouvelles informations d'identification. Cela peut entraîner confusion et frustration.
Solution :
Comme vous l'avez vu ci-dessus, les paramètres de serveur WebAuthn que vous choisissez peuvent avoir un impact significatif sur l'expérience utilisateur et la sécurité de votre processus d'authentification. Il est essentiel de comprendre les nuances de ces paramètres pour prendre des décisions éclairées.
Clés résidentes vs non résidentes : Si une majorité de vos utilisateurs accèdent principalement à votre service depuis des appareils personnels comme des smartphones ou des ordinateurs portables, les clés résidentes sont un choix approprié. Les clés résidentes sont stockées sur l'appareil lui-même et offrent une expérience d'authentification fluide pour les utilisateurs qui utilisent fréquemment le même appareil. Cependant, pour les utilisateurs qui utilisent des clés de sécurité (par exemple, des YubiKeys), les clés non résidentes peuvent être plus appropriées.
Paramètres de vérification de l'utilisateur (UV) : Selon le niveau de sécurité que
vous souhaitez atteindre, vous pouvez décider de la rigueur du processus de
vérification de l'utilisateur. Si vous visez une
sécurité élevée, exiger un code PIN, une empreinte digitale ou une reconnaissance faciale
(userVerification: preferred
ou userVerification: required
) est conseillé.
Attestation et fiabilité : L'attestation vous permet de vérifier l'origine et l'intégrité de l'authentificateur. Décidez si vous voulez faire confiance à tous les authentificateurs ou seulement à ceux de fabricants spécifiques. Cela peut être crucial si vous traitez des données sensibles et que vous voulez vous assurer que seuls des authentificateurs de haute qualité et fiables sont utilisés.
Mécanismes de secours : Ayez toujours un mécanisme de secours en place. Si un utilisateur perd son authentificateur ou s'il fonctionne mal, il doit avoir un autre moyen d'accéder à son compte. Cela pourrait être par des codes de secours, une vérification par SMS, des liens magiques par e-mail ou d'autres méthodes d'authentification multifacteur.
Formation continue : Le paysage des passkeys et de WebAuthn est en constante évolution. Restez à jour avec les derniers développements, vulnérabilités et correctifs. Encouragez votre équipe de développement à participer à des ateliers, des webinaires et des conférences sur les passkeys et WebAuthn.
Intégration et éducation des utilisateurs : Lorsque vous introduisez l'authentification par passkey, assurez-vous que vos utilisateurs comprennent ses avantages et son fonctionnement. Offrez des instructions claires pendant le processus d'inscription et fournissez des ressources (comme des FAQ ou des tutoriels vidéo) pour aider les utilisateurs à configurer et à utiliser les passkeys.
En adhérant à ces bonnes pratiques, les développeurs et les chefs de produit peuvent s'assurer qu'ils mettent en œuvre l'authentification par passkey efficacement, en équilibrant à la fois la sécurité et l'expérience utilisateur.
Si vous souhaitez mettre en œuvre des passkeys pour une adoption grand public sur votre site web ou votre application et que vous n'avez pas besoin de prendre en charge les clés de sécurité (par exemple, les YubiKeys), car la plupart de vos utilisateurs utiliseront simplement leur smartphone ou leur ordinateur portable, nous vous recommandons les paramètres suivants.
Avantages :
Les paramètres du serveur WebAuthn, bien que complexes, offrent un cadre robuste et flexible pour l'authentification. Maîtriser ces paramètres est crucial, car il ne s'agit pas seulement de mettre en œuvre une nouvelle norme ; il s'agit d'améliorer fondamentalement la sécurité et l'efficacité de l'authentification des utilisateurs.
En substance, comprendre les paramètres du serveur WebAuthn est un investissement dans la création d'applications plus sécurisées, efficaces et tournées vers l'avenir. À mesure que le paysage numérique évolue, être bien informé sur de telles technologies sera indispensable. Pour rester à jour, rejoignez notre communauté sur les passkeys ou abonnez-vous à notre newsletter ci-dessous.
Related Articles
Table of Contents