Они работают на математических функциях, а для вычисления каждого ключа (под ключем я имею в виду то число, которое генерируется, и которое вы вводите для авторизации) используется либо счетчик, либо последовательное хеширование.
Грубо говоря, в токене зашита некоторая односторонняя функция f(x), и некоторое стартовое число k. Сервер также знает, какая функция и какое число используется в токене, привязанном к вашему аккаунту.
Если это модель со счетчиком, то с помощью вашей функции вычисляется f(k), а затем k увеличивается на единицу (или изменяется как угодно еще, главное чтобы по известному алгоритму). Если это последовательные вычисления ключа, то каждый следующий ключ это результат работы функции на предыдущем ключе, то есть вычисляется f(k), потом f(f(k)), f(f(f(k))), и так далее.
Соответственно каждый раз, когда вы нажимаете на кнопку, токен вычисляет следующий ключ. Когда вы вводите его для авторизации, сервер также вычисляет тот же самый ключ и сравнивает их.