Описанную мной выше схему, видимо, вполне можно сделать на стандартных сессиях, хранимых в куках.
1. Когда отдаем страницу, в нее встраиваем яваскрипт, инициализирующий строковую переменную x. Значение ее генерируем каждый раз случайно. Например, получилось "var x= 'JHd76skjs76'"
2. Страница содержит также яваскрипт, проверяющий, начинается ли window.name с подстроки "BUGAGA". Если да, то ничего не делает, если нет, то устанавливает window.name = "BUGAGA"+x. То есть, у нас получается window.name = "BUGAGAJHd76skjs76", и при дальнейших обновлениях вкладки не меняется;
3. При процедуре логина мы выколупываем из window.name строку "JHd76skjs76" и передаем ее вместе с логином и паролем.
4. Сервер, получив логин и пароль, получает также эту строку и сохраняет информацию о залогинившемся в $_SESSION["JHd76skjs76"]
5. Страница грузит в себя доступную только залогинившимся часть с помощью AJAX-запроса. В этот запрос она добавляет GET-переменную "MYTRICKYSESSID=JHd76skjs76". На стороне сервера мы проверяем, есть ли информация о залогиненном в $_SESSION[$_GET["MYTRICKYSESSID"]], если есть, то считаем его авторизованным.
Другой вариант, альтернативный AJAXу — грузить часть страницы в iframe, установив ему яваскриптом src c GET-переменной MYTRICKYSESSID=JHd76skjs76.
При такой схеме у нас вообще получатся независимые вкладки — можно быть в одной вкладке залогиненным, в другой — не залогиненным или залогиненным под другим пользователем.