артём шумейко
Аутентификация и авторизация в Python: сессии и JWT токены
в Backend-разработке

Senior Backend engineer

Ex-Самокат

22.04.2026
В современном мире разработки программного обеспечения аутентификация и авторизация являются ключевыми концепциями, необходимыми для обеспечения безопасности и контроля доступа пользователей. В этом подробном материале мы рассмотрим основы регистрации, аутентификации и авторизации, а также два популярных механизма аутентификации — сессионный механизм и JWT токены. Разберем их принципы работы, отличия, плюсы и минусы, а также практические аспекты реализации на Python с использованием FastAPI и SQLAlchemy.

Материал будет полезен как начинающим, так и опытным разработчикам, стремящимся углубить свои знания в backend-разработке и безопасности приложений.
Автор – Артём Шумейко, Senior Python Разработчик
Самокат

Senior Engineer

/Разрабатывал платформу аналитики данных с ETL для всех бизнес-юнитов
FinTech (под NDA)
FullStack Developer
/Разработал платформу мгновенного отображения торговых сделок с нагрузкой >5000 op/sec
Курс по FastAPI

Автор и наставник

/Создал курс по FastAPI, победив в номинации «Прорыв года» на Stepik со средней оценкой 4.9
Введение в аутентификацию и авторизацию: основные понятия
Аутентификация и авторизация — фундаментальные процессы в разработке современных программных продуктов, обеспечивающие безопасность и контроль доступа пользователей к ресурсам приложения.

В широком смысле аутентификация — это процесс подтверждения личности пользователя, то есть проверка, кто именно обращается к системе. Авторизация же отвечает за проверку прав пользователя, то есть что он может делать внутри системы после того, как его личность подтверждена.
Важной особенностью является то, что авторизация и аутентификация — это разные этапы. Пользователь может быть аутентифицирован (подтвердил свою личность), но не иметь прав на выполнение конкретных действий (не авторизован). Например, гость на сайте YouTube может смотреть общедоступные видео без авторизации, то есть без предоставления учетных данных, но для загрузки видео или комментирования потребуется авторизация.

В контексте веб-приложений, API и мобильных приложений аутентификация реализуется через различные механизмы — хранение сессий, токены и другие методы. При этом протокол HTTP является статeless (без состояния), что требует от клиента при каждом запросе передавать некие учетные данные для поддержания сессии взаимодействия с сервером.
Регистрация, аутентификация и авторизация: отличия и этапы
Процесс взаимодействия пользователя с системой можно разбить на четыре ключевых этапа:
  1. Регистрация — пользователь предоставляет свои данные (например, имя, почту, пароль), которые сервер сохраняет в базе данных. Это создание новой учетной записи.
2. Аутентификация — подтверждение личности пользователя через логин и пароль или другие методы. Сервер сверяет полученные данные с хранилищем и, если данные совпали, выдает пользователю учетные данные для дальнейших запросов.
3. Авторизация — проверка прав пользователя на выполнение конкретных операций. Не всегда требует обращения к базе данных, часто данные о правах включаются в токены или сессии.
4. Выход из системы (logout) — удаление учетных данных с клиента и/или сервера для завершения сессии и предотвращения дальнейшего доступа.

Примечательно, что регистрация и аутентификация часто совмещаются: после регистрации пользователь автоматически получает учетные данные и может использовать приложение без дополнительного входа.
Сессионный механизм (Session-based authentication): принцип работы и хранение сессий
Сессии — один из классических и самых распространённых способов аутентификации, появившийся ещё в конце XX века. В основе лежит идея хранения информации о пользователе на сервере, а клиент получает лишь уникальный идентификатор сессии — токен.

Как работает сессия:
  1. Пользователь вводит логин и пароль, отправляет их на сервер.
  2. Сервер проверяет данные в базе и создает новую сессию — уникальную случайную строку (токен).
  3. Токен сохраняется на сервере (в базе данных или в оперативной памяти) и отправляется клиенту, чаще всего через HTTP cookie.
  4. При каждом последующем запросе клиент отправляет этот токен серверу.
  5. Сервер сверяет полученный токен с хранилищем, если сессия валидна — выполняет запрос от имени пользователя.
