берешь классическую реализацию с access и refresh токен, у access токена время жизни минимальное. При запросе на рефреш к сервису уходит связка access и refresh, в хранилише с refresh окенами лежит связь с предыдущим access. Если связка подтверждена, возвращаешь новую пару с access и refresh и так до бесконечности. Отзык = удаление refresh токена. Если токены скомпроментированы, то тут 2 варика, если первым запросит рефреш настоящий юзер, то хакеру облом, если первым хакер, то юзера выкинет и это повод задуматься