Как синхронизировать время между сервером и фронтендом?
Пусть сервер присылает не дату, а количество секунд до истечения времени.
А на клиенте запустите setInterval каждые 1000мс. (1с)
Профит(почти).

P.s. почему почти:
1) коллбэк сработает через 1000мс только если поток документа не заблокирован другими тяжёлыми синхронными вычислениями.
2) браузеры, хром в частности, могут оптимизировать тики таймеров, если пользователь покинул вкладку(перешёл на другую или свернул браузер). Таким образом, он будет тикать не каждые 1000мс, а реже. Я такого не встречал, но, возможно, вообще не будет тикать.

По моему опыту - в рамках нескольких минут, если свернуть браузер, таймер начинал отставать на несколько секунд.
Подозреваю некие костыли aka проблему X-Y.

Защитой от накрутки пользователем времени может быть только проверка на сервере.