TGViewer
QA_Road_channel QA_Road_channel @qa_road_channel · 6.89K subscribers
Post #538 2.26K
Варианты аутентификации: session vs token и что за зверь OAuth

В посте про идентификацию/аутентификацию/авторизацию разобрали разницу понятий. Дальше логичный вопрос - как система "запоминает", что пользователь уже вошёл. Есть два принципиально разных подхода.


📌 Session-based

Сессия - запись на сервере вида "пользователь 42 залогинен, роль admin". HTTP - протокол без памяти, сессия существует, чтобы это обойти.

- Сервер создаёт запись у себя (база, Redis, в памяти процесса) и выдаёт клиенту только её идентификатор, обычно в cookie
- При каждом запросе сервер берёт ID из cookie и ищет запись в своём хранилище
- Плюс - доступ можно отозвать мгновенно, удалив запись на сервере
- Минус - нужно общее хранилище сессий для всех инстансов, что усложняет масштабирование


📌 Token-based

- Сервер не хранит состояние - вся информация закодирована в самом токене (JWT), подписанном при выдаче
- Проверка - сервер пересчитывает подпись тем же ключом и сравнивает с той, что в токене, без похода в базу
- Плюс - легко масштабируется, любой сервис проверяет токен самостоятельно
- Минус - токен нельзя отозвать мгновенно без deny-list, пока не истечёт срок - для баланса безопасности и удобства используют короткий access token плюс refresh token с ротацией, разбирали в прошлом посте

Session-based обычно выбирают для веба в один домен, token-based - для API, мобильных приложений и микросервисов и ситуаций, где фронтенд и бэкенд живут на разных доменах.


🔴 OAuth 2.0: делегирование доступа, а не аутентификация

OAuth - это "разреши приложению X действовать от твоего имени в Y", без передачи пароля третьей стороне. Grant type - сценарий, которым приложение доказывает серверу авторизации право на токен.


📌 Authorization Code - для реальных пользователей

Пример - "Войти через Google" на Spotify: пользователь логинится у Google и подтверждает доступ, Google возвращает Spotify authorization code через редирект, Spotify на своём сервере обменивает code плюс client_secret на access token. Та же схема у GitHub, Apple ID, корпоративного SSO.

Обязательно применяется с PKCE - клиент передаёт хешированный секрет заранее и раскрывает его только при обмене code на токен, поэтому перехваченный код бесполезен без него.


📌 Client Credentials - без пользователя

Для связи между сервисами, где человека физически нет - например, ночной cron-скрипт, синхронизирующий данные между внутренними сервисами. Клиент авторизуется своим ID и secret, токен представляет само приложение.


🌿Ловушки для QA

1. Logout при session-based - запись должна удаляться на сервере, а не только cookie на клиенте
2. Logout при token-based - без deny-list или короткого TTL токен валиден до истечения даже после выхода
3. В OAuth-флоу проверь строгую валидацию redirect_uri - иначе возможна кража code через открытый редирект
4. Client Credentials не должен давать доступ к данным пользователя - токен представляет только приложение
5. При смешении сессий и токенов проверь согласованную инвалидацию при смене пароля или блокировке
6. Authorization code должен быть одноразовым - повтор должен быть отклонён


Поставь 🔥, если полезно
  • 🔥 41
  • 🤣 1
More from @qa_road_channel
  1. Sep 21, 2026Агенты придумали свой язык. И обошли запрет на связь с внешними акторами. 🧩 Лаборатория E…
  2. Sep 18, 2026🚀 Старт курса «Что под капотом у ИИ» — 29 сентября в 21:00 мск Открыто и бесплатно 😎 Есл…
  3. Sep 13, 202613 сентября отмечают день разработчика Поздравляю всех причастных с праздником 🎉
  4. Sep 9, 2026Мы начинаем посиделки старт в 19:00 МСК Ссылка на эфир: https://youtube.com/live/apHpUcuD4…
  5. Sep 9, 2026С праздником, коллеги! 🎉 Оказывается, ещё в 1876 году, работая над своими проектами по ос…
  6. Sep 8, 2026У тестировщиков редко бывает одинаковая работа. 😺 Один меняет IT на стройку и заново соби…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →