Penso che tutte le risposte sopra siano sbagliate. @Andy probabilmente hai risposto alla tua domanda, anche se troppo vagamente. Il problema è che (a) si presuppone che i propri utenti siano un vettore di minacce (sfruttando i cookie per ottenere l'accesso non autorizzato) (b) si desidera utilizzare i cookie come parte del meccanismo di autenticazione. In realtà, ciò che si desidera implementare è un tipo di sicurezza di trust zero, un modello che afferma che nessun utente deve essere considerato attendibile in alcun caso (questo è abbastanza difficile da capire all'inizio).
Essenzialmente, l'implicazione è che puoi usare i cookie ma questi dovrebbero essere solo cookie di sessione. Shibbeloth e altri progetti simili per istituzioni accademiche nel Regno Unito, utilizzano una combinazione di cookie di sessione, autenticazione di terze parti (presso l'istituto) e autenticazione di sessione guidata da database (rispetto agli altri due). Di fatto, di solito controlla anche l'istituto per i diritti dell'utente (ad esempio se stai studiando informatica non hai bisogno della biblioteca medica, ecc.)
Quindi, usare un cookie persistente è il tuo problema, questo è un no-no definito. Sembri già capire il rischio nell'usare un cookie persistente, che è che può essere rubato (di solito in testo normale). Pertanto, utilizzare i cookie di sessione non persistenti nel peggiore dei casi.
Quello che dovresti fare, a mio avviso, se dovessi utilizzare questo metodo di autenticazione è revocare regolarmente i cookie e richiedere all'utente di effettuare nuovamente il login. Come ho spiegato, Shibbeloth è multi-factored by design in quanto mette a confronto le tue credenziali con quelle della tua università. I progetti migliori non si limitano a confrontare le informazioni degli utenti, ma richiedono più di una credenziale (ad esempio un messaggio di testo, un'e-mail o una risposta segreta come nel sistema bancario online).
Realisticamente, la maggior parte delle applicazioni che sono basate sul Web possono trarre enormi vantaggi dall'essere senza stato (a seconda dell'applicazione e dei requisiti dell'utente / di sistema). Quindi, puoi rimuovere i cookie di sessione dall'immagine quasi completamente, usandoli fino a quando la finestra del browser non viene chiusa / tempo trascorso o utilizzando un archivio utente crittografato sul lato client (soluzione migliore).
Tra le altre attenuazioni che altri utenti hanno detto, come ad esempio il rilevamento delle impronte digitali dei browser e il monitoraggio dei modelli di utilizzo, ci sono molte strategie che potresti impiegare. Potresti anche utilizzare la whitelist IP, l'anti-DDoS, il rollover delle credenziali regolari ecc. Questi sono complementari, ma non una soluzione di se stessi.
Ciò che non si deve mai fare è de-priorizzare la sicurezza e le imperfezioni del software per il miglioramento dell'esperienza utente (sono comunque la stessa cosa). Se lo fai, un giorno potresti essere responsabile di una catastrofe per la protezione dei dati (e potenzialmente andare in prigione e / o perdere molti soldi).
Per implementare completamente ciò che stai cercando, usa un'applicazione web (probabilmente basata su javascript) che non ha bisogno di essere installata. Quella applicazione dovrebbe essere programmata per implementare completamente la tua API e fare tutto il lavoro pesante per l'utente. Dovrebbe idealmente svolgere un controllo di accesso basato sui ruoli (RBAC) su quell'API (in modo da identificare i diversi gruppi di utenti che hai citato). Ovviamente, l'RBAC deve essere implementato sul lato server. Non vi è alcun motivo per cui l'API non può fornire o collegare direttamente a questo e memorizzare token emessi direttamente o tramite un altro canale, ad esempio un messaggio di testo basato su tokenw.
Spero che questo ti dia qualche spunto di riflessione in relazione al tuo design.