Как правильно распознавать авторизованного пользователя?
Сессия в PHP - это практически те же ваши "куки + БД", только вместо БД используется файл сессии. Он будет свой для каждого пользователя.
Генерируется уникальный хэш (ID сессии), он садится пользователю в куки, а на сервере создаётся файл с именем == ID сессии. PHP все это делает сам.

 В файле сессии (на сервере) хранятся все переменные, которые вы захотите. Когда поднимается сессия, PHP автоматически инициирует массив $_SESSION
с вашими переменными (Имя пользователя, IP пользователя, дата последнего логина, права пользователя и тп).

Под работу с сессиями в PHP есть встроенные функции, они не все работают очевидным образом, но разобраться можно.

PS: Если не поддерживаются куки, то ID сессии может передаваться как параметр в URL.

есть ли возможность в случае с сессиями сохранить пользователя к примеру на месяц? Да. Ставите у сессионной куки время жизни 1 месяц, и через месяц браузер пользователя автоматически её уничтожит. После этого надо будет авторизоваться заново.
Но на сервере есть параметр настроек PHP session.gc_maxlifetime, который задает время жизни PHP-сессии на сервере. После истечения session.gc_maxlifetime PHP garbage collection удаляет файл сессии на сервере. То есть, его надо ставить > месяца.

какой вариант предпочтительнее вопрос холливарный. Если есть надо мониторить пользователей (кто, когда и зашёл и что сделал) - по БД это удобнее, чем рыться руками по тысяче файлов.
В плане безопасности - одинаково, тк работает один и тот же механизм. Угон куков -> подмена сессии.

PS: На хабре есть неплохая статья Подводные камни использования сессий в PHP.
По мне сессии удобно использовать. Я в своих проектах всегда использовал сессии, но если нужно запомнить пользователя, то можно сгенерировать для него уникальный хеш и записать его в куки и бд. При входе проверяется есть ли кука с хешем и если есть, то авторизуем пользователя извлекая данные с полей где присутствует этот уникальный хеш. И что главное сессии нельзя подменить.