Ho un backend API REST che ha HTTPS (e HTTP bloccato) e utilizzo JWT come meccanismo di autenticazione. Il lato client è l'app iOS / Android. Voglio aggiungere un livello di protezione sull'API critica utilizzando il client nonce per impedire (principalmente) la reinvio (chiamata inavvertitamente due volte la stessa API a causa di una rete / interfaccia utente errata) e (forse) un attacco di riproduzione. I dettagli attuali stanno seguendo.
(Tutte le chiamate REST sono comunque HTTPS)
-
Il client
- effettua una chiamata API utilizzando nome utente e password per scambiare un JWT dal lato server Il client
- utilizza il JWT ottenuto (intestazione HTTP) e effettua una chiamata API di sottosequenza al server
- server di backend controlla il JWT ed esegue la richiesta
Il problema attuale è chiunque possa intercettare il pacchetto HTTP in grado di riprodurre la chiamata API. Inoltre, in caso di rete non valida, il cliente può premere due volte il pulsante Invia / conferma e inviare nuovamente la richiesta.
Quello che propongo è il seguente:
-
Il client
- effettua una chiamata API utilizzando nome utente e password per scambiare un JWT dal lato server Il client
- utilizza il JWT ottenuto + un nonce generato dal client e effettua una chiamata API di sottosequenza al server di back-end.
- server di back-end controlla prima il JWT e poi il nonce. Supponiamo di avere un negozio k-v con TTL come Redis.
- Se il blocco esiste in Redis, rifiutiamo la richiesta. In caso contrario, accettiamo la richiesta e impostiamo la notifica in Redis con un TTL predefinito (ad esempio 1 ora?) In modo che una riproduzione venga rifiutata.
Devo ammettere che ho pochissime conoscenze sulla sicurezza. Voglio sapere se questa proposta è legittima? O mi manca qualcosa di importante? Se la mia idea è ok, qual è il miglior algoritmo per generare il nonce? Il lato server deve in qualche modo "decodificare" il nonce per vedere se si adatta al protocollo prima di confrontarlo con Redis?