Безопасность
August 19

Про безопасность WEB-приложений

Дарова!

Сегодня разложим по полочкам аутентификацию и авторизацию: от старых добрых cookie-сессий до FIDO2-ключей. Будет много примеров, анти-паттернов и практических приёмов.


🔑 Зачем вообще делить на "AuthN" и "AuthZ"?

  • AuthN (Authentication) — «Кто ты?»
  • AuthZ (Authorization) — «Что тебе разрешено?»

Ошибка в любой из двух стадий = плохой исход. Например, если пользователь "гость" без проблем вызывает /admin, это провал AuthZ, даже если AuthN прошёл честно.


🧩 Классические схемы + подводные камни

🛠️ Подход и Уязвимости

  • Cookie-Session - CSRF, XSS, Session Fixation
  • Basic/Digest - Перехват без TLS, Brute Force
  • API-Key - Утечки в логи/Git, нет ротации

👉 Уточнение: Session Fixation часто ловят SPA-приложения, где frontend берёт сессию "как есть", не обновляя после логина. Меняйте session_id сразу после успешной аутентификации!


🪙 Токеновые бойцы

💳 Метод и 🕳️ Риски

  • JWT - "alg":"none», XSS → кража из localStorage
  • OAuth 2.0 - Неправильный redirect_uri, Implicit Flow leaks
  • OpenID Connect - Подделка id_token, слабый nonce
  • SAML 2.0 - XML Signature Wrapping, XXE
  • Magic Link - Перехват email, повторное использование

💡 Пояснение: длинный TTL в JWT = "чек в белый список". Нужно только сократить до 15-30 минут и использовать Refresh-токены с чёткой ротацией.


🛡️ Крипто-уровень и 2FA

  1. mTLS — сервер и клиент проверяют сертификаты друг друга.
  2. Kerberos — тикеты, популярно в AD-сетях.
  3. FIDO2/WebAuthn — биометрия + TPM, «паролей нет».
  4. TOTP/HOTP — 6-значные коды, знакомые по Google Authenticator.


🐞 Топ-атаки вне зависимости от метода

  • Brute Force / Password Spraying — массовый подбор слабых
  • Credential Stuffing — используем слитые базы (SQL-injection
  • Replay Attack — повторяем старый легальный запрос, если нет
  • Insecure Storage — токен в localStorage? XSS
  • CORS MisconfigAccess-Control-Allow-Origin: * 🤦‍♂️.


🚦 Практические анти-паттерны (и как их чинить)

😬 Анти-паттерн и ✅ Решение

  • UID в JWT без подписи - Подписывай и верифицируй ключом, хранящимся вне Git
  • Cookie без SameSite - SameSite=Strict (минимум Lax) + CSRF-токены
  • Токен в URL -Передавай в заголовке Authorization
  • Отсутствие ротации API-ключей - TTL + автоматическая регенерация


🔧 Мини-чек-лист перед релизом

✅ Проверка и Статус

  • HTTPS Only + HSTS - Argon2/bcrypt + соль ≥16 B
  • Rate-limit на /login - 2FA для админов
  • CSP + X-Frame-Options - Логирование подозрительных IP


🚀Реальный кейс: как мы «убили» сессию-фиксацию

В одном проекте юзер логинился, получал ту же сессию что и до логина. Атакующий мог зафиксировать ID до аутентификации, затем дождаться входа жертвы и… получить авторизацию.

Фикс:

  1. Перегенерируем session_id после логина.
  2. Ставим флаг HttpOnly + Secure.
  3. TTL на сессию — 30 мин.

Результат — отчёты Pentest’а стали скучнее, клиенты спокойнее 😊.


💬 Что дальше?

  1. Прототипируешь — начни с JWT + Refresh + SameSite cookie.
  2. Идёшь в энтерпрайз — присмотрись к SAML или OIDC.
  3. Хочешь «без паролей» — внедряй FIDO2 для core-пользователей.

И помни: нет серебряной пули. Комбинируй механизмы, минимизируй права, мониторь логи, и пусть прод живёт долго и счастливо! 🔥

До встречи в следующих постах! Если остались вопросы — пиши в комментарии, обсудим 👇