Если это простой, нерспределенный сайт для которого не планируется больших нагрузок и масштабирования, то обычно после ввода логина/пароля проставляется сессионная кука (с флагом HTTPOnly). При всех запросах проверяется валидность куки. Возможно:
1. Использовать стандартные сессии/сессионные куки PHP, при аутентификации по логину и паролю проставлять для сессии флаг авторизации и id пользователя. Самый простой и распространенный способ.
2. Выставлять свою куку и проверять куки на валидность по базе на каждом запросе. Плюсы - возможность создавать persitent-сессии, легко завершить сеанс - сессия инвалидируется в базе. Минусы - обращение к базе на каждом запросе.
3. Выдавать куки с подписью сервера, проверять подпись на запросах без обращения к базе. Минус - нельзя инвалидировать куки на стороне сервера.
4. Использовать сессионную куку, которую выдавать за логин и пароль и хранить в базе + access-куку, которую выдавать по сессионной куке и подписывать, в access-куку включать timestamp чтобы она быстро устаревала, при устаревании - проверять сессионную куку по базе и проставлять новую access-куку. Так не надо лазить в базу на каждом запросе, только когда протухает access-кука.
Если требуется распределенный масштабируемый сервис, то все становится сложнее. Например, у нас реализована
вот такая схема.