В прошлом я использовал настройку двух файлов cookie, один из которых хранит идентификатор пользователя, а другой содержит контрольную сумму, которая проверяет идентификатор пользователя. Вот пример:
//store website user id
setcookie('userid', $userid, time() + 2592000, "/");
//store checksum
setcookie('checksum', md5($userid."F%^WD&*^("), time() + 2592000, "/");
Контрольная сумма - это соленый md5-хэш идентификатора пользователя, поэтому ее нельзя реверсировать или изменить для отражения другого идентификатора пользователя (в случае отсутствия контрольной суммы можно легко изменить файл cookie «идентификатор пользователя»).
Чтобы восстановить сеанс, вы просто проверяете файлы cookie и проверяете контрольную сумму (с той же «солью») по идентификатору пользователя:
//Restore stored user session
if (md5($_COOKIE["userid"]."F%^WD&*^(") == $_COOKIE["checksum"])
{
//retrieve user again and store in session
}