Реализация авторизации через логин и пароль на сайте
Классическая форма логина и пароля — базовый механизм аутентификации. Несмотря на простоту идеи, корректная реализация требует внимания к безопасности хранения учётных данных, защите от брутфорса и сессионной модели.
Что входит в реализацию
- Форма входа с валидацией на клиенте и сервере
- Хэширование паролей (bcrypt, argon2)
- Механизм сессий или JWT
- Защита от брутфорса (rate limiting, lockout)
- Функция «Запомнить меня» (remember token)
- Логирование попыток входа
Хранение паролей
Пароль никогда не хранится в открытом виде. Используется bcrypt с cost factor ≥ 12 или Argon2id:
// Laravel
$hash = Hash::make($password); // bcrypt, cost=12 по умолчанию
// Верификация
if (!Hash::check($request->password, $user->password)) {
throw new AuthenticationException();
}
// Проверка необходимости rehash (при смене cost factor)
if (Hash::needsRehash($user->password)) {
$user->update(['password' => Hash::make($password)]);
}
Rate limiting и lockout
// Laravel — через RateLimiter
RateLimiter::for('login', function (Request $request) {
return Limit::perMinute(5)->by($request->ip())
->response(fn() => response()->json([
'message' => 'Слишком много попыток. Повторите через 60 секунд.'
], 429));
});
// Дополнительно — блокировка по email+IP на 15 минут после 10 неудачных попыток
Remember me
// Создание долгоживущего токена
if ($request->boolean('remember')) {
$token = Str::random(60);
$user->update([
'remember_token' => hash('sha256', $token),
'remember_token_expires_at' => now()->addDays(30),
]);
Cookie::queue('remember_token', $token, 60 * 24 * 30, secure: true, httpOnly: true);
}
JWT vs сессии
Для серверного рендеринга (SSR, MPA) — стандартные cookie-сессии. Для SPA и мобильных клиентов — JWT (access + refresh token):
| Подход | Когда использовать |
|---|---|
| Cookie-сессии | Laravel Blade, серверный рендеринг |
| JWT | SPA (React/Vue), мобильные API |
| Sanctum (Laravel) | SPA на том же домене |
| Passport (Laravel) | OAuth2 сервер, сторонние клиенты |
Безопасность формы
-
autocomplete="current-password"— корректный атрибут для менеджеров паролей - CSRF-токен в POST-запросе
- Одинаковое сообщение об ошибке для «нет пользователя» и «неверный пароль» — не раскрываем факт существования аккаунта
- HTTPS обязателен
Сроки
Базовая реализация логина/пароля с rate limiting, сессиями и remember me — 2–3 рабочих дня.







