Как реализовать авторизацию на сайте
Что проверяют
Умеете ли вы выбрать схему авторизации под конкретный сайт и довести её до рабочего интерфейса, а не только до эндпоинта /login. Следом обычно спрашивают, где проверяются права и что увидит пользователь, когда сессия истечёт посреди работы.
Как отвечать
Сначала схема:
- сессия в cookie: самый простой вариант для сайта на своём домене. Cookie с
HttpOnly,Secure,SameSite=Lax, сессию легко отозвать на сервере; - JWT: удобен, когда API обслуживает несколько клиентов. Access token живёт минуты, refresh token лежит в
HttpOnlycookie, мгновенный отзыв требует списка отозванных токенов; - внешний провайдер: OpenID Connect с Authorization Code и PKCE, implicit flow больше не рекомендуется. Токены часто держат на сервере по схеме BFF, а браузер получает только сессионную cookie;
- passkeys (WebAuthn): вход без пароля, устойчивый к фишингу.
Потом фронтенд:
- формы: атрибуты
autocomplete(username,current-password,new-password), кнопка показа пароля, защита от двойной отправки, общее сообщение об ошибке; - состояние: при загрузке приложение запрашивает
/meи хранит пользователя в контексте или сторе; - маршруты: защищённые страницы проверяются на сервере или в загрузчике маршрута до рендера, чтобы не мелькал чужой контент;
- истечение сессии: обёртка над запросами ловит
401, один раз пробует обновить сессию и отправляет на вход с возвратом на текущую страницу. Выход синхронизируется между вкладками черезBroadcastChannelили событиеstorage.
Вокруг входа нужны регистрация с подтверждением почты, сброс пароля одноразовой ссылкой и лимит попыток.
Где спотыкаются
Защищают только интерфейс: прячут кнопку и страницу, а API отдаёт данные любому. Проверка на клиенте нужна для удобства, права проверяет сервер на каждом запросе.
Кладут JWT без срока жизни в localStorage, а секрет подписи прямо в код. Украденный через XSS токен работает вечно, а утёкший секрет позволяет выпускать токены за кого угодно.
Делают только форму входа. Сессия истекает посреди длинной формы, пользователь теряет введённое, а выход на других вкладках и сброс пароля появляются уже после жалоб.