Коротка відповідь
juniorToken-based authentication — це механізм, де клієнт отримує токен після успішної авторизації і підключає його до кожного запиту, замість передачі логіну/пароля. Токен містить закодовану інформацію про користувача і підпис, що дозволяє серверу перевірити його достовірність без зберігання сесій у пам’яті.
Повне пояснення
Що це і навіщо
Token-based authentication (JWT, OAuth2) дозволяє реалізувати безсесійний, масштабований доступ до API. Клієнт отримує токен після логіну і додає його у заголовок Authorization: Bearer <token>.
Ключові принципи
- Токен містить payload (userId, scopes) і підпис (HMAC або RSA).
- Сервер верифікує підпис, не звертаючись до сховища.
- Токен має строку дії (exp) і може бути відхилений за допомогою blacklist.
Як це працює
- Клієнт надсилає логін/пароль.
- Сервер генерує токен, підписує його і повертає клієнту.
- Клієнт зберігає токен (localStorage, cookie) і додає у кожний запит.
- Сервер верифікує токен, читає payload і дозволяє доступ.
Практика та реалізація (Node.js / NestJS)
// auth.service.ts
async login(dto: LoginDto) {
const payload = { sub: user.id, roles: user.roles };
return this.jwtService.sign(payload); // JWT
}
// auth.guard.ts
@UseGuards(JwtAuthGuard)
@Get('profile')
getProfile(@Request() req) {
return req.user;
}
Тестування
- Unit: перевірка
signіverifyз mock‑jwt. - Integration: запит
/login, отримання токену, використання у наступному GET.
Безпека
- Захист від XSS: зберігати токен у httpOnly cookie.
- CSRF: використання SameSite=Lax/Strict.
- Підпис з RSA‑ключем замість HMAC для підвищеної безпеки.
Особливості в контексті backend (NestJS, Express)
- NestJS має
@nestjs/jwtіPassportдля простого налаштування. - Express можна реалізувати через middleware
express-jwt.
Оптимізація
- Кешування токенів у Redis для швидкого blacklist‑підтримки.
- Мінімізація payload (тільки необхідні поля).
Часті помилки
- Токен зберігається у localStorage → XSS.
- Не встановлено
SameSite→ CSRF. - Використання слабкого HMAC‑ключа.
- Не перевіряється
exp→ використання просроченого токена. - Токен не відхиляється після зміни пароля.
- Підпис не перевіряється на сервері.
- Токен передається у GET‑URL → логування.
- Не обробляються помилки
jwt expired→ 401.
Cheatsheet
- JWT payload:
{ sub, exp, iat, roles } - Header:
Authorization: Bearer <token> - Refresh token: окремий токен з довшою строкою дії, що обмінюється на новий access token.
passport-jwtstrategy:new JwtStrategy(opts, async (payload) => { ... })