01
Trocar o esquema de token é migrar estado que mora no cliente
Quando uma equipe decide trocar o esquema de autenticação, a conversa costuma girar em torno de biblioteca, algoritmo e formato: sai o segredo compartilhado, entra a assinatura assimétrica, sai a validade longa, entra o par de acesso curto e renovação rotativa. Tudo isso é código, e código se troca com um deploy. O que não se troca com deploy é a população de tokens já emitidos, que está guardada no armazenamento local de navegadores, no cofre de chaves de aplicativos móveis, em variáveis de ambiente de integrações de parceiros e em colunas de banco de sistemas que você nunca viu. Cada um desses tokens é uma promessa assinada que continua válida até expirar, e o servidor que para de reconhecê-la está quebrando a promessa de uma vez para todos.
A consequência prática é que a duração mínima da migração não é decidida pela equipe, e sim pela maior validade de token que já foi emitida. Se o token legado vive trinta dias, existe token legado legítimo circulando por trinta dias depois da última emissão, e qualquer plano que desligue o formato antigo antes disso está escolhendo deslogar gente. Existe ainda uma população que não segue a validade: o token de renovação de aplicativo móvel que o usuário abre uma vez por mês, e a credencial de integração que foi colada num arquivo de configuração e nunca mais tocada.
| Onde o token vive | Quem controla a atualização | Validade típica | O que define a duração da migração |
|---|---|---|---|
| Armazenamento local do navegador | Você, no próximo carregamento da página | Horas a dias | A última aba aberta há dias que nunca recarregou |
| Cookie de sessão HttpOnly | Você, em qualquer resposta | Dias a semanas | A validade do cookie, e o limite de tamanho dele |
| Cofre de chaves de aplicativo móvel | O usuário, quando atualiza o app | Semanas a meses no token de renovação | A versão mais antiga do app que ainda abre |
| Configuração de integração de parceiro | O parceiro, no ritmo dele | Meses ou sem validade | A próxima janela de mudança do parceiro |
| Fila, job agendado ou mensagem guardada | Ninguém, até a mensagem ser processada | A retenção da fila | A mensagem mais antiga ainda não consumida |
O incidente da abertura tem um segundo componente que costuma ser subestimado: o custo do login em massa. Verificar senha com bcrypt, scrypt ou Argon2 é caro de propósito, na ordem de dezenas a centenas de milissegundos de CPU por tentativa, porque isso encarece ataque de força bruta. Um serviço dimensionado para algumas centenas de logins por minuto não sustenta dezenas de milhares, e a mesma propriedade que protege contra ataque transforma o deslogamento em massa em indisponibilidade. Somam-se a isso o pico de redefinição de senha dos usuários que não lembram a própria senha e o custo de SMS de segundo fator, que aparece na fatura do mês seguinte.