Как правильно работает аутентификация пользователя?
Всем привет! Вопрос теоретического характера, без привязки к языку, используемому на сервере.
Прочитал несколько статей по аутентификации пользователя, но нет четкого понимания.
1. Регистрация.
Пользователь впервые регистрируется на сайте, заполняет данные формы. После проверки соответствия требованиям к имени и паролю данные отправляются на сервер, где сохраняются в БД (три поля - user id, login, password в зашифрованном виде и хеш-строка, пока пустое поле).
2. Аутентификация.
Пользователь вводит пару логин-пароль, сервер проверяет данные. Если они корректны, то два варианта:
a) формируется случайная длинная строка, хешируется и записывается в строку из БД по данному юзеру и в cookies, например key=jdfhfdkjJHTJkdjsh9874hjgf;
b) на сервере, например, PHP, создается объект сессии и уже его id отправляется польлзователю в куках и на сервере он связывается с данным юзером.
3. Logout
Если пользователь удаляет куки в браузере, очищая историю, или нажимает на кнопку Выйти на сайте, то у него куки удаляются и при переходе на очередную страницу сайта сервер данные (хеш строку или id сессии) не получает и перекидывает на страницу входа.
Собственно вопросы. 1) верен ли алгоритм описанный выше? 2) если срок действия куки указан неделя (или безсрочно) и сессия на сервере хранится, то пользователю достаточно этой записи в куках, чтобы зайти на сайт без аутентификации? 3) если злоумышленник ворует данную куку, он может с идентичной записью (id сесси или хеш-строка) также зайти на сайт без аутентификации? 4) как работает аутентификация через токен? где прочитал, что эта та же случайная строка, зашифрованная, или что токены используются для аутентификации на сторонних доверенных сервисах, например, пользователь заходит через соц. сети.
Пароль в зашифрованном виде не хранится, хранится его hash
Пользователь вводит пароль, пароль заново хешируется и сравнивается с тем hash что лежит в базе.
Таким образом, "расшифровать" пароль нельзя, можно попробовать подобрать пароль, который сгенерирует такой же хеш, но учитвая современные hash алгоритмы и соль, это сложно(долго).
Что вы делаете с куками и как храните сессию пользователя на сайте - это уже как вы хотите в вашем приложении делать. Можете сверять не только сессию, но и браузер и айпишник (не рекомендуется), и дополнительные данные. Вдобавок есть еще сессия собственно соединения (https)