Executando verificação de segurança...
2

Recursos Caros em API: usar nonce ou idempotência?

Olá comunidade incrível de desenvolvedores!

Estou atualmente envolvido em um projeto que envolve a implementação de uma API e me deparei com uma decisão crucial: optar por Nonce ou Idempotência para lidar com recursos caros (Consumo de tempo/hora computacional). Gostaria de saber a opinião da galera por aqui sobre essas abordagens.

Para os mais leigos no assunto, deixe-me fazer um breve resumo:

[Nonce]

O que é: Um número usado uma única vez em uma comunicação, geralmente para evitar a repetição de requisições.

Prós: Ajuda a evitar ataques de repetição, garantindo que uma solicitação específica só seja processada uma vez.

Contras: Adiciona complexidade ao sistema e pode causar problemas de sincronização se não for gerenciado corretamente - ex: usuário abrir duas abas com mesma view.

[Idempotência]

O que é: Uma propriedade em que uma operação produz o mesmo resultado, independentemente de quantas vezes é executada.

Prós: Facilita a reexecução de operações sem efeitos colaterais inesperados. Útil em cenários de falha de rede ou retry de requisições.

Contras: Nem todas as operações podem ser tornadas verdadeiramente idempotentes, e algumas podem exigir manipulações adicionais e adição de muita regra de negócio.

Então a pergunta pode até ser outra: Nonce pode atingir idempotência de maneira "genérica"?

Agora, gostaria de ouvir a experiência e opinião de vocês. Qual dessas abordagens vocês preferem ao lidar com recursos caros em uma API? Já enfrentaram desafios específicos com uma ou outra? Ou têm alguma terceira abordagem favorita ou mais inteligente?

Vamos compartilhar conhecimento e enriquecer nossa compreensão coletiva! Valeu turma 🚀

Carregando publicação patrocinada...
3

Acredito que nonce não tenha nenhuma relação com idempotência. São duas estratégias distinhas para soluções distinhas. O nonce regenera sempre, a idempotência não. Vamos a um exemplo para elucidar:

Em um carrinho de compras, você pode utilizar o nonce para garantir que o recebimento dos dados do carrinho de compra tenha a origem exata naquele formulário. Isso impede o abuso de uma requisição ou que uma requisição seja feita fora do navegador. Sem o nonce a pessoa não envia o formulário.

Logo, assim que a pessoa entra no carrinho é atribuido um código ao formulário e quando enviado esse código é validado para garantir que o não houve mudanças no envio e a origem é atestada. Por tanto, nonce é um recurso de segurança, com ele, por exemplo, você pode prevenir "Man-in-the-middle attack" ou que aquela sessão do carrinho e aquele envio seja roubada ou emulados.

Sempre que você atualizar a página, o nonce também deve ser alterado, garantindo a unicidade daquele envio quanto a segurança.

Já a idempotência não é um recurso de segurança, mas de integridade. Ela vai garantir que não haja duplicidade dos dados. Ainda no carrinho de compras você quer que, independente de quantas vezes a pessoa clique no botão comprar, a compra só seja processada uma única vez (em alguns casos, mesmo que ela atualize a página). Pouco tem haver com segurança, pois a ideia da idempotência é ter a mesma resposta sempre, mesmo que os valores no formulário mudem (nesse caso, deve-se atualizar a chave de idempotência também).

Então é mais uma escolha sobre utilizar as duas técnicas, mas não uma escolha sobre utilizar uma OU outra, pois elas tem propósitos totalmente diferentes.

2

Respondendo a pergunta agora, você não avalia do ponto de vista do sistema, mas do usuário.

Se aquele recurso caro é sensível e não pode, sob hipótese alguma, ter duplicação do ponto de vista do usuário (por exemplo, pagar mais de uma vez a mesma compra): idempotência deve ser utilizada.

Se aquele recurso caro não pode ser abusado com requisições em excesso: nonce e só adotaria TAMBÉM idempotência quando não pudesse haver duplicidade do ponto de vista do usuário. Mas além do nonce tem outras estratégias melhores para uma API como Rate-Limit, CORS.

Mas não confunda, nonce não "ajuda a evitar ataques de repetição" (quer dizer, ajuda) mas não é o propósito dele.