Нужно понимать что если пользователь не авторизирован (то есть эта функция доступна любому зашедшему на сайт) то реализовать подобное технически нереально. Можно максимально затруднить процесс, но полностью решить проблему нет возможности.
Методы затруднения тут перечислили в основном, я коротко пробегусь по основным:
1) Куки - самый базовый метод, плюсы - простая реализация, для обычных пользователей работает весьма надежно. Минусы - легко обходится любым пользователем который знает как почистить куки или сменой браузера.
2) Эверкуки - продвинутые методы хранения меток на стороне клиента, там целый набор методов, читайте доку к библиотеке. плюсы - простой чисткой кукисов уже не лечится, минус - нужно дополнительно заморочиться, ну и смена браузера емнип сводит все на нет.
3) Фингерпринты - тема обширная, решение достаточно надежное, но основано на статистике, то есть имеет погрешность, которая много от чего зависит. Плюс - хорошо работает в качестве идентификатора, минус - может давать ложные срабатывания и опять же - смена браузера сильно снижает эффективность метода.