From 3786800f121c9ecdbf360c2c6e12cf48802ff0ed Mon Sep 17 00:00:00 2001 From: chpark Date: Sat, 30 May 2026 22:26:06 +0900 Subject: [PATCH] =?UTF-8?q?fix(push/subscribe):=20=EA=B0=99=EC=9D=80=20use?= =?UTF-8?q?r=5Fid=20=EC=9D=98=20=EC=97=AC=EB=9F=AC=20endpoint=20=EB=8F=99?= =?UTF-8?q?=EC=8B=9C=20=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 옛 정책: 같은 user_id 의 다른 endpoint 자동 DELETE → 마지막 구독 1개만 유지 새 정책: 모든 endpoint 유지 (PC Chrome / 모바일 Chrome / 삼성 인터넷 / 앱 동시 구독 가능) 문제 사례: - momo125 가 모바일 Chrome 에서 구독 → DB (momo125, chrome_endpoint) - 그 후 삼성 인터넷에서 구독 시도 → DB 의 chrome_endpoint 가 삭제되며 삼성만 남음 - PC 에서 발송하면 양쪽 다 안 오는 케이스 발생 만료(404/410)된 endpoint 는 sendPush 내부에서 자동 정리되어 누적 위험 없음. Co-Authored-By: Claude Opus 4.7 --- src/app/api/m/push/subscribe/route.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/app/api/m/push/subscribe/route.ts b/src/app/api/m/push/subscribe/route.ts index c86a7b7..e99b1f3 100644 --- a/src/app/api/m/push/subscribe/route.ts +++ b/src/app/api/m/push/subscribe/route.ts @@ -33,13 +33,10 @@ export async function POST(req: NextRequest) { [createObjectId(), userId, endpoint, p256dh, auth, userAgent] ); - // 같은 사용자의 이전 구독은 정리 — 마지막에 구독한 기기/앱 하나만 유지. - // 브라우저(삼성 인터넷 등)로 먼저 구독해 둔 게 남아 앱이 아닌 브라우저 알림으로 - // 오던 문제 방지. (앱에서 다시 켜면 옛 브라우저 구독이 제거됨) - await pool.query( - `DELETE FROM momo_push_subscriptions WHERE user_id = $1 AND endpoint <> $2`, - [userId, endpoint] - ).catch(() => {}); + // 옛 정책(같은 user_id 마지막 1개만 유지)은 제거 — 한 사용자가 PC Chrome / + // 모바일 Chrome / 삼성 인터넷 / 모모유통 앱 등 여러 채널 동시 구독을 허용. + // 만료(404/410)된 endpoint 는 sendPush 내부에서 자동 정리되므로 stale 누적 없음. + // (참고: User-Agent 가 동일하고 endpoint 만 갱신된 경우는 위의 UPSERT 가 갱신 처리) // 구독 직후 환영 푸시 — 전체 파이프라인(서버→푸시서비스→기기) 동작 즉시 확인용 const welcome = await sendPush(