Сессии, JWT, Access, Refresh

Статья представляет собой конспект из нескольких источников. Если у вас есть дополнения/поправки или замечания, пишите о них в комментариях.

Основные понятия

Регистрация

Клиент отправляет данные для входа на сервер. Сервер создает аккаунт и часто сразу проводит аутентификацию (в большинстве случаев).

Регистрация
Регистрация

Аутентификация

Процесс, в результате которого сервер узнает, кто вы такой. Клиент отправляет данные для входа, сервер проверяет их валидность. Если данные верны, сервер создает токен или идентификатор и отправляет его клиенту.

Аутентификация
Аутентификация

Авторизация

Процесс, в результате которого сервер узнает, что вы можете делать, а что нет. Сервер выполняет авторизацию каждый раз, когда пользователь производит серверную операцию. Например, при отправке DELETE-запроса сервер проверяет токен и возвращает разрешение или отказ.

Авторизация
Авторизация

Логинизация

Логика на клиенте, которая отрабатывает в зависимости от успешности аутентификации. Например, флаг isAuthenticated меняется с false на true, и вместо кнопки "Войти" отображается иконка профиля.

Логинизация
Логинизация

Сессионная аутентификация (Session-based)

Как это работает:

Плюсы:

  • Безопасность: сессии хранятся на сервере.

Минусы:

  • 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.
1
Начать дискуссию