Tout d'abord, laissez-moi vous dire ceci. Rien n'est sûr à 100 %. Rien n'est hermétique et rien n'est sacré. S'il est suffisamment motivé, un attaquant brisera toutes les défenses côté serveur que vous pourriez mettre en place (sauf si vous utilisez HTTPS, ce qui est une autre histoire).
Vous pouvez utiliser des cookies, mais les cookies sont très exposés et facilement modifiables. Ne stockez jamais de données privées ou de niveaux d'accès dans un cookie. Comme il est facilement volé/modifié par un attaquant.
Les sessions ne sont pas non plus sûres à 100 %. L'ID de session, que le serveur utilise pour identifier le client, est envoyé de l'une des 2 manières. une variable $_GET (mauvaise), ou un cookie (mieux, mais toujours assez mauvais). Cela signifie que si vous êtes connecté en tant qu'administrateur, via un WiFi non sécurisé, un attaquant qualifié (et par qualifié, je veux dire un pr0 haxx0r qui a téléchargé un simple renifleur HTTP) peut facilement voler votre ID de SESSION. Et sans obtenir votre mot de passe, le serveur identifiera à tort l'attaquant comme vous et lui accordera tout accès que vous pourriez avoir/avoir.
Alors que faire? Les séances sont dans la plupart des cas sans danger. Conseillez à vos utilisateurs de ne pas se connecter sous un réseau non sécurisé (bus, cybercafés, etc.). Si vous souhaitez que votre autorisation d'utilisateur persiste dans le temps, un cookie est requis. J'utilise généralement un système à 2 cookies si j'en ai besoin :
userid=12345
hash=password_hash($userid . $hashed_password, PASSWORD_DEFAULT)
Ensuite, j'ai quelque chose à comparer, et les détails de l'utilisateur n'ont pas été révélés.
Mais comme je l'ai dit, en fin de compte, si vous vouliez vraiment VRAIMENT sécuriser vos utilisateurs, au-dessus de tout ce qui est écrit dans cette réponse, procurez-vous HTTPS.