Как правильно организовать аутентификацию пользователя при работе с Sockets?
Я бы предложил такую схему:

1. Клиент и сервер формируют общий ключ.
2. Клиент шифрует и отсылает пароль и логин на сервер.
3. Сервер проверяет наличие данного пользователя.
4. В случае совпадения логина и пароля клиенту дается сессионная метка.
5. При отправке сообщения отправляется и метка, если она «жива», то сообщение находит адресата.
6. Время от времени обновляется «метка».
При пройденной аутентификации (вот тут можно и нужно слазить в БД) на сокет заводится handshake.id, действующий на всё время подключения, и разные socket.id — на каждой из открытых страниц.
Обновлять «метки», как было предложено выше, смысла нет, достаточно уникального айди хендшейка.