Сессии, JWT, Access, Refresh
Статья представляет собой конспект из нескольких источников. Если у вас есть дополнения/поправки или замечания, пишите о них в комментариях.
Основные понятия
Регистрация
Клиент отправляет данные для входа на сервер. Сервер создает аккаунт и часто сразу проводит аутентификацию (в большинстве случаев).
Аутентификация
Процесс, в результате которого сервер узнает, кто вы такой. Клиент отправляет данные для входа, сервер проверяет их валидность. Если данные верны, сервер создает токен или идентификатор и отправляет его клиенту.
Авторизация
Процесс, в результате которого сервер узнает, что вы можете делать, а что нет. Сервер выполняет авторизацию каждый раз, когда пользователь производит серверную операцию. Например, при отправке DELETE-запроса сервер проверяет токен и возвращает разрешение или отказ.
Логинизация
Логика на клиенте, которая отрабатывает в зависимости от успешности аутентификации. Например, флаг isAuthenticated меняется с false на true, и вместо кнопки "Войти" отображается иконка профиля.
Сессионная аутентификация (Session-based)
Как это работает:
Аутентификация: Клиент отправляет данные для входа, сервер проверяет их и создает сессию. Сервер возвращает клиенту UUID сессии, который хранится в куках.
Авторизация: Клиент отправляет куки на сервер, сервер проверяет валидность сессии и возвращает положительный ответ.
Плюсы:
Безопасность: сессии хранятся на сервере.
Минусы:
Bottleneck (подробнее): При большом количестве пользователей нагрузка на сервер увеличивается.
Аутентификация на основе токенов (Token-based)
Как это работает:
Аутентификация: Клиент отправляет данные для входа, сервер проверяет их и создает токен (например, JWT), который отправляется клиенту.
Авторизация: При каждом запросе клиент отправляет токен в заголовке Bearer <token>. Сервер проверяет токен и возвращает положительный ответ.
Плюсы:
Нет необходимости хранить данные на сервере, что предотвращает bottleneck.
Минусы:
Менее безопасен, так как токен хранится на клиенте.
Перейдем на уровень ниже.
JWT токен
JWT (JSON Web Token) — это строка в формате base64, которая состоит из трех частей:
Header (Заголовок)
Содержит информацию о типе токена (JWT) и алгоритме шифрования.Payload (Полезная нагрузка)
Содержит утверждения (claims) — данные о пользователе, сроке действия токена и т.д.Signature (Подпись)
Хэш токена, созданный на основе алгоритма из заголовка и зашифрованный с помощью приватного ключа.
Важно: Не храните в токене пароли или другую важную информацию, так как токен можно раскодировать.
Access Token и Refresh Token
Access Token
Access Token — это токен, который клиент использует для доступа к защищённым ресурсам на сервере. Обычно он имеет короткий срок жизни.
Refresh Token
Refresh Token — это токен, который используется для получения нового Access Token, когда текущий Access Token истекает. Обычно он имеет длительный срок жизни.
Как работает:
После успешной аутентификации сервер создает и отправляет клиенту Access Token и Refresh Token.
Клиент сохраняет Refresh Token в безопасном месте (например, в HTTP-only куках).
Когда Access Token истекает, клиент отправляет Refresh Token на сервер для получения нового Access Token.
Сервер проверяет Refresh Token и, если он действителен, выдаёт новый Access Token.
Источники:
Аутентификация в ASP.NET Core — YouTube
Аутентификация. Сессии и JWT — YouTube
Что такое JWT, Access и Refresh токены — YouTube