Если 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 устройства без публикации ключей подписки.
- Найдите все subscriptions старого и нового аккаунта.
- Проверьте обработчик logout и серверную операцию отвязки.
- Сопоставьте событие входа, выход и последнюю отправку.
- Проверьте selection query фоновой рассылки.
- Изучите ответы push-сервиса для устаревших endpoints.
Серверная отвязка важнее клиентской
Logout должен немедленно запретить персональную отправку, даже если unsubscribe в браузере не завершился.
- Subscription хранится как отдельное устройство.
- Связь с account имеет статус и время изменения.
- Logout деактивирует связь идемпотентно.
- Повторный вход создает осознанную новую привязку.
Как исправить проблему
Исправьте модель связи и очистите старые активные записи.
- Добавьте серверный endpoint отвязки в logout flow.
- Помечайте связь inactive до клиентского unsubscribe.
- Исключите неактивные subscriptions из всех персональных рассылок.
- Удаляйте endpoints по окончательному ответу push-сервиса.
- Проведите обезличенную очистку конфликтующих связей.
Как проверить результат
- После logout персональные push прекращаются сразу.
- Вход другого аккаунта не наследует старые темы.
- Одно устройство может безопасно сменить владельца сессии.
- Недействительные endpoints удаляются автоматически.
Типичные ошибки
- Удалять только cookie авторизации.
- Доверять исключительно успешному unsubscribe клиента.
- Хранить один push token прямо в таблице пользователя.
- Отправлять персональные данные в текст push без необходимости.
Как предотвратить повторение
- Моделируйте устройство и связь с аккаунтом отдельно.
- Тестируйте logout офлайн и смену пользователя.
- Обрабатывайте статусы push-провайдера.
- Минимизируйте чувствительное содержимое уведомлений.
Когда нужна помощь
Если push продолжает приходить после выхода, я проверю модель подписок, logout и очередь рассылки, отвяжу старые устройства и устраню риск отправки чужих уведомлений.