Ho bisogno di un token CSRF, per una determinata applicazione che invia un modulo con POST
. Idealmente, mi piacerebbe non effettuare una chiamata DB per ogni invio, per evitare la memorizzazione e il traffico DB & latenza. A tal fine il "Foglio di trucchi di prevenzione CSRF" di OWASP dice,
Overview
The Encrypted Token Pattern leverages an encryption, rather than comparison, method of Token-validation. After successful authentication, the server generates a unique Token comprised of the user's ID, a timestamp value and a nonce, using a unique key available only on the server. This Token is returned to the client and embedded in a hidden field. […] Non-AJAX form-based requests will implicitly persist the Token in its hidden field. On receipt of this request, the server reads and decrypts the Token value with the same key used to create the Token. […]
Validation
On successful Token-decryption, the server has access to parsed values, ideally in the form of claims.
La prima riga di "Validazione" mi sembra, come la definizione stessa di un JWT . Non vedo perché le informazioni in token debbano essere crittografate: sembrerebbe che debba semplicemente essere autenticato che proviene dal server (al contrario di un utente malintenzionato che tenta di creare un token CSRF).
C'è qualche ragione particolare per crittografare i token CSRF? In caso contrario, un JWT è sufficiente?
Inoltre, il modello di token di cui sopra include un nonce. Qual è il punto del nonce? (L'intero punto di questo schema è di non memorizzare alcun stato sul lato server. Se non sto memorizzando lo stato, come posso usare il nonce durante la convalida in qualsiasi modo materiale?)
Il motivo principale per cui inseguo i JWT qui è che c'è un supporto decente per le biblioteche, probabilmente li cercherò prima o dopo, e mi impedisce soprattutto di implementare la crittografia.
La mia comprensione delle JWT è che se avessi JWT per l'autenticazione completa dell'utente, potrei memorizzarli in localStorage
e semplicemente aggiungerli a un campo con JS prima dell'invio del modulo. Sfortunatamente, l'app utilizza un'autenticazione basata su cookie e al momento non sono in grado di modificare l'aspetto.