Обычно делают так: есть база данных с таблицей пользователей со следующей структурой
id username password
где id - primary key(целочисленное значение уникальное для каждого пользователя)
username понятно
password - хеш пароля, причём к этому хешу добавляется соль, общая для всей базы(хранить где-нибудь в конфиге приложения, чтоб при доступе к базе её было не найти) и какая-нибудь для пользователя, чтоб у разных пользователей пароль qwerty превращался в разные хеши.
И также таблица сессий.
session_key expiration_time user_id
session_key рандомная строка(например Ku0peepia3ialete3uawai9oK3Koh2ni), которая хранится в куках пользователя
expiration_time timestamp когда сессия заканчивается(важно на банковских приложениях например)
user_id - id пользователя, которому принадлежит сессия.
Также можно добавить другие данные, как например ip, user-agent и т.д.
Когда пользователь ввёл логин и пароль в форму и нажал "войти", на сервер отправляется POST запрос с логином и паролем, сервер принимает его, хеширует пароль и проверяет в базе, есть ли такая пара, если есть, создаётся сессия и возвращается пользователю в куках(хедер Set-Cookie), клиент устанавливает их себе и при следующих запросах отправляет сессию в хедере Cookie, либо берётся та, которую отправил пользоваль и привязывается к аккаунту. Когда пользователь заходит в админку, сервер смотрит, есть ли такая сессия и имеет ли права на доступ в админку её владелец, если нет, то возвращает ошибку.