Каждый JWT-токен это три блока - заголовок, полезная нагрузка и подпись. В заголовке хранится информация о самом токене (срок жизни, алгоритм подписи). Полезная нагрузка - информация приложения. Подпись - зашифрованный хэш первых двух частей. В распределённых системах выдавать токен может сервер авторизации, а использовать любой другой сервер. В таком случае подпись может быть асимметричной, закрытый ключ для подписания, открытый для проверки.
Токены выдаются парой, рабочий + обновления.
Рабочий токен выдаётся на короткое время (минуты - десятки минут). Внутри содержится срок окончания действия токена, идентификатор пользователя, его права, какая-то информация для минимизации обращений к БД по данному пользователю. Токен на сервере не сохраняется.
Токен обновления выдаётся на длительное время (часы - дни). Внутри содержится срок окончания действия токена и идентификатор пользователя для автоматической аутентификации. Токен обновления (или его идентификатор, если он есть в токене) хранится в БД вместе с идентификатором пользователя.
1. Клиент аутентифицируется/авторизуется на сервере со своим логином/паролем.
2. Сервер генерирует пару токенов, короткоживущий рабочий и долгоживущий для обновления. Токен обновления записывается в БД.
3. Клиент присылает запрос с рабочим токеном.
4. Сервер проверяет токен.
4а. Токен действительный и неистекший, сервер отвечает на запрос.
4б. Токен действительный, но истекший, сервер сообщает о необходимости обновления токена.
4в. Токен недействительный, сервер сообщает о необходимости входа по логину/паролю (на п.1).
5. Клиент присылает токен обновления.
6. Сервер проверяет токен, в том числе и в БД.
6а. Токен обновления недействительный, сервер сообщает о необходимости входа по логину/паролю (на п.1).
6б. Токен обновления действительный, но в БД отсутствует, сервер удаляет все токены обновления этого пользователя из БД и сообщает о необходимости входа по логину/паролю (на п.1).
6в. Токен обновления действительный, но просроченный, сервер удаляет этот токен из БД и сообщает о необходимости входа по логину/паролю (на п.1).
6г. Токен обновления действительный, непросроченный, в БД присутствует. Сервер удаляет этот токен из БД, генерирует новую пару, записывает новый токен обновления в БД и отправляет токены клиенту (на п.3).