Firebase Cloud Messaging: 개념, 작동 원리 및 푸시 알림

저자: IT Sectr 게시일: 2026-04-29 읽는 시간: 9 분

Firebase Cloud Messaging(FCM)은 모바일 및 웹 애플리케이션을 위해 설계된 Google의 크로스 플랫폼 푸시 알림 및 메시지 전송 서비스입니다. FCM은 영구적인 네트워크 연결을 유지할 필요 없이 서버와 클라이언트 기기 간의 안정적인 데이터 전송을 보장합니다. Firebase Documentation, 2026에 따르면 FCM 인프라를 통해 전 세계에서 매일 3,000억 개 이상의 메시지가 처리됩니다. 이 서비스는 자동으로 표시되는 알림과 백그라운드에서 데이터 전송을 위한 data 메시지를 모두 지원합니다.

핵심 포인트

  • FCM — 통합 API와 Firebase Console을 통해 Android, iOS, Web을 지원하는 Google의 무료 푸시 알림 서비스입니다.
  • 메시지 유형 — notification 메시지는 시스템에 의해 자동으로 표시되고, data 메시지는 임의의 JSON을 전송하여 애플리케이션에서 처리할 수 있습니다.
  • 기기 토큰 — 각 애플리케이션은 고유한 Registration Token을 받으며, 서버는 이를 사용하여 대상 푸시 알림을 전송합니다.
  • 전송 우선순위 — normal 및 high 우선순위는 절전 모드 중 시스템 동작을 결정합니다. high 메시지는 Doze 모드에서 기기를 깨웁니다.
  • 토픽 및 그룹 — FCM은 대량 전송을 위한 토픽 구독과 한 사용자의 여러 기기로 전송하기 위한 Device Groups을 지원합니다.

Firebase Cloud Messaging이란

Firebase Cloud Messaging은 애플리케이션 서버와 클라이언트 기기 간에 푸시 알림 및 data 메시지 전송을 보장하는 Google의 클라우드 서비스입니다. 이 서비스는 기존 Google Cloud Messaging(GCM)을 대체했으며 Firebase 생태계에서 푸시 전송의 표준 솔루션이 되었습니다. FCM은 Android, iOS, Web, Unity를 지원하며 대상 플랫폼에 관계없이 통합된 전송 인터페이스를 제공합니다.

FCM의 주요 기능

이 서비스는 각각 특정 작업을 해결하는 여러 메시지 전송 메커니즘을 제공합니다. Notification 메시지는 수신 시 시스템에 의해 자동으로 표시되므로 개발자가 알림을 표시하는 코드를 작성할 필요가 없습니다. Data 메시지는 키-값 쌍으로 임의의 페이로드를 전송하며 애플리케이션 내에서 처리됩니다. 복합 메시지는 최대 유연성을 위해 표시 부분과 숨겨진 부분을 모두 포함합니다.

자체 솔루션 대비 장점

자체 푸시 서버를 구현하려면 각 기기와 지속적인 TCP 연결을 유지해야 하며, 이는 비효율적이고 안전하지 않습니다. FCM은 Google의 통합 인프라를 사용하여 동시에 수십억 대의 기기와 연결을 유지합니다. 이 서비스는 전송 재시도, 메시지 대기열 및 부하 분산을 자동으로 관리하여 개발자가 이러한 작업을 직접 해결할 필요가 없도록 합니다.

Firebase Cloud Messaging 작동 방식

FCM 아키텍처는 공급자 서버(백엔드), Firebase Cloud Messaging 서버 및 기기의 클라이언트 애플리케이션의 세 가지 주요 구성 요소로 구성됩니다. 서버가 메시지를 보내면 먼저 FCM 인프라에 도달하고, FCM이 이를 대상 기기로 라우팅합니다. 기기가 오프라인 상태인 경우 FCM은 메시지를 대기열에 저장하고 연결이 복원되면 전송합니다.

기기 등록 및 토큰 획득

첫 실행 시 애플리케이션이 Firebase SDK를 호출하여 FCM 서비스에 기기를 등록하고 고유한 Registration Token을 받습니다. 이 토큰은 약 150자 길이의 문자열로 특정 기기의 특정 애플리케이션 인스턴스를 식별합니다. 토큰은 애플리케이션 재설치, 데이터 삭제 또는 백업 복원 시 변경될 수 있으므로 개발자는 onNewToken 델리게이트를 통해 토큰 업데이트를 처리해야 합니다.

메시지 수명 주기

