Al momento sto sviluppando una SPA JavaScript e sto studiando come metterla al sicuro. Al momento, esiste un'API RESTful che viene completamente interagita con AJAX. Disponiamo inoltre di client mobili che interagiscono con questa API e al momento supporta solo l'autenticazione BASIC HTTP su SSL. L'app JavaScript comunicherà anche esclusivamente su SSL, ma BASIC Auth non lo taglierà in quanto ciò implicherebbe la memorizzazione della password (o una sua derivazione) sul client. Infine, l'app SPA sarà pura JavaScript e HTML, servita sullo stesso server dell'API RESTful, ma senza alcun framework lato server.
Obiettivi :
- Nessun framework lato server per il client javascript (è solo un altro client).
- Mantenere l'apolidia dell'API RESTful, per i motivi tipici (scalabilità, tolleranza agli errori, distribuzione semplificata, ecc.)
- Qualsiasi stato dovrebbe essere gestito dal cliente. Ai fini di questa domanda, si intendono le credenziali di accesso.
- Lo stato di accesso gestito dal client deve essere sicuro e resistere al dirottamento di sessione e ad attacchi simili.
Ciò che ho scoperto si basa sulla mia ricerca su OAuth e schemi simili (Amazon, ecc.).
- L'utente effettuerà l'accesso utilizzando e HTTP POST su SSL.
-
Il server calcolerà un hash come segue:
HMAC (chiave, userId + ":" + ipAddress + ":" + userAgent + ":" + todaysDateInMilliseconds)
-
Questo token verrà restituito al client e fornito con ogni richiesta successiva al posto di userName e password. Molto probabilmente verrà memorizzato in localStorage o in un cookie.
Questo è sicuro? La mia motivazione per la scelta di userId, ipAddress, todaysDateInMilleseconds è di creare un token che è valido solo per oggi, ma non richiede la ricerca del database per ogni richiesta E è sicuro di essere memorizzato sul client. Non posso fidarmi che la chiave non sarà comprimibile, quindi l'inclusione di indirizzo IP nel tentativo di impedire il dirottamento di sessione.
Consentitemi di includere il seguente link da un post correlato su StackExchange perché penso che risolva molti dei problemi che sto cercando di risolvere: ID sessione e ID sessione senza stato
Dopo il feedback iniziale qui ho deciso di utilizzare solo i primi due ottetti dell'indirizzo IP per gestire meglio i client dietro a proxy e client mobili. Non è ancora perfetto, ma è un compromesso per una maggiore sicurezza.