Configurações incorretas nas definições do servidor WebAuthn podem levar a problemas de UX e interromper passkeys existentes. Este guia ajuda os desenvolvedores a configurar servidores WebAuthn.
Vincent
Created: August 20, 2025
Updated: August 21, 2025
Passkeys Series: WebAuthn Basics
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.
As Passkeys e o protocolo subjacente WebAuthn estão a revolucionar o panorama da autenticação. No entanto, configurar um servidor WebAuthn da forma correta pode ser uma tarefa complicada. Configurações incorretas podem não só introduzir vulnerabilidades, mas também quebrar passkeys existentes se precisar de as alterar mais tarde. O seguinte artigo de blog deve ajudá-lo a entender melhor as especificações muitas vezes complexas do WebAuthn e dar-lhe conselhos sobre quais as configurações mais adequadas para o seu caso de uso.
Recent Articles
📝
Como construir um Verifier de Credenciais Digitais (Guia para Desenvolvedores)
📝
Como construir um Emissor de Credenciais Digitais (Guia para Desenvolvedores)
📖
Chave Residente WebAuthn: Credenciais Detectáveis como Passkeys
🔑
Guia Técnico: Acesso com Crachá Físico e Passkeys
🔑
Tornando o MFA Obrigatório e Adotando Passkeys: Melhores Práticas
O WebAuthn opera com três entidades principais:
Em seguida, descreve-se o fluxo de dados de alto nível durante um processo de autenticação (seja login ou registo).
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.
Mais de 10.000 desenvolvedores confiam na Corbado e tornam a Internet mais segura com passkeys. Tem perguntas? Já escrevemos mais de 150 posts no blog sobre passkeys.
Junte-se à Comunidade PasskeysO fluxo de processo de alto nível descrito acima descreve os processos de registo e login do WebAuthn. As Passkeys são construídas sobre o WebAuthn. Originalmente, o termo passkeys era usado como um termo mais memorável e não técnico do que WebAuthn para descrever a mesma coisa. Além disso, as passkeys oferecem mais funcionalidades em comparação com o WebAuthn padrão, como a possibilidade de sincronizar passkeys através de contas na nuvem ou gestores de palavras-passe.
Para entender melhor as secções seguintes, definimos alguns termos importantes no protocolo WebAuthn para termos um entendimento comum.
As chaves residentes (RKs) e as chaves não residentes (NRKs) são dois tipos de chaves criptográficas usadas no protocolo WebAuthn, e diferem principalmente no seu local de armazenamento e mecanismo de recuperação.
Definição:
As chaves residentes são armazenadas diretamente no próprio autenticador. Pode ser uma chave de segurança (por exemplo, YubiKey), um enclave seguro da plataforma (por exemplo, o Secure Enclave do iPhone), ou um módulo de plataforma confiável (TPM) num portátil. A IU Condicional (preenchimento automático de passkey) só funciona para chaves residentes e o grupo de trabalho do WebAuthn atualmente exige que as chaves residentes sejam consideradas como uma passkey.
As chaves residentes são muitas vezes também chamadas de credenciais detetáveis, porque o cliente pode descobrir uma lista de possíveis chaves do autenticador que correspondem ao ID da Relying Party (rpID) em questão e mostrar uma lista de possíveis / armazenados identificadores de utilizador (por exemplo, e-mail, números de telefone, nomes de utilizador) do dispositivo.
Na captura de ecrã seguinte, vê-se uma lista de todas as chaves residentes (ID da credencial, rpID, nome de utilizador, nome de exibição) que estão armazenadas numa YubiKey. As chaves não residentes não estão na lista, pois não são armazenadas no autenticador:
Fluxo de login:
Fonte: William Brown
Durante o processo de login, a Relying Party envia um pedido sem especificar credenciais ao cliente (navegador) que começa a consultar o autenticador (aqui no gráfico: chave de segurança). O autenticador descobre todas as chaves residentes para a Relying Party correspondente e o cliente (navegador) seleciona a chave residente desejada. Esta chave residente é usada para assinar o desafio. A assinatura é enviada do autenticador através do cliente para a Relying Party.
Vantagens:
Desvantagens:
Casos de Uso: Ideal para dispositivos onde o utilizador se autentica frequentemente, como smartphones ou portáteis pessoais.
Definição:
As chaves não residentes, em contraste, não são armazenadas no autenticador. Em vez disso, o autenticador gera um novo par de chaves (baseado na sua chave mestra protegida internamente) e envia a chave pública deste novo par para o servidor (Relying Party) juntamente com o ID da credencial (que contém uma semente) durante o registo. O servidor então associa esta chave pública à conta do utilizador. Para autenticações subsequentes, o autenticador re-deriva a chave privada ao receber o ID da credencial, extraindo a semente e combinando-a com a chave mestra. Como a chave está apenas temporariamente disponível na memória protegida do autenticador, é por vezes chamada de chave efémera em linguagem criptográfica.
As chaves não residentes são também frequentemente chamadas de credenciais não detetáveis, porque o autenticador não pode descobrir / procurar chaves para um ID de Relying Party (rpID) específico. Sem o ID da credencial, o autenticador nem sabe que pode existir uma chave.
Fluxo de login:
Fonte: William Brown
Durante o processo de login, a Relying Party deve primeiro identificar qual o utilizador que está a solicitar a autenticação (por exemplo, pedindo um identificador de utilizador, como e-mail, número de telefone ou nome de utilizador) e depois envia os IDs de credencial que conhece para o utilizador solicitante ao cliente (navegador). O cliente encaminha-os para o autenticador (aqui: chave de segurança). O autenticador usa o ID da credencial juntamente com a chave mestra do autenticador para derivar a chave privada temporária, assina o desafio com a chave gerada e devolve-o ao cliente (aqui: navegador), que o encaminha para a Relying Party. As chaves não residentes foram originalmente usadas como segundo fator antes da introdução das passkeys. Portanto, identificar o utilizador primeiro fazia parte do processo de login regular.
Vantagens:
Desvantagens:
Casos de Uso: Ideal para autenticadores de roaming como chaves de segurança (por exemplo, YubiKeys) que são usadas em múltiplos serviços ou plataformas.
Imagine que tem uma chave de segurança (por exemplo, YubiKey) e a regista em dois serviços online: Serviço A e Serviço B. Para o Serviço A, usa uma chave residente. Para o Serviço B, uma chave não residente. Quando se autentica no Serviço A, basta tocar na sua chave de segurança (por exemplo, YubiKey) e está dentro - não precisa de especificar um nome de utilizador. Para o Serviço B, primeiro forneceria o seu nome de utilizador no navegador / aplicação nativa. O serviço envia então o ID da credencial associado para a sua chave de segurança (por exemplo, YubiKey), que então re-gera a chave privada efémera para autenticação.
Em essência, enquanto ambas as chaves residentes e não residentes aumentam a segurança ao alavancar a autenticação criptográfica, as suas experiências de utilizador e mecanismos de armazenamento diferem, atendendo a casos de uso variados.
A IU Condicional é uma funcionalidade marcante das passkeys / WebAuthn. Alivia ainda mais o fardo do utilizador, pois este não só não precisa de se lembrar de uma palavra-passe, mas também não precisa de se lembrar do identificador de utilizador (por exemplo, e-mail, número de telefone, nome de utilizador) com o qual se registou numa Relying Party. Especialmente em casos onde os serviços das Relying Parties são usados apenas ocasionalmente, este é um passo enorme.
Isto funciona porque, assim que a página de login é aberta, o servidor da Relying Party envia um desafio em segundo plano para o cliente (lembre-se que não é necessário enviar um ID de credencial nesta chamada). O cliente pega neste desafio e verifica quais as passkeys que correspondem ao ID da Relying Party neste autenticador e oferece a seleção através do menu de preenchimento automático, onde o utilizador pode selecionar a passkey apropriada.
Além disso, também poupa ao utilizador um clique extra no botão de login, porque assim que a passkey é selecionada no menu de preenchimento automático, o processo de login começa.
A IU Condicional (preenchimento automático de passkeys) só funciona para chaves residentes.
O CTAP é um protocolo fundamental no padrão FIDO2, preenchendo a lacuna de comunicação entre clientes (como navegadores) e autenticadores (como chaves de segurança, por exemplo, YubiKeys, ou smartphones). Para entender melhor o CTAP, vamos dar uma primeira breve olhada nas diferentes versões do protocolo antes de analisar o impacto nas chaves residentes e não residentes.
A versão anterior, muitas vezes referida como Universal 2nd Factor (U2F), foi principalmente desenhada para autenticação de segundo fator. No U2F, o servidor fornece um desafio, e o autenticador fornece uma resposta, provando a posse da chave privada. No entanto, o U2F não suporta chaves residentes, o que significa que requer sempre uma pesquisa do lado do servidor para identificar qual a chave a usar para um utilizador, pois isto fazia parte do processo ao pedir um segundo fator.
O sucessor do U2F, o CTAP2, introduziu suporte para chaves residentes, permitindo autenticação sem palavra-passe e sem nome de utilizador. Com chaves residentes, o autenticador armazena o nome de utilizador e o ID da credencial do utilizador (juntamente com o ID da Relying Party), eliminando a necessidade de o servidor da Relying Party o fornecer durante a autenticação. Este é um salto significativo para uma UX mais fluida.
No entanto, o CTAP2 traz desafios. Um problema notável é a gestão de chaves residentes. Por exemplo, apagar uma chave residente específica num dispositivo CTAP2.0 muitas vezes requer um reset completo do dispositivo (o que significa que a sua chave mestra também é reiniciada, e todas as suas chaves não residentes deixarão de funcionar), o que não é amigável para o utilizador e pode ser problemático em cenários onde várias chaves residentes são armazenadas num único dispositivo. Isto torna as chaves residentes num dispositivo CTAP2.0 um compromisso sério. Não vai querer encher acidentalmente o espaço limitado que muitas vezes tem, especialmente em chaves de segurança (por exemplo, YubiKeys).
O CTAP2.1 é uma versão subsequente do CTAP2, trazendo funcionalidades e melhorias adicionais ao protocolo. Alguns pontos chave sobre o CTAP 2.1 incluem:
Depois de termos analisado as chaves residentes, as chaves não residentes e as diferentes versões do CTAP, analisamos agora o lado da Relying Party e, portanto, o lado do servidor WebAuthn com mais profundidade.
A flexibilidade (mas também a complexidade) do WebAuthn é largamente atribuída às suas configurações de servidor, particularmente dentro do objeto authenticatorSelection. Este objeto guia o cliente na seleção do autenticador certo para a tarefa.
{ "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 opção do servidor especifica como o autenticador está anexado ao dispositivo do cliente. Fornece informações sobre como o autenticador comunica com o cliente:
Valores Possíveis
Casos de Uso e Exemplos
Na especificação WebAuthn Nível 1, esta opção do servidor chamava-se requireResidentKey e podia conter os valores Booleanos true (o autenticador deve criar uma chave residente) ou false (o autenticador deve criar uma chave não residente). O WebAuthn Nível 2 substituiu esta opção do servidor pela nova opção residentKey:
Valores Possíveis
Casos de Uso e Exemplos
A verificação do utilizador refere-se ao processo que garante que a pessoa a interagir com o autenticador é o proprietário legítimo, tipicamente exigindo um gesto de autenticação específico como inserir um PIN, fornecer uma impressão digital ou usar reconhecimento facial.
Por vezes, a presença do utilizador (UP) também é mencionada ou usada de forma semelhante à verificação do utilizador, mas existem algumas diferenças. A presença do utilizador apenas confirma que alguém - qualquer pessoa - está fisicamente presente e a interagir com o dispositivo. Não verifica a identidade dessa pessoa. Um simples toque numa chave de segurança, sem quaisquer outras verificações de identidade, pode ser suficiente para a presença do utilizador. Para passkeys / WebAuthn, o utilizador precisa sempre de estar presente.
Valores Possíveis
Casos de Uso e Exemplos
Padrão
Exemplo: Uma aplicação corporativa quer que os funcionários façam login sem palavras-passe nos seus portáteis da empresa usando os leitores de impressão digital integrados. A credencial é armazenada no dispositivo e o utilizador deve verificar-se com uma impressão digital a cada vez.
Padrão
Exemplo: Um utilizador regista uma chave de segurança (por exemplo, YubiKey) para a sua banca online. Pode usar esta chave para se autenticar em qualquer dispositivo, fornecendo a chave de segurança (por exemplo, YubiKey), sem precisar de inserir um nome de utilizador.
Muitas chaves de segurança baseadas em hardware (por exemplo, YubiKeys) têm restrições de armazenamento inerentes. Esta limitação deve-se à memória física disponível no dispositivo e às considerações de design do fabricante.
Exemplo: Uma YubiKey pode ter capacidade para armazenar apenas 20 chaves residentes. Uma vez atingido este limite, não podem ser adicionadas mais chaves residentes sem apagar as existentes.
Solução:
Diferentes autenticadores podem lidar com pedidos de chaves residentes de forma diferente. Alguns podem assumir por defeito a criação de uma chave residente mesmo que não seja explicitamente solicitada, enquanto outros podem exigir instrução explícita.
O comportamento inconsistente para diferentes opções de servidor WebAuthn em diferentes plataformas é um grande problema. Por exemplo, o iOS criará sempre uma chave residente independentemente das opções do servidor WebAuthn passadas, enquanto o Android requer um opt-in (por exemplo, com residentKey: preferred ou residentKey: required).
Além do comportamento, é ainda pior que, com base nos dados armazenados do lado do servidor, não se pode dizer com 100% de certeza se uma credencial armazenada é uma chave residente ou não residente. Em vez disso, pode seguir algumas verificações e restringir as opções (veja abaixo), mas ainda precisa de esperar que o comportamento da credencial esteja de acordo com a sua crença.
A razão por trás disto é que existe uma sugestão do WebAuthn para armazenar informações sobre o tipo de credencial (chave residente ou não residente) na extensão de propriedades da credencial (clientExtensionResults.credProps.rk, que é verdadeiro ou falso). No entanto, fornecer esta informação à RP não é garantido, pois todas as extensões do WebAuthn são opcionais, por exemplo, o iOS não a envia (portanto, não sabe se é uma chave residente ou não residente).
Durante a nossa pesquisa, tentámos testar o comportamento em diferentes plataformas e autenticadores (Windows 10, Windows 11, Android 7, Android 13, iOS17, macOS Ventura, YubiKey) com duas páginas de demonstração do WebAuthn que fornecem mais detalhes sobre as credenciais criadas: https://webauthn.io e https://webauthntest.identitystandards.io/. Esta última oferece a possibilidade de trabalhar com a propriedade legada requireResidentKey (WebAuthn Nível 1) e até combiná-la com a propriedade residentKey (WebAuthn Nível 2). No entanto, os resultados não foram fiáveis (por exemplo, indicava chave não residente para o iOS, mas a IU condicional funcionava claramente).
O esquema de verificação mais confiável que encontrámos é o seguinte:
Como pode ver, isto ajuda a restringir, mas a opção desconhecida permanece e não se pode determinar o tipo de chave com 100% de certeza.
Isto também está em linha com as descobertas de William Brown da SUSE no seu ótimo artigo que descreve como as chaves de segurança (por exemplo, YubiKeys) podem tornar-se inúteis se as chaves residentes forem exigidas pelas Relying Parties (nós expandimos a sua tabela):
Na tabela, vê-se para diferentes opções de chave residente do servidor WebAuthn se uma chave residente foi criada (true), se uma chave não residente foi criada (false) ou se algo mais aconteceu.
Solução:
Se um utilizador atingir o limite de armazenamento na sua chave de segurança (por exemplo, YubiKey), pode enfrentar erros ou não conseguir registar novas credenciais. Isto pode levar a confusão e frustração.
Solução:
Como viu acima, as configurações do servidor WebAuthn que escolher podem impactar significativamente a experiência do utilizador e a segurança do seu processo de autenticação. É essencial entender as nuances destas configurações para tomar decisões informadas.
Chaves Residentes vs. Não Residentes: Se a maioria dos seus utilizadores acede principalmente ao seu serviço a partir de dispositivos pessoais como smartphones ou portáteis, as chaves residentes são uma escolha adequada. As chaves residentes são armazenadas no próprio dispositivo e oferecem uma experiência de autenticação fluida para utilizadores que usam frequentemente o mesmo dispositivo. No entanto, para utilizadores que usam chaves de segurança (por exemplo, YubiKeys), as chaves não residentes podem ser mais apropriadas.
Configurações de Verificação do Utilizador (UV): Dependendo do nível de segurança que deseja alcançar, pode decidir quão rigoroso o processo de verificação do utilizador deve ser. Se o seu objetivo é alta segurança, exigir um PIN, impressão digital ou reconhecimento facial (userVerification: preferred ou userVerification: required) é aconselhável.
Atestado e Confiabilidade: O Atestado permite verificar a origem e a integridade do autenticador. Decida se quer confiar em todos os autenticadores ou apenas naqueles de fabricantes específicos. Isto pode ser crucial se estiver a lidar com dados sensíveis e quiser garantir que apenas autenticadores de alta qualidade e confiáveis são usados.
Mecanismos de Fallback: Tenha sempre um mecanismo de fallback. Se um utilizador perder o seu autenticador ou se este avariar, deve ter uma forma alternativa de aceder à sua conta. Isto pode ser através de códigos de backup, verificação por SMS, links mágicos por e-mail ou outros métodos de autenticação multifator.
Educação Contínua: O cenário de passkeys e WebAuthn está em constante evolução. Mantenha-se atualizado com os últimos desenvolvimentos, vulnerabilidades e correções. Incentive a sua equipa de desenvolvimento a participar em workshops, webinars e conferências relacionadas com passkeys e WebAuthn.
Onboarding e Educação do Utilizador: Ao introduzir a autenticação com passkey, garanta que os seus utilizadores entendem os seus benefícios e como funciona. Ofereça instruções claras durante o processo de registo e forneça recursos (como FAQs ou tutoriais em vídeo) para ajudar os utilizadores a configurar e usar passkeys.
Ao aderir a estas melhores práticas, os desenvolvedores e gestores de produto podem garantir que implementam a autenticação com passkey de forma eficaz, equilibrando segurança e experiência do utilizador.
Se quiser implementar passkeys para adoção em massa no seu site ou aplicação e não precisar de suportar chaves de segurança (por exemplo, YubiKeys), pois a maioria dos seus utilizadores usará apenas o seu smartphone ou portátil, recomendamos as seguintes configurações.
Benefícios:
As configurações do servidor WebAuthn, apesar de complexas, oferecem uma estrutura robusta e flexível para a autenticação. Dominar estas configurações é crucial, pois não se trata apenas de implementar um novo padrão; trata-se de melhorar fundamentalmente a segurança e a eficiência da autenticação do utilizador.
Em essência, entender as configurações do servidor WebAuthn é um investimento na construção de aplicações mais seguras, eficientes e preparadas para o futuro. À medida que o cenário digital evolui, estar bem versado em tais tecnologias será indispensável. Para se manter atualizado, junte-se à nossa comunidade de passkeys ou subscreva a nossa newsletter abaixo.
Passkeys Series: WebAuthn Basics
Related Articles
Table of Contents