Ho fatto molte ricerche sulle "migliori pratiche" che circondano questo e ho letto post di blog dopo post sul blog, domanda SO dopo domanda SO e articolo OWASP dopo OWASP articolo. Sono arrivato ad alcune risposte chiare ma alcune incognite.Come proteggere REST API per SPA e Mobile App utilizzando Cordova
In primo luogo, la "Cosa fare":
- Usa JWT per autorizzare gli utenti sul mio REST API [1][2]
- Conservare il JWT in HTTPOnly/cookie sicuro e costruire nella protezione CSRF. Non conservare in memoria locale HTML5 [3][4][5] (In realtà, questo punto è discutibile, è più facile per la protezione contro XSS o CSRF? [6])
- Verificare il metodo firma del JWT [7]
Ora ho iniziato partendo dal presupposto che avere una SPA (costruita con Angular) e l'utilizzo di sessionStorage HTML5 sarebbe abbastanza sicuro per i token di breve durata, ma bisogna fare in modo che gli attacchi XSS possano accadere da un "cattivo attore" originario di quello di molte librerie caricate da un CDN.
Per il mio caso d'uso specifico, non ho intenzione di avere token di lunga durata - scadenza dopo 10 minuti di non utilizzo, ma sto ancora cercando di rintracciare la scadenza per sessione o usare i token di aggiornamento - StormPath raccomanda il primo (non più stateless?), ma credo che i grandi giocatori che usano le JWT utilizzino i token di aggiornamento (Google li usa ma afferma che è necessario archiviarli in un archivio sicuro a lungo termine, il che significa che HTML5 localStorage è di nuovo fuori questione).
Mi piacerebbe farlo in modo che i miei utenti non debbano accedere di nuovo se aggiornano la pagina (da qui la necessità di memorizzare il token sul lato client). Mi piacerebbe anche utilizzare la mia SPA come "app mobile" con l'aiuto di Cordova. L'ovvia insidia qui è che se utilizzo i cookie, non c'è alcun supporto/archiviazione dei cookie integrati con Cordova e sono invece invitato a passare all'archiviazione locale HTML5. Dal momento che sui dispositivi mobili non ho davvero bisogno di preoccuparmi di aggiornare le pagine, posso semplicemente lasciare il mio token in memoria e scadere con la strategia su cui mi sto ambientando.
Se seguo questo approccio, basato su cookie JWT su desktop, intestazioni "Bearer" su dispositivo mobile, ora ho bisogno di un endpoint di autenticazione che fornisca token in due modi diversi e quando autorizzo sul lato REST API, Devo supportare sia i JWT basati su cookie (con CSRF) sia la verifica JWT basata sull'intestazione. Questa complicazione mi preoccupa perché non so se posso prevedere con precisione le implicazioni sulla sicurezza qui.
di riassumere la raffica di pensieri di cui sopra:
- creare un gestore di autenticazione che distribuire i token via HttpOnly/cookie Sicuro al desktop, e payload per il mobile.
- Sulla mia API REST, supportare entrambi i metodi di verifica: basato sull'intestazione e basato sui cookie, inclusa la protezione CSRF per l'approccio basato sui cookie.
C'è qualche motivo per cui non vorrei prendere questo approccio? Suppongo che se prendo XSS sulla mia SPA come un grave rischio, quindi ho bisogno di una classica pagina di login per l'autenticazione per impostare i cookie appropriati perché se faccio l'autenticazione tramite la SPA, quindi qualsiasi attacco XSS potrebbe potenzialmente intercettare anche quello (sia su cellulare che su desktop)! Tuttavia, sul cellulare, dovrei inserire il JWT in SPA, magari attraverso qualche elemento DOM personalizzato (meta tag?), ma a quel punto posso semplicemente lasciare che la SPA esegua il login e non consideri XSS una minaccia sui dispositivi mobili. Cordova impacchetta tutte le risorse nel pacchetto di installazione, quindi è un po 'meglio, ma allora perché non adottare lo stesso approccio sulla versione Desktop?
La mia applicazione richiede pochissimo input da parte dell'utente, è principalmente uno strumento di dashboard/reporting. Ci sarà un "centro messaggi" ma il contenuto dovrebbe sempre essere creato dall'utente (solo da quell'utente) e disinfettato. Nel mio caso d'uso, quindi, sarebbe corretto deviare dalle "migliori pratiche" e fare affidamento su localStorage senza contare l'XSS come un serio rischio per la mia SPA? Ciò semplificherebbe l'intera cosa (utilizzare sessionStorage HTML5 come originariamente pianificato) e ridurre la complessità, che ridurrebbe la superficie di attacco per potenziali errori di sicurezza. Voglio solo assicurarmi di comprendere i rischi prima di andare avanti.
Non esiste un modo sicuro per rendere questo sicuro se non costruendo un'app nativa per dispositivi mobili e non utilizzando Cordova per convertire la SPA in un'app mobile? Odio che questo sia il caso, ma potrebbe benissimo essere.
Apprezzerei tutte le considerazioni in merito!
Ho avuto domande molto simili. Cosa hai finito? – Adversus
Non usare Cordova (vai nativo o vai a casa!) - usato JWT nei cookie Secure/HTTPOnly insieme agli header di tutte le richieste (per prevenire CSRF) controllando il JWT in entrambe le posizioni. – someone1
@ qualcuno1 Hai avuto la possibilità di guardare questo link - http://security.stackexchange.com/questions/100129/what-to-do-when-you-can-t-protect-mobile-app-secret- chiavi – Gandhi