Concetti per supportare l'autenticazione locale ed esterna: JWT, Cookies, HttpOnly, ...?

3

Sto cercando di capire la strategia e i concetti di autenticazione corretti per un'applicazione web (SPA) a pagina singola con accesso locale e login di terze parti (ad esempio Google, Auth0). Sfortunatamente, un buon numero di articoli sull'argomento sembrano avere i concetti chiaramente sbagliati.

L'idea di base è che il browser e il server utilizzino un token di autenticazione (ad es. JWT), in modo che il server possa verificare se l'utente ha effettuato l'accesso / autenticato.

Domande e opinioni diverse iniziano dove questo token deve essere memorizzato nel browser e come arriva al server:

  1. In un cookie che utilizza HttpOnly (e preferibilmente sicuro, vale a dire solo SSL): alcuni articoli affermano che i cookie richiedono lo stato del server e sono di vecchio stile - ma penso che siano sbagliati qui. Se il cookie fosse solo un ID di sessione, che il server avrebbe bisogno di sapere, allora questo potrebbe essere vero, ma nei giorni moderni, il cookie è il token di autenticazione, che il server può semplicemente controllare.
    • PRO: arriva al server senza alcun altro JavaScript sul lato client. Questo potrebbe essere importante se utilizzassimo il rendering lato server (SSR) per velocizzare le prestazioni SPA (ad esempio tramite Angular Universal)
    • CON: vulnerabile a XSRF / CSRF, ma ci sono correzioni per questo
  2. In LocalStorage / SessionStorage
    • PRO: XSRF / CSRF non è un problema
    • CON: vulnerabile a XSS, ma ci sono correzioni per questo. Il problema più grosso potrebbe essere che interrompe SSR, come per la richiesta iniziale, non esiste JavaScript sul lato client che invii il token

La mia preferenza è leggermente verso un token JWT memorizzato come cookie con alcune protezioni XSRF / CSRF aggiunte. Questo sembrerebbe qualcosa di simile (XSRF omesso qui):

Mimancaqualcosaqui?

Comefunzionerebbeun'autenticazioneesternaconquesto?Ciòrichiederebbefondamentalmentel'esecuzionediJavaScriptsulclient,ilreindirizzamentoaunmodulofornitodalserverrdpartyedopochel'utentehainseritoilnomeutenteelapasswordsulsitoesterno,ilserverdiautenticazionerestituisceuntokentramiteJavaScript(fondamentalmenteuncallback).Eadesso?

(Sinotichenonpensachesiaun'opzioneperinserirenomeutenteepassword,inviarloalmioserverwebeilserverwebparlaconGoogle/Auth0.Questoèunno-go,comedovrebberononinserirelapasswordperunsitoditerzepartisulmiositoweb.

Iltokencheottengodalsitoesternopuòesserevalidato,sì,maaqualescoposerve:

  1. vieneutilizzatoperinviaredirettamenterichiestealmioserver(sostituendoiltoken/cookie)dalmioserver?Ciòinterromperàlastrategiadeicookie,poichénonpossosalvareiltokennelbrowser.
  2. vieneinviatoalmioserver(sostituendonomeutente/password)eilserver-dopoavercontrollato-restituisceilsuoJWTcometoken.

Ancoraunavolta,lamiapreferenzaèpiùverso2,mapotreisbagliarmiqui-opotrebbeesseresoloilnoncomune(cheèunaspettonegativodellasicurezza).Questoècomesarebbe(ancora,XSRFomesso):

(Non sono sicuro se devo memorizzare il token esterno).

Qualche idea o guida?

    
posta user1211286 22.03.2018 - 13:24
fonte

0 risposte

Leggi altre domande sui tag