서버가 FCM API를 통해 요청을 보내면 메시지는 여러 단계를 거칩니다. 수신 및 검증 — FCM이 요청의 유효성과 대상 기기의 존재를 확인합니다. 대기열 — 기기를 사용할 수 없는 경우 메시지가 저장 대기열에 들어갑니다. 라우팅 — FCM이 최적의 전송 채널(WiFi 또는 모바일 데이터)을 결정합니다. 전송 — 시스템이 대상 애플리케이션으로 메시지를 전송합니다. 성공적인 전송 후 FCM은 서버에 메시지 ID를 반환합니다.

FCM의 메시지 유형

Firebase Cloud Messaging은 각각 클라이언트 측에서 고유한 처리 특성을 가진 세 가지 메시지 유형을 지원합니다. Notification 메시지는 Android에서 Google Play Services, iOS에서 APNs에 의해 처리되며 자동으로 푸시 배너로 표시됩니다. Data 메시지는 애플리케이션에 직접 전송되며 Android의 onMessageReceived 콜백과 iOS의 application(_:didReceiveRemoteNotification:)을 통해 처리됩니다.

Notification 메시지

Notification 메시지에는 title, body, 이미지 URL 및 알림 사운드와 같은 미리 정의된 필드가 포함됩니다. 시스템이 자동으로 알림을 생성하여 시스템 트레이에 표시합니다. 애플리케이션이 백그라운드에 있거나 종료된 경우에도 마찬가지입니다. 사용자는 제목과 텍스트가 있는 표준 배너를 보고 탭하면 페이로드로 전송된 데이터와 함께 애플리케이션이 열립니다. 애플리케이션이 활성 상태인 경우 notification 메시지를 가로채서 코드에서 처리할 수 있습니다.

Data 메시지

Data 메시지는 미리 정의된 필드 없이 키-값 쌍의 사용자 지정 집합입니다. 페이로드는 시스템에 의해 자동으로 처리되지 않으며 애플리케이션이 원시 데이터를 받아 임의로 해석할 수 있습니다. Data 메시지는 백그라운드 데이터 동기화, 로컬 캐시 업데이트, 동기화 트리거 또는 알림을 표시하지 않고 명령을 보내는 데 사용됩니다. Android에서는 애플리케이션이 종료되거나 백그라운드에 있어도 data 메시지가 항상 전송됩니다.

복합 메시지

FCM은 notification 부분(표시용)과 data 부분(처리용)을 모두 포함하는 메시지 전송을 허용합니다. 복합 페이로드에는 미리 정의된 notification 필드와 임의의 data 키가 모두 포함됩니다. 시스템은 notification 부분에서 알림을 표시하고 data 부분은 열 때 애플리케이션의 인텐트 엑스트라로 전달됩니다. 이는 사용자에게 알림을 표시하는 동시에 특정 화면으로 이동하기 위한 컨텍스트를 전달해야 하는 시나리오에 유용합니다.

유형자동 표시백그라운드 처리예시
Notification예, 시스템에 의해자동, 코드 불필요환영 푸시 알림
Data아니요애플리케이션 콜백을 통해백그라운드 데이터 동기화
복합예, notification 부분열 때 data 부분알림 + 주문 링크

Android에서 FCM 설정

Android에 FCM 통합은 애플리케이션 수준에서 build.gradle 파일을 통해 Firebase SDK를 연결하는 것으로 시작됩니다. 종속성과 google-services.json 파일을 추가한 후 애플리케이션은 자동으로 Registration Token을 받으며 FirebaseMessagingService 콜백을 통해 전달됩니다. 알림을 수신하려면 FirebaseMessagingService를 확장하는 서비스를 만들어 AndroidManifest.xml에 등록해야 합니다.

초기화 및 토큰 획득

Firebase SDK를 연결한 후 기기 토큰은 추가 코드 없이 자동으로 생성됩니다. 토큰은 FirebaseMessaging.getInstance().token을 통해 사용할 수 있으며 Task<String>을 반환합니다. 토큰 업데이트를 추적하려면 서비스에서 onNewToken 메서드를 재정의합니다. 서버가 이 기기에 푸시 알림을 보낼 수 있도록 토큰을 공급자 서버로 보내야 합니다.

kotlin
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가 필요합니다.

xml
<!-- 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 설정

iOS에 FCM 통합은 Apple Push Notification Service(APNs) 측과 Firebase Console 모두에서 구성이 필요합니다. FCM이 직접 연결을 관리하는 Android와 달리 iOS에서 FCM은 전송 계층으로 APNs를 사용합니다. 애플리케이션은 UIApplication.shared.registerForRemoteNotifications를 통해 푸시 알림을 등록하고 Firebase SDK는 수신된 기기 토큰을 가로채서 FCM Registration Token에 연결합니다.

