## `

JWT, OAuth, сесії: як безпечно зберігати користувачів у 2025?

`

Коли користувач входить на сайт, система має знати: "це справді він". Це називається автентифікація. Але як це робити безпечно? У 2025 році старі методи (напр., прості куки) вже не достатні. З'явилися нові загрози: XSS, CSRF, токени, що викрадають через API. У цій статті ми розглянемо три основні механізми: JWT, OAuth, сесії — порівняємо їхню безпеку, переваги, недоліки та покажемо, коли який варто використовувати.

Зміст статті:

Що таке автентифікація та авторизація?

Перш ніж говорити про JWT чи OAuth, треба розуміти базу:

  • Автентифікація — процес підтвердження: "це дійсно ви" (через пароль, SMS, біометрику).
  • Авторизація — процес визначення: "що ви можете робити" (напр., адмін, користувач, гість).

Наприклад:

👉 Ви входите в банк онлайн:

- Автентифікація: логін + пароль + 2FA

- Авторизація: ви бачите лише свій рахунок, а не чужий

⚠️ Важливо: навіть найкращий дизайн марний, якщо система автентифікації небезпечна.

Безпека починається не з пароля, а з правильно обраного механізму автентифікації.

Це найдавніший спосіб. Коли ви входите — сервер створює **сесію**, зберігає її в пам’яті (напр., Redis), і надсилає клієнту **Cookie з ID сесії**.

Як це працює?

  1. Користувач логінується → сервер створює `session_id`
  2. Сервер зберігає `session_id → user_data` в Redis
  3. Надсилає `Set-Cookie: session_id=abc123`
  4. Кожен наступний запит містить цей cookie → сервер перевіряє сесію

Переваги

  • Простота — добре для малих проектів
  • Можливість скасувати сесію — просто видалити з Redis
  • Не передається чутлива інформація — тільки ID

Недоліки

  • Залежність від стану (stateful) — важко масштабувати
  • CSRF-атаки — якщо немає `SameSite`, `CSRF Token`
  • XSS може викрасти cookie — якщо немає `HttpOnly`

⚡ Наприклад: сайт на Spring Boot з `Spring Session + Redis` — надійний варіант для корпоративних систем.

⚠️ Важливо: завжди використовуйте:

- `HttpOnly`

- `Secure`

- `SameSite=Lax/Strict`

- `CSRF protection` для форм

JWT: що це і чому всі про нього говорять?

JWT (JSON Web Token) — це **безстановий (stateless)** механізм. Токен містить усю інформацію про користувача і підписаний сервером.

Структура JWT

header.payload.signature

  • Header: алгоритм (`HS256`, `RS256`)
  • Payload: дані (user_id, role, exp)
  • Signature: підпис, щоб перевірити цілісність

Переваги JWT

  • Stateless — не треба зберігати сесії на сервері → легко масштабувати
  • Робота з API — ідеально для SPA, мобільних додатків
  • Міжсервісна взаємодія — мікросервіси можуть перевіряти токен без запиту до Auth-сервісу

Недоліки JWT

  • Неможливо скасувати раніше закінчення терміну — тільки blacklists (ускладнює stateless)
  • Розмір токена — більший, ніж сесійний ID
  • XSS може викрасти токен — якщо зберігається в localStorage

👉 Приклад: React + Spring Boot → JWT зберігається в `httpOnly cookie`, а не в `localStorage` — безпечніше.

⚠️ Важливо: ніколи не зберігайте секретний ключ у коді. Використовуйте `environment variables` або `vault`.

JWT — це не завжди краще. Це інструмент, який підходить для певного типу архітектури.

OAuth 2.0: коли потрібно "Увійти через Google"

OAuth 2.0 — це протокол **делегованої автентифікації**. Користувач не вводить пароль на вашому сайті, а довіряє Google, Facebook, GitHub.

Як це працює?

  1. Користувач натискає "Увійти через Google"
  2. Переходить на Google → схвалює доступ
  3. Google повертає **access token** вашому серверу
  4. Ваш сервер отримує дані (email, ім'я) і створює локального користувача

Переваги OAuth

  • Зручність для користувача — не треба реєструватися
  • Безпека — ви не зберігаєте паролі
  • Швидкий вхід → вище конверсія

Недоліки OAuth

  • Залежність від третьої сторони — якщо Google недоступний — користувачі не можуть увійти
  • Обмежений контроль — ви отримуєте лише те, що дозволив провайдер
  • Складність інтеграції — треба налаштувати redirect URI, secret, scopes

⚡ Наприклад: у кейсі Bloom ми додали "Увійти через Google" — кількість реєстрацій зросла на 40%.

⚠️ Важливо: OAuth — не заміна паролю. Краще давати вибір: "Email + пароль" або "Google/Facebook".

Порівняння: JWT vs Сесії vs OAuth

КритерійСесіїJWTOAuth
StateStatefulStatelessStateless (частково)
МасштабуванняСкладно (потрібен Redis)ЛегкоЛегко
СкасуванняМиттєве (видалити з Redis)Тільки по TTL або blacklistМожна відкликати токен
БезпекаВисока (при правильній настройці)Середня (XSS-ризики)Висока (провайдер гарантує)
ВикористанняSPA, монолітиAPI, мікросервісиSSO, соціальні входи

Жоден механізм не є "найкращим". Вибір залежить від архітектури, потреб і рівня безпеки.

Типові помилки при реалізації

Багато розробників роблять фатальні помилки, які відкривають двері хакерам.

❌ Зберігання JWT в localStorage

👉 XHR-запити можуть викрасти токен через XSS. Краще — httpOnly cookie.

❌ Довгий термін життя токена

JWT з `exp: 30 days` — це ризик. Краще:

- `access token`: 15–60 хв

- `refresh token`: 7 днів, зберігається в БД

❌ Відсутність CSRF-токенів при використанні сесій

Атакуючий може змусити користувача відправити форму без його відома.

❌ Простий секретний ключ JWT

`secret: "password"` — легко зламати. Використовуйте довгі, випадкові ключі.

❌ Відсутність rate limiting

Хто завгодно може брутфорсити логіни. Обов’язково обмежуйте кількість спроб.

⚠️ Важливо: безпека — це не опція. Це обов’язок.

Навіть найменша помилка в автентифікації може коштувати всі дані користувачів.

Часто задавані питання (FAQ)

Чи можна використовувати JWT і сесії одночасно?

Так. Наприклад: сесія для основного сайту, JWT для API. Але не комбінуйте без потреби — це ускладнює підтримку.

Чи безпечніше OAuth, ніж пароль?

Так, бо ви не зберігаєте паролі. Але ви залежите від провайдера. Краще — обидва варіанти.

Чи потрібно шифрувати JWT?

Ні. JWT підписується, але не шифрується. Якщо потрібно приховати дані — використовуйте JWE (JSON Web Encryption).

Як оновлювати JWT без повторного входу?

Через refresh token: коли access token закінчився, клієнт відправляє refresh token → отримує новий access.

Чи можна використовувати JWT для SSO?

Так, але краще використовувати OpenID Connect (надбудова над OAuth 2.0) для Single Sign-On.

Висновки

Вибір механізму автентифікації — це стратегічне рішення, яке впливає на безпеку, масштабованість та UX.

  • Сесії — добре для монолітів, де важлива контрольованість
  • JWT — ідеально для API, мікросервісів, SPA
  • OAuth — коли потрібно швидкий вхід і ви не хочете зберігати паролі

Головне правило: не винаходити велосипед. Використовуйте перевірені бібліотеки (напр., Spring Security, Passport.js) і дотримуйтесь best practices.

Потрібна безпечна автентифікація для вашого сайту?

Ми реалізуємо надійні системи входу на будь-якому стеку: Spring Boot, Next.js, React. Без компромісів у безпеці, з підтримкою OAuth, JWT, 2FA.