Токен сессии обычно представляет собой UUID или случайную строку, сгенерированную с помощью библиотек, например secrets в Python. Для безопасности в базе хранится не сама сессия, а её хэш — односторонний результат хеширования, который невозможно восстановить обратно. Это защищает от использования украденных данных базы.
Хранение сессий в Redis и базах данных: выбор и особенности
Выбор хранилища сессий зависит от нагрузки и архитектуры приложения:
  • PostgreSQL и другие реляционные базы подходят для приложений с небольшой или средней нагрузкой (до 50-100 запросов в секунду). Это удобно для Pet-проектов и стартапов без высокой масштабируемости.
  • Redis — высокопроизводительное хранилище в оперативной памяти, оптимально для Enterprise и приложений с большой нагрузкой (сотни и тысячи запросов в секунду). Redis поддерживает быстрое выставление срока жизни (expire) ключей, что упрощает управление сессиями.
Redis также широко используется благодаря возможностям репликации, бэкапов (RDB, AOF), что обеспечивает надёжность хранения данных. В продакшене Redis не рассматривается как игрушка, а как полноценная часть инфраструктуры.
Механизмы продления и инвалидации сессий
Для безопасности и удобства пользователей сессии имеют ограниченный срок жизни и механизмы продления:
  • Абсолютный тайм-аут — сессия действует ограниченное время (например, 3 месяца), после чего требуется повторная аутентификация.
  • Тайм-аут бездействия (idle timeout) — сессия истекает, если пользователь не проявляет активности в течение установленного периода (например, 5 минут в банковских приложениях).
Часто используется комбинация этих двух подходов. При активности пользователя срок действия сессии продлевается, обычно обновляется ключ в Redis с помощью команды EXPIRE, что более эффективно, чем обновлять записи в реляционной базе.

Инвалидация сессии — важный механизм безопасности. Если сессию украли, её можно быстро удалить из хранилища, что мгновенно лишит злоумышленника доступа.
Практическая демонстрация работы с сессиями на Python и FastAPI
Реализация сессий на FastAPI с использованием SQLAlchemy и Redis выглядит следующим образом:
  • При логине сервер проверяет пользователя, генерирует случайный токен сессии и хэширует его.
  • Хэш сохраняется в Redis или базе данных, а токен отправляется клиенту в cookie с параметром HttpOnly, что предотвращает доступ к нему из JavaScript и снижает риск XSS-атак.
  • При каждом запросе клиент автоматически отправляет cookie, сервер проверяет валидность сессии.
  • Для выхода из системы сервер сбрасывает cookie, устанавливая срок истечения в текущий момент, что удаляет сессию на клиенте.
  • Важный момент — ответственность backend-разработчика за правильную настройку cookie: HttpOnly, Secure, SameSite и другие параметры, чтобы обеспечить безопасность и корректное поведение в браузерах.
JWT токены (Token-based authentication): структура и особенности
JWT (JSON Web Token) — современный механизм token-based аутентификации, появившийся в 2014 году. Он представляет собой компактный, самодостаточный токен, содержащий в себе данные о пользователе и подпись для проверки подлинности.
Структура JWT:
  • Header — информация о типе токена и алгоритме подписи (например, HS256).
  • Payload — полезная нагрузка с данными (claims), такими как sub (идентификатор пользователя), exp (время истечения), iat (время выпуска), а также кастомные права и роли.
  • Signature — криптографическая подпись, которая защищает от подделки токена.
Токен кодируется в Base64URL и разделяется точками, например: header.payload.signature.
JWT можно декодировать (например, на сайте jwt.io) и прочитать его содержимое, но нельзя без секретного ключа изменить payload, так как подпись станет недействительной.
Генерация, хранение и использование Access и Refresh токенов
В системе с JWT обычно используются два токена:
  • Access token — короткоживущий токен (обычно 15-30 минут), который передается с каждым запросом для аутентификации пользователя.
  • Refresh token — долгоживущий токен (до месяца и более), который используется для получения нового access token после истечения срока действия.
Процесс генерации и использования:
  1. При логине сервер проверяет пользователя, создает access token и refresh token.
  2. Access token не хранится на сервере, он полностью самодостаточен.
  3. Refresh token хранится в базе данных (в зашифрованном или хешированном виде).
  4. Клиент хранит оба токена в HTTP-only cookie для защиты от XSS.
  5. При истечении access token клиент отправляет refresh token на специальный endpoint для получения новых токенов.
  6. Сервер проверяет refresh token в базе, если он валиден — выдает новую пару токенов и аннулирует старый refresh token.
