Грамотная авторизация делается вот как:
Генерируем токен, ставим его пользователю в кукисы и пишем его в базу. Когда пришел запрос, проверяем, активен ли токен, и не протух ли, если всё ок, даём доступ, нет - шлём на авторизацию.
Сессия для этого кстати необязательна. А, ну ещё второй токен, для CSRF. его тоже просто в кукисы.
и там и там кукисы secure + httpOnly.
Всё остальное - вариации на тему. Свои велосипеды городить не рекомендуется ввиду того, что они всегда приводят к дырам.
Сессия, чтобы каждый раз не дёргать базу - можно, но при этом надо запрограммировать возможность принудительно разлогинить злого пользователя, которого из базы уже удалили или доступ запретили, а сессия всё ещё жива.
Специально сгенерированный хэш - плохая идея, только абсолютно рандомный токен.
Шифровать пароль и прочее в куку - очень плохая идея, забудьте.
Шифровать userid и права - только в виде JWT, свой велосипед не городить, вечных и долгих токенов не давать (пусть обновляют, это обязательно).