Firebase Cloud Messaging(FCM)은 모바일 및 웹 애플리케이션을 위해 설계된 Google의 크로스 플랫폼 푸시 알림 및 메시지 전송 서비스입니다. FCM은 영구적인 네트워크 연결을 유지할 필요 없이 서버와 클라이언트 기기 간의 안정적인 데이터 전송을 보장합니다. Firebase Documentation, 2026에 따르면 FCM 인프라를 통해 전 세계에서 매일 3,000억 개 이상의 메시지가 처리됩니다. 이 서비스는 자동으로 표시되는 알림과 백그라운드에서 데이터 전송을 위한 data 메시지를 모두 지원합니다.
핵심 포인트
Firebase Cloud Messaging은 애플리케이션 서버와 클라이언트 기기 간에 푸시 알림 및 data 메시지 전송을 보장하는 Google의 클라우드 서비스입니다. 이 서비스는 기존 Google Cloud Messaging(GCM)을 대체했으며 Firebase 생태계에서 푸시 전송의 표준 솔루션이 되었습니다. FCM은 Android, iOS, Web, Unity를 지원하며 대상 플랫폼에 관계없이 통합된 전송 인터페이스를 제공합니다.
이 서비스는 각각 특정 작업을 해결하는 여러 메시지 전송 메커니즘을 제공합니다. Notification 메시지는 수신 시 시스템에 의해 자동으로 표시되므로 개발자가 알림을 표시하는 코드를 작성할 필요가 없습니다. Data 메시지는 키-값 쌍으로 임의의 페이로드를 전송하며 애플리케이션 내에서 처리됩니다. 복합 메시지는 최대 유연성을 위해 표시 부분과 숨겨진 부분을 모두 포함합니다.
자체 푸시 서버를 구현하려면 각 기기와 지속적인 TCP 연결을 유지해야 하며, 이는 비효율적이고 안전하지 않습니다. FCM은 Google의 통합 인프라를 사용하여 동시에 수십억 대의 기기와 연결을 유지합니다. 이 서비스는 전송 재시도, 메시지 대기열 및 부하 분산을 자동으로 관리하여 개발자가 이러한 작업을 직접 해결할 필요가 없도록 합니다.
FCM 아키텍처는 공급자 서버(백엔드), Firebase Cloud Messaging 서버 및 기기의 클라이언트 애플리케이션의 세 가지 주요 구성 요소로 구성됩니다. 서버가 메시지를 보내면 먼저 FCM 인프라에 도달하고, FCM이 이를 대상 기기로 라우팅합니다. 기기가 오프라인 상태인 경우 FCM은 메시지를 대기열에 저장하고 연결이 복원되면 전송합니다.
첫 실행 시 애플리케이션이 Firebase SDK를 호출하여 FCM 서비스에 기기를 등록하고 고유한 Registration Token을 받습니다. 이 토큰은 약 150자 길이의 문자열로 특정 기기의 특정 애플리케이션 인스턴스를 식별합니다. 토큰은 애플리케이션 재설치, 데이터 삭제 또는 백업 복원 시 변경될 수 있으므로 개발자는 onNewToken 델리게이트를 통해 토큰 업데이트를 처리해야 합니다.
서버가 FCM API를 통해 요청을 보내면 메시지는 여러 단계를 거칩니다. 수신 및 검증 — FCM이 요청의 유효성과 대상 기기의 존재를 확인합니다. 대기열 — 기기를 사용할 수 없는 경우 메시지가 저장 대기열에 들어갑니다. 라우팅 — FCM이 최적의 전송 채널(WiFi 또는 모바일 데이터)을 결정합니다. 전송 — 시스템이 대상 애플리케이션으로 메시지를 전송합니다. 성공적인 전송 후 FCM은 서버에 메시지 ID를 반환합니다.
Firebase Cloud Messaging은 각각 클라이언트 측에서 고유한 처리 특성을 가진 세 가지 메시지 유형을 지원합니다. Notification 메시지는 Android에서 Google Play Services, iOS에서 APNs에 의해 처리되며 자동으로 푸시 배너로 표시됩니다. Data 메시지는 애플리케이션에 직접 전송되며 Android의 onMessageReceived 콜백과 iOS의 application(_:didReceiveRemoteNotification:)을 통해 처리됩니다.
Notification 메시지에는 title, body, 이미지 URL 및 알림 사운드와 같은 미리 정의된 필드가 포함됩니다. 시스템이 자동으로 알림을 생성하여 시스템 트레이에 표시합니다. 애플리케이션이 백그라운드에 있거나 종료된 경우에도 마찬가지입니다. 사용자는 제목과 텍스트가 있는 표준 배너를 보고 탭하면 페이로드로 전송된 데이터와 함께 애플리케이션이 열립니다. 애플리케이션이 활성 상태인 경우 notification 메시지를 가로채서 코드에서 처리할 수 있습니다.
Data 메시지는 미리 정의된 필드 없이 키-값 쌍의 사용자 지정 집합입니다. 페이로드는 시스템에 의해 자동으로 처리되지 않으며 애플리케이션이 원시 데이터를 받아 임의로 해석할 수 있습니다. Data 메시지는 백그라운드 데이터 동기화, 로컬 캐시 업데이트, 동기화 트리거 또는 알림을 표시하지 않고 명령을 보내는 데 사용됩니다. Android에서는 애플리케이션이 종료되거나 백그라운드에 있어도 data 메시지가 항상 전송됩니다.
FCM은 notification 부분(표시용)과 data 부분(처리용)을 모두 포함하는 메시지 전송을 허용합니다. 복합 페이로드에는 미리 정의된 notification 필드와 임의의 data 키가 모두 포함됩니다. 시스템은 notification 부분에서 알림을 표시하고 data 부분은 열 때 애플리케이션의 인텐트 엑스트라로 전달됩니다. 이는 사용자에게 알림을 표시하는 동시에 특정 화면으로 이동하기 위한 컨텍스트를 전달해야 하는 시나리오에 유용합니다.
| 유형 | 자동 표시 | 백그라운드 처리 | 예시 |
|---|---|---|---|
| Notification | 예, 시스템에 의해 | 자동, 코드 불필요 | 환영 푸시 알림 |
| Data | 아니요 | 애플리케이션 콜백을 통해 | 백그라운드 데이터 동기화 |
| 복합 | 예, notification 부분 | 열 때 data 부분 | 알림 + 주문 링크 |
Android에 FCM 통합은 애플리케이션 수준에서 build.gradle 파일을 통해 Firebase SDK를 연결하는 것으로 시작됩니다. 종속성과 google-services.json 파일을 추가한 후 애플리케이션은 자동으로 Registration Token을 받으며 FirebaseMessagingService 콜백을 통해 전달됩니다. 알림을 수신하려면 FirebaseMessagingService를 확장하는 서비스를 만들어 AndroidManifest.xml에 등록해야 합니다.
Firebase SDK를 연결한 후 기기 토큰은 추가 코드 없이 자동으로 생성됩니다. 토큰은 FirebaseMessaging.getInstance().token을 통해 사용할 수 있으며 Task<String>을 반환합니다. 토큰 업데이트를 추적하려면 서비스에서 onNewToken 메서드를 재정의합니다. 서버가 이 기기에 푸시 알림을 보낼 수 있도록 토큰을 공급자 서버로 보내야 합니다.
class MyFirebaseMessagingService :
FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendTokenToServer(token)
}
override fun onMessageReceived(
message: RemoteMessage
) {
val data = message.data
val title = "새 메시지"
val body = data["body"] ?: ""
showNotification(title, body)
}
}
FCM 메시지를 수신하는 서비스는 적절한 intent-filter와 함께 AndroidManifest.xml에 등록되어야 합니다. INTERNET 권한과 지정된 작업이 있는 service 태그를 추가합니다. 서비스 등록이 없으면 메시지가 백그라운드에서 애플리케이션으로 전송되지 않습니다. Android 13+에서 알림을 표시하려면 런타임 권한 POST_NOTIFICATIONS가 필요합니다.
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name=
"android.permission.POST_NOTIFICATIONS" />
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name=
"com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
iOS에 FCM 통합은 Apple Push Notification Service(APNs) 측과 Firebase Console 모두에서 구성이 필요합니다. FCM이 직접 연결을 관리하는 Android와 달리 iOS에서 FCM은 전송 계층으로 APNs를 사용합니다. 애플리케이션은 UIApplication.shared.registerForRemoteNotifications를 통해 푸시 알림을 등록하고 Firebase SDK는 수신된 기기 토큰을 가로채서 FCM Registration Token에 연결합니다.
iOS에서 FCM이 작동하려면 Firebase Console에 APNs 키 또는 인증서를 업로드해야 합니다. APNs 키는 인증서 없는 최신 인증 방식(Apple 권장)입니다. 키는 Apple Developer Portal의 Keys 섹션에서 생성되어 Firebase Console의 Cloud Messaging 설정에 업로드됩니다. APNs 구성 후 애플리케이션은 UNUserNotificationCenter를 통해 알림 권한을 요청하고 APNs를 통해 등록합니다.
import Firebase
import UserNotifications
class AppDelegate: NSObject, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions
launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .sound, .badge])
application.registerForRemoteNotifications()
return true
}
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken
deviceToken: Data
) {
Messaging.messaging()
.apnsToken = deviceToken
}
}
수신된 알림을 처리하기 위해 UNUserNotificationCenter 델리게이트를 구현합니다. willPresent 메서드는 애플리케이션이 활성화된 상태에서 알림이 수신될 때 호출되며 사용자 지정 인앱 알림을 표시하거나 시스템 배너를 무시할 수 있습니다. didReceive 메서드는 사용자가 알림을 탭할 때 호출되며 해당 화면으로 이동합니다. Data 메시지의 경우 MessagingDelegate가 사용되며 백그라운드에서 FCM 메시지를 수신할 때 페이로드를 받습니다.
서버 측 전송 FCM 메시지는 Firebase Cloud Messaging의 HTTP v1 API 또는 레거시 Firebase Cloud Messaging API를 통해 수행됩니다. HTTP v1 API는 권장 방법이며 Service Account를 통한 OAuth 2.0 인증을 사용하고 전송 분석 및 알림 A/B 테스트를 포함한 모든 최신 FCM 기능을 지원합니다. 요청은 POST 메서드로 엔드포인트 https://fcm.googleapis.com/v1/projects/{project_id}/messages:send에 전송됩니다.
요청 본문에는 메시지 정보가 포함된 JSON 객체가 포함됩니다: target(토큰, 토픽 또는 조건), notification(표시용) 및 data(사용자 지정 페이로드). 인증은 서버 환경 변수에 로드된 Service Account JSON 키를 통해 수행됩니다. 액세스 토큰은 google-auth-library를 사용하여 생성됩니다. Google은 인증 관리 및 재시도를 자동화하기 위해 Firebase Admin SDK 사용을 권장합니다.
const admin = require("firebase-admin")
const serviceAccount = require("./serviceAccountKey.json")
admin.initializeApp({ credential: admin.credential.cert(serviceAccount) })
const message = {
token: "device_registration_token",
notification: { title: "20% 할인", body: "오늘 모든 서비스 대상" },
data: { screen: "promo", promoId: "324" },
android: { priority: "high" },
apns: { payload: { aps: { sound: "default" } } }
}
admin.messaging().send(message)
.then(response => {
console.log("전송 성공:", response)
})
.catch(error => {
console.log("전송 오류:", error)
})
사용자 그룹에 알림을 보내기 위해 FCM은 토픽 구독을 지원합니다. 토픽은 클라이언트 애플리케이션이 FirebaseMessaging.getInstance().subscribeToTopic()을 통해 구독하는 명명된 채널입니다. 서버는 토픽에 메시지를 보낼 수 있으며 구독하는 모든 기기로 전송됩니다. 토픽은 뉴스레터, 프로모션 알림 및 이벤트 기반 푸시에 적합합니다. 보다 정확한 세분화를 위해 논리 연산자를 사용한 여러 토픽 기반 조건이 사용됩니다.
자주 묻는 질문
FCM은 Android에서 Google 자체 인프라를 통해 작동하며 iOS에서는 전송 프로토콜로 APNs를 사용합니다. FCM은 두 플랫폼 모두에 통합 API, 오프라인 메시지 자동 저장 및 전송 분석을 제공하며 이는 순수 APNs에서는 사용할 수 없습니다.
네. Firebase Console의 Cloud Messaging 섹션을 통해 선택한 기기, 토픽 또는 대상 세그먼트에 수동으로 알림을 보낼 수 있습니다. 이 기능은 테스트 및 일회성 전송에 적합하지만 프로덕션 애플리케이션의 서버 통합을 대체하지는 않습니다.
FirebaseMessagingService(Android)의 onNewToken 또는 MessagingDelegate(iOS)를 통해 토큰 업데이트를 구독하세요. 토큰이 변경되면 새 토큰을 서버로 보내고 이전 토큰을 제거하세요. 서버는 데이터베이스를 업데이트하고 이전 토큰으로 전송 시도를 중단해야 합니다.
FCM은 메시지를 최대 28일 동안 대기열에 저장하고 연결이 복원되면 전송합니다. Notification 메시지의 경우 각 축소 그룹의 마지막 메시지만 축소됩니다. Data 메시지는 별도로 저장되며 축소 없이 전송 순서대로 전달됩니다.
FCM은 완전히 무료이며 메시지 수에 제한이 없습니다. FCM 사용은 Spark 요금제나 Blaze 요금제 모두에서 청구되지 않습니다. 페이로드 크기에만 제한이 있습니다: notification 메시지는 최대 4KB, data 메시지는 최대 2KB입니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.