Per prima cosa, lascia che ti dica questo. Niente è sicuro al 100%. Niente è a tenuta d'aria e niente è sacro. Se sufficientemente motivato, un utente malintenzionato interromperà ogni difesa lato server che potresti mettere (a meno che tu non stia utilizzando HTTPS, che è una storia diversa).
È possibile utilizzare i cookie, ma i cookie sono altamente esposti e facilmente modificabili. Non memorizzare mai dati privati o livelli di accesso in un cookie. Poiché viene facilmente rubato/modificato da un utente malintenzionato.
Anche le sessioni non sono sicure al 100%. L'ID di sessione, che il server utilizza per identificare il client, viene inviato in uno dei due modi. una variabile $_GET (non valida) o un cookie (migliore, ma comunque piuttosto scadente). Ciò significa che, se hai effettuato l'accesso come amministratore, su un WiFi non protetto, un abile aggressore (e per esperto intendo un haxx0r pr0 che ha scaricato un semplice sniffer HTTP) può facilmente rubare il tuo ID SESSIONE. E pur non ottenendo la tua password, il server identificherà erroneamente l'attaccante come te e gli concederà qualsiasi accesso tu possa avere/avere.
Quindi che si fa? Le sessioni sono nella maggior parte dei casi sicure. Consiglia ai tuoi utenti di non accedere in una rete non protetta (autobus, internet cafè, ecc.). Se vuoi che la tua autorizzazione all'utente persista nel tempo, è necessario un cookie. Di solito utilizzo un sistema a 2 cookie se ne ho bisogno:
userid=12345
hash=password_hash($userid . $hashed_password, PASSWORD_DEFAULT)
Quindi ho qualcosa con cui confrontarmi e i dettagli dell'utente non sono stati rivelati.
Ma come ho detto, alla fine della giornata, se volevi DAVVERO proteggere i tuoi utenti, sopra a tutto il resto scritto in questa risposta, procurati HTTPS.