Впровадження логіну та пароля для веб-сайтів
Логін та пароль — класичний спосіб аутентифікації. Попри простоту концепції, правильне впровадження вимагає уваги до безпечного зберігання облікових даних, захисту від перебору та управління сесіями.
Що входить у впровадження
- Форма входу з валідацією на клієнті та сервері
- Хеширування паролів (bcrypt, argon2)
- Механізм сесій або JWT
- Захист від перебору (rate limiting, блокування)
- Функція «Запам'ятати мене» (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();
}
// Перевірка необхідності повторного хеш (при зміні cost factor)
if (Hash::needsRehash($user->password)) {
$user->update(['password' => Hash::make($password)]);
}
Rate Limiting та Блокування
// 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 проти Сесій
Для серверного рендерингу (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 дні.