APNs 설정 및 알림 등록

iOS에서 FCM이 작동하려면 Firebase Console에 APNs 키 또는 인증서를 업로드해야 합니다. APNs 키는 인증서 없는 최신 인증 방식(Apple 권장)입니다. 키는 Apple Developer Portal의 Keys 섹션에서 생성되어 Firebase Console의 Cloud Messaging 설정에 업로드됩니다. APNs 구성 후 애플리케이션은 UNUserNotificationCenter를 통해 알림 권한을 요청하고 APNs를 통해 등록합니다.

swift
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에 전송됩니다.

HTTP v1 요청 형식

요청 본문에는 메시지 정보가 포함된 JSON 객체가 포함됩니다: target(토큰, 토픽 또는 조건), notification(표시용) 및 data(사용자 지정 페이로드). 인증은 서버 환경 변수에 로드된 Service Account JSON 키를 통해 수행됩니다. 액세스 토큰은 google-auth-library를 사용하여 생성됩니다. Google은 인증 관리 및 재시도를 자동화하기 위해 Firebase Admin SDK 사용을 권장합니다.

js
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과 APNs의 차이점은 무엇인가요?

FCM은 Android에서 Google 자체 인프라를 통해 작동하며 iOS에서는 전송 프로토콜로 APNs를 사용합니다. FCM은 두 플랫폼 모두에 통합 API, 오프라인 메시지 자동 저장 및 전송 분석을 제공하며 이는 순수 APNs에서는 사용할 수 없습니다.

서버 없이 FCM 메시지를 보낼 수 있나요?

네. Firebase Console의 Cloud Messaging 섹션을 통해 선택한 기기, 토픽 또는 대상 세그먼트에 수동으로 알림을 보낼 수 있습니다. 이 기능은 테스트 및 일회성 전송에 적합하지만 프로덕션 애플리케이션의 서버 통합을 대체하지는 않습니다.

기기 토큰이 변경되면 어떻게 해야 하나요?

FirebaseMessagingService(Android)의 onNewToken 또는 MessagingDelegate(iOS)를 통해 토큰 업데이트를 구독하세요. 토큰이 변경되면 새 토큰을 서버로 보내고 이전 토큰을 제거하세요. 서버는 데이터베이스를 업데이트하고 이전 토큰으로 전송 시도를 중단해야 합니다.

FCM은 오프라인 기기를 어떻게 처리하나요?

FCM은 메시지를 최대 28일 동안 대기열에 저장하고 연결이 복원되면 전송합니다. Notification 메시지의 경우 각 축소 그룹의 마지막 메시지만 축소됩니다. Data 메시지는 별도로 저장되며 축소 없이 전송 순서대로 전달됩니다.

Firebase Cloud Messaging 사용 비용은 얼마인가요?

FCM은 완전히 무료이며 메시지 수에 제한이 없습니다. FCM 사용은 Spark 요금제나 Blaze 요금제 모두에서 청구되지 않습니다. 페이로드 크기에만 제한이 있습니다: notification 메시지는 최대 4KB, data 메시지는 최대 2KB입니다.

요약

  • Firebase Cloud Messaging은 통합 API를 통해 Android, iOS, Web, Unity를 지원하는 Google의 크로스 플랫폼 푸시 알림 서비스입니다.
  • FCM 아키텍처는 공급자 서버, Firebase 인프라 및 클라이언트 애플리케이션으로 구성되어 Google의 글로벌 네트워크를 통해 안정적인 메시지 전송을 보장합니다.
  • 세 가지 메시지 유형 — notification(자동 표시), data(UI 없는 임의 페이로드), 복합(하나의 메시지에 두 유형 모두).
  • Android의 FCM은 자체 연결을 가진 FirebaseMessagingService를 통해 작동하며, iOS에서는 MessagingDelegate를 통한 토큰 가로채기와 함께 APNs를 전송으로 사용합니다.
  • HTTP v1 API는 Service Account를 통한 OAuth 2.0 인증 및 전송 분석 지원과 함께 서버 측 전송에 권장됩니다.
  • 토픽은 구독자 그룹에 메시지를 보낼 수 있게 하고 조건은 정확한 세분화를 위해 여러 토픽을 결합할 수 있게 합니다.
  • FCM은 무료이며 메시지 제한이 없고 오프라인 메시지를 최대 28일 동안 저장하며 최대 페이로드 크기는 4KB입니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기