사용자의 디바이스에 “띵!”하고 알림이 도착하기까지, 그 이면에서는 어떤 일이 벌어지고 있을까?
2025년 어느 날, 회사 서비스에서 이벤트 알림을 푸시로 날리기로 결정했다.
우리 백엔드 팀의 역할은 단순했다.
하지만, 메시지는 ‘어떻게’ 사용자에게 전달되는 걸까?
Firebase Cloud Messaging(이하 FCM)을 사용하고 있었지만,
그 흐름을 제대로 이해한 건 이번이 처음이었다.
[내 서버] ──▶ [FCM Server] ──▶ [사용자 디바이스 (웹/앱)] ──▶ [알림 표시]
▲ ▲
│ │
인증/토큰 관리 Service Worker
웹 또는 앱에서 다음 과정을 거친다:
// Web 예시
const messaging = firebase.messaging();
const token = await messaging.getToken({
vapidKey: 'YOUR_PUBLIC_VAPID_KEY',
});
👉 이 token
은 사용자의 디바이스를 식별하는 유일한 키다.
서버 측에서는 REST API를 통해 메시지를 전송한다.
POST https://fcm.googleapis.com/v1/projects/{project-id}/messages:send
Authorization: Bearer {access_token}
Content-Type: application/json
요청 바디 예시:
{
"message": {
"token": "user_device_token",
"notification": {
"title": "새 소식!",
"body": "당신을 위한 새로운 이벤트가 도착했어요."
},
"data": {
"url": "/event/detail"
}
}
}
✅ notification
은 브라우저에서 자동 알림 생성
✅ data
는 개발자가 수동 처리 가능
token
을 통해 디바이스와 연결🧠 이때까지의 흐름:
[Server] → [FCM] → [Push Service] → [사용자 브라우저]
브라우저가 꺼지지 않고 백그라운드에서 살아있다면,
firebase-messaging-sw.js
또는 custom service-worker.js
가 메시지를 받는다.
// firebase-messaging-sw.js
self.addEventListener('push', function (event) {
const payload = event.data.json();
self.registration.showNotification(payload.notification.title, {
body: payload.notification.body,
icon: '/icon.png',
data: payload.data,
});
});
🧩 알림 표시 후 클릭 시, 특정 URL로 이동하거나 액션 처리 가능
(1) 클라이언트가 FCM 토큰 발급
↓
(2) 서버가 메시지를 생성
↓
(3) FCM 서버로 메시지 전송
↓
(4) FCM이 대상 디바이스로 Push
↓
(5) Service Worker가 수신 후 알림 표시
↓
(6) 사용자가 알림 클릭 (→ 웹 페이지 이동 등)
/topics/news
)“그냥 알림 보내는 거잖아.”
그렇게 생각했지만, 실제로는 꽤 섬세한 흐름과 관리가 필요한 영역이었다.
Firebase 덕분에 푸시는 쉬워졌지만,
어디서 누가 어떤 흐름으로 받는지를 파악해야
실제로 사용자 경험을 개선하는 알림을 만들 수 있다.
푸시는 기술이 아니라 연결이다.
알림 하나에도 수많은 기술자들의 고민과 흐름이 숨어 있다.