O access token autoriza chamadas à API durante sua validade. O refresh token renova a sessão. Na rotação, cada renovação válida consome o refresh atual e entrega outro. O servidor conserva a relação entre eles para detectar o reaproveitamento de um token já consumido.
A renovação é uma mudança de estado
Uma implementação com tokens opacos pode guardar o hash de cada refresh token, o ID da sessão e campos de expiração e consumo. Na renovação, uma atualização condicional ou um bloqueio de linha garante que apenas uma requisição consuma o token. O consumo e o registro do sucessor precisam ser atômicos. Se a gravação do sucessor falhar, a transação deve ser revertida.
A detecção de reutilização funciona quando o servidor ainda sabe que o token antigo pertence àquela sessão. A política precisa definir a resposta, como revogar a cadeia ativa e solicitar nova autenticação. Se o access token for um JWT validado localmente, revogar o refresh token impede novas renovações. Os access tokens já emitidos seguem a política de expiração ou revogação do serviço.
Duas chamadas podem disputar a mesma renovação
Um painel pode disparar várias consultas ao mesmo tempo quando o token expira. O cliente pode compartilhar uma única renovação entre elas. Mesmo assim, uma resposta perdida deixa uma escolha de produto: exigir nova autenticação ou adotar uma recuperação controlada com critérios explícitos de segurança. Simule essa perda de resposta no teste para verificar a decisão, além da tentativa de reutilizar um token antigo.
RFC 9700, seção sobre proteção de refresh tokens · Autorização multi-tenant em Go