Understanding WebAuthn credential protection policy
Recorded: May 24, 2026, 8:58 p.m.
| Original | Summarized |
Understanding WebAuthn credential protection policy Understanding WebAuthn credential protection policy This post assumes you're already familiar with the basics of When creating a WebAuthn credential, you can specify whether it should be const credential = await navigator.credentials.create({ However, the relying party cannot control when or how the credential can be const credential = await navigator.credentials.create({ If the default value userVerificationOptional is used, the It’s important to highlight that the extension controls credential discovery The related enforceCredentialProtectionPolicy extension input As for browser support for the extension inputs, Chrome and Firefox support Browsers can also silently apply a default value if the relying party does If residentKey is preferred or If residentKey is required and The specific behavior is documented in the |
The management of WebAuthn credential protection policy extends the control over when and how a credential can be discovered, particularly addressing security concerns related to physical access to authenticators. This control is defined through the credentialProtectionPolicy extension input, which is part of the CTAP 2.1 specification governing interactions between platforms, browsers, and roaming authenticators such as security keys. When creating a WebAuthn credential, the residentKey option allows specifying discoverability, but the relying party cannot entirely dictate the timing or method of discovery. To enhance security, the credentialProtectionPolicy extension allows defining specific policies regarding discovery. The available values for this policy dictate the level of user verification required for credential discovery. If the default value userVerificationOptional is used, the credential can be discovered and utilized without any user verification. Conversely, using userVerificationOptionalWithCredentialIDList prevents discovery without user verification, but permits discovery if the relying party provides the credential ID. This aligns with the security of non-discoverable credentials. The most restrictive setting is userVerificationRequired, which mandates that the credential cannot be discovered or used unless explicit user verification has occurred. It is crucial to note that while this extension controls discovery within the authenticator, the relying party retains the responsibility to verify whether the subsequent assertion was made with the required user verification. The enforceCredentialProtectionPolicy extension input governs the behavior when an authenticator lacks support for the credential protection policy. Setting this to true ensures that the operation will fail if the authenticator cannot create a credential at the specified security level. However, this setting should generally only be enabled if allowing roaming authenticators is desired, as setting it to true can cause the request to be rejected if a non-roaming authenticator, which does not support the policy, is used, even if the browser supports it. Browser support for these extension inputs varies; Chrome and Firefox support them, whereas Safari ignores them. Browsers can also silently apply default values if the relying party omits specification, a behavior explicitly noted in Chrome. Chrome applies specific logic based on the interaction between residentKey and user verification preferences. If residentKey is preferred or required, Chrome utilizes userVerificationOptionalWithCredentialIDList to mitigate the risk of physical access revealing registered accounts. If residentKey is required and user verification is preferred, Chrome defaults to userVerificationRequired. Although this outcome is not directly related to credential discovery, it serves as a mechanism to enforce user verification as a necessary safety measure. Chrome assumes that the credential is frequently used for a single authentication step, especially in contexts like passkey authentication, where the preference for optional verification is common. Nonetheless, because user verification remains optional, the reliance party must implement proper enforcement during the authentication process to prevent unauthorized access based solely on physical possession of the authenticator. The specific operational details of these behaviors are further documented in the Chromium documentation. |