Ho un'app di frontend pesante con una pausa API in node.js. L'app e il back-end sono su host diversi. Inoltre, è possibile accedere all'app sia con http che con https. Il motivo per cui il contenuto è misto: gli utenti dell'applicazione caricano i propri siti Web negli iframe e, se un sito Web è http, non funzionerà, spezzato https rosso al meglio, non caricando affatto nel peggiore dei casi. Abbastanza ironico sul fatto che qualcosa che dovrebbe migliorare la sicurezza del web, mi costringe a consentire l'utilizzo di connessioni non sicure. Ma non è questo il punto. Diciamo che ho il mio frontend su http (s): //app.mydomain.com e backend al link
E voglio renderlo il più sicuro possibile, considerando che i miei utenti a volte usano connessioni non sicure. So che non posso proteggere da manomissioni, ma almeno posso proteggere il token di autenticazione. Quindi io uso JWT. Voglio anche ricordarmi di funzionalità. localStorage / sessionStorage consentirebbe di leggere il token su pagine http non sicure, quindi stavo pensando di impostare un cookie per link sul server. In questo modo, il frontend non può mai leggere il token a causa di CORS. E salterò tutte queste cose con i token di aggiornamento. Ci sarebbe solo un gettone da utilizzare per tutto. Quindi, se un utente ha effettuato l'accesso, il server imposterà il token cookie e lo imposterà alla scadenza al termine della sessione del browser, il token stesso verrà impostato per scadere entro 1 giorno. Se l'utente ha selezionato Ricordami, il cookie verrà impostato per un anno e il token verrà impostato per scadere in un anno. Ora vorrei chiederti se è un modo sicuro per farlo? Sto pensando corretto?
Un'altra cosa ovviamente è CSRF. Stavo pensando solo a controllare il referer e lasciarlo, ma ho sentito che potrebbe bloccare utenti legittimi dietro proxy che rimuovono il referer dalla richiesta. Quindi stavo pensando di usare JWT come nonces. Fondamentalmente su init, quando l'utente si collega / autentica, il server restituisce un nuovo token e quindi il token viene archiviato nella memoria del client e inviato con ogni richiesta al server da verificare.
Ecco un riepilogo del processo:
the frontend is at http(s)://app.mydomain.com
the server is at https://api.mydomain.com
0. make an ajax call to check if the user is logged in
1. send username and password to log in
2. the server sets the cookie at https://api.mydomain.com containing the auth token
cookie is set to expire when browser session ends, token is set to expire in 1 day
if remember me: both cookie and token is set to expire in 1 year
3. the server also generates a different token to serve as a nonce and returns it
4. the app stores the nonce token in memory and uses it for every call
If the user is logged in, skip to step 3.
Cosa ne pensi? È sicuro?