Если push приходит на старое устройство после выхода из аккаунта, новый владелец браузерного профиля может увидеть уведомление с чужими данными. Отмена серверной сессии сама по себе не удаляет Web Push subscription: endpoint продолжает существовать, пока приложение не изменит связь с пользователем.

Нельзя полагаться только на удаление локального токена. Сервер должен прекратить адресную отправку сразу после logout, даже если устройство офлайн и клиентский код не смог отписаться у push-сервиса.

Разделите браузерную подписку и учетную запись

Один endpoint может пережить несколько сессий, а пользователь может иметь несколько устройств.

  • После logout продолжаются персональные уведомления.
  • Вход под другим аккаунтом получает push прежнего пользователя.
  • Удаленная подписка снова появляется после синхронизации.
  • Сервер хранит несколько одинаковых endpoints без статуса.

Почему возникает проблема

Ошибка возникает, когда endpoint считается постоянным свойством пользователя и не имеет жизненного цикла устройства.

  • Logout удаляет cookie, но не отвязывает subscription в базе.
  • Отписка выполняется только на клиенте и теряется без сети.
  • Endpoint повторно связывается по старому кешированному user ID.
  • Рассылка выбирает подписки без проверки active и account link.
  • Ошибки gone или not registered не удаляют недействительные записи.

Пошаговая диагностика

Используйте хеш endpoint и внутренний ID устройства без публикации ключей подписки.

  1. Найдите все subscriptions старого и нового аккаунта.
  2. Проверьте обработчик logout и серверную операцию отвязки.
  3. Сопоставьте событие входа, выход и последнюю отправку.
  4. Проверьте selection query фоновой рассылки.
  5. Изучите ответы push-сервиса для устаревших endpoints.

Серверная отвязка важнее клиентской

Logout должен немедленно запретить персональную отправку, даже если unsubscribe в браузере не завершился.

  • Subscription хранится как отдельное устройство.
  • Связь с account имеет статус и время изменения.
  • Logout деактивирует связь идемпотентно.
  • Повторный вход создает осознанную новую привязку.

Как исправить проблему

Исправьте модель связи и очистите старые активные записи.

  1. Добавьте серверный endpoint отвязки в logout flow.
  2. Помечайте связь inactive до клиентского unsubscribe.
  3. Исключите неактивные subscriptions из всех персональных рассылок.
  4. Удаляйте endpoints по окончательному ответу push-сервиса.
  5. Проведите обезличенную очистку конфликтующих связей.

Как проверить результат

  • После logout персональные push прекращаются сразу.
  • Вход другого аккаунта не наследует старые темы.
  • Одно устройство может безопасно сменить владельца сессии.
  • Недействительные endpoints удаляются автоматически.

Типичные ошибки

  • Удалять только cookie авторизации.
  • Доверять исключительно успешному unsubscribe клиента.
  • Хранить один push token прямо в таблице пользователя.
  • Отправлять персональные данные в текст push без необходимости.

Как предотвратить повторение

  • Моделируйте устройство и связь с аккаунтом отдельно.
  • Тестируйте logout офлайн и смену пользователя.
  • Обрабатывайте статусы push-провайдера.
  • Минимизируйте чувствительное содержимое уведомлений.

Когда нужна помощь

Если push продолжает приходить после выхода, я проверю модель подписок, logout и очередь рассылки, отвяжу старые устройства и устраню риск отправки чужих уведомлений.