Время жизни на клиенте самого токена проверять не надо:
1. JWT может быть httpOnly, иначе это прямой удар по безопасности в виде возможности сXSSить этот токен скриптами
2. У пользователя на ПК время может отличаться от серверного. Допустим, время жизни JWT — 5 минут, а у пользователя часы спешат на 6 минут. Этой разницы недостаточно, чтобы SSL не установилось, зато достаточно, чтобы твой скрипт навсегда зациклился в попытке получить "свежий" токен, думая, что он несвежий
Поэтому делаешь так:
После успешного получения JWT ставишь в localStorage текущее время пользователя (пренебрегая разницей между действительным временем истечения и временем исполнения твоей функции — оно скорее всего не будет превышать пинг пользователя + 100мс). Каждый запрос прерываешь с помощью какого-нибудь
https://github.com/axios/axios#interceptors В этом "прерывателе" смотришь в localStorage и если прошло 50-80% (тут оставляем запас, потому что мы выше пренебрегли разницей + сам запрос может длится некоторое время [например, это могут быть сетевые задержки, или запрос будет лежать в очереди, пока воркеры заняты или какие-то запросы бэкенда в БД будут происходить до валидации JWT] + часы пользователя могут идти быстрее серверных и дать лишние пару микросекунд) времени жизни JWT — отправляешь сперва запрос на рефреш этого токена, а потом уже отправляешь сам запрос.