Сессии можно хранить в файлах, в базах данных (MySQL, sqlite, Redis, ...)
В php.ini параметр
session.save_handler - текущий обработчик сессий (files по умолчанию)
php -i | grep "Registered save" - посмотреть все зарегистрированные обработчики, эти обработчики могут устанавливаться расширениями php (к примеру php-redis)
Сессии в отличие от кук позволяют хранить гораздо больший объем данных, данные хранятся на сервере. Объем хранимых данных ограничивается только памятью, выделяемой под php-скрипт. Экспериментальным путем сохранял многомерные массивы размером до 15Мб в сессионных переменных. В случае файлов cookie размер данных ограничен: 1 файл куки не может хранить 4кб, количество кук ограничено для одного домена.
Скорость работы с сессионными переменными на стороне сервера весьма достойная. Циклы с сотнями тысяч повтором, в которых обрабатывается многомерный массив(присвоения и unset-ы) занимают полсекунды.
Хранение сессий в Redis
apt-get install redis-server php7.0-redis
/etc/init.d/php7.0-fpm restart
В php скрипте задаем параметры обработчика(в php.ini - можно также)
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379'); //для локального доступа без пароля, можно также задать пароль к redis
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-redis-server-as-a-session-handler-for-php-on-ubuntu-14-04
Существенной разницы в скорости работы с сессиями при использовании files и redis выявлено не было, проверка проводилась при малом количестве сессионных файлов в циклах обработки многомерных массивов, хранимых в сессиях, с миллионами повторов. Возможно, когда счет идет на тысячи сессионных файлов, redis себя проявит. Для небольших проектов можно не трогать сессионный обработчик, пользуясь files.