Особенности безопасности JWT токенов и рекомендации по хранению
JWT токены несут в себе определённые риски и требуют аккуратного обращения:
  1. Нельзя хранить в JWT чувствительные данные (пароли, ключи, номера телефонов, e-mail), так как payload может быть прочитан при декодировании.
  2. Refresh токен должен храниться только в HTTP-only cookie, чтобы JavaScript не мог получить доступ и минимизировать риск XSS.
  3. Access токен иногда хранят в памяти или session storage, но лучше тоже в куках.
  4. Из-за отсутствия централизованного хранилища access токен сложно инвалидировать до истечения срока, что создает риск, если токен украден.
  5. Для повышения безопасности в микросервисной архитектуре лучше использовать алгоритмы с асимметричным шифрованием (RS256), которые позволяют валидировать токены без передачи приватного ключа.
Обновление и инвалидация JWT токенов: механизмы и сложности
Обновление токенов реализуется через refresh token:
  • Клиент при истечении access token отправляет refresh token на специальный endpoint.
  • Сервер проверяет валидность refresh token, аннулирует старый и создает новую пару токенов.
  • Это предотвращает вечный доступ злоумышленников при краже refresh токена.
Инвалидация access token проблематична, так как он не хранится на сервере. Решением может быть:
  • Использование поля jti (JWT ID) для хранения идентификатора токена и ведения черного списка (revocation list) на сервере, что фактически превращает JWT в сессии.
  • Но это снижает преимущества JWT, так как требует дополнительного хранилища и обращений к нему.
Сравнение сессий и JWT токенов: плюсы, минусы и сферы применения
Практические аспекты работы с HTTP куки и заголовками авторизации
В веб-приложениях сессии и JWT токены обычно хранятся в куках с параметром HttpOnly, что защищает от XSS-атак, так как JavaScript не имеет к ним доступа. Куки автоматически отправляются браузером при каждом запросе.

При взаимодействии микросервисов или API без браузера используют HTTP заголовок Authorization с типом Bearer, куда помещают access token. Это стандартный подход для межсервисной аутентификации.
Частые вопросы и ответы по кэшированию
Если тебе интересна Backend разработка, приглашаем на практический курс “Backend-разработка на Python” 

Что ты получишь на курсе:
  • Более 40 часов видеоматериалов, легко совмещаемых с работой
  • Изучение асинхронности в Python (asyncio, Task Group)
  • Освоение FastAPI — современного и востребованного фреймворка
  • Глубокая работа с базами данных, SQL и ORM, включая сложные запросы
  • Авторизация и аутентификация (JWT, хеширование паролей)
  • Работа с Redis, фоновыми задачами (Celery), тестированием (PyTest)
  • Анализ и разбор реальных продакшн-проектов с тысячами строк кода
  • Модуль по архитектуре, паттернам проектирования и обработке ошибок
  • Практические задания, проверяемые опытными менторами
  • Возможность написать полноценный проект с помощью наставников
и это еще не все
Всё, что пригодится на работе Backend разработчику — в одном курсе. 30+ практических заданий, чат с ментором, 2 проекта в портфолио.
Курс "Backend разработка на Python"
НАЧАТЬ БЕСПЛАТНО
Изучай программу и возможности подробнее на сайте и записывайся на экскурсию по обучению


pytex.school
Заключение и советы по выбору механизма аутентификации для проектов
Выбор между сессионным и token-based (JWT) механизмом аутентификации зависит от множества факторов, в том числе архитектуры приложения, требований безопасности, объёма нагрузки и специфики бизнеса.
  1. Для монолитных приложений и систем с высокими требованиями к безопасности (например, банковские приложения) сессии остаются актуальным и надёжным способом, так как позволяют легко управлять сессиями и быстро инвалидировать доступы.
  2. Для микросервисной архитектуры, распределённых систем и мобильных приложений, где важна масштабируемость и минимальное количество обращений к базе, предпочтительнее использовать JWT токены с разделением на access и refresh токены.
  3. Безопасность в JWT требует особого внимания к хранению токенов на клиенте и правильной реализации логики обновления и инвалидации.
  4. В любом случае необходимо оценивать бизнес-контекст, риски и удобство для пользователей.
Надеемся, материал помог понять базовые принципы аутентификации и авторизации, а также на практике реализовать сессионный и token-based подходы с использованием Python, FastAPI и SQLAlchemy. Осознанный выбор между этими механизмами позволит создавать более безопасные и масштабируемые backend-приложения.