FCM은 Firebase Cloud Messaging의 약자입니다.
Firebase(구글의 모바일/웹 앱 개발 플랫폼) 위에서 돌아가는 클라우드 기반 메시지 푸시 서비스를 말합니다.
회사에서 FCM을 이용한 스마트폰 푸시 알림 서비스를 개발하는데
2년 전에는 단순 FCM에 연동해서 푸시 알림이 도착하는데에만 급급해서 스마트폰과 JMETER로 테스트를 거치면서 성공한 메세지 규격으로 개발 완료를 때려버렸는데요.
Android, ios 기준으로 들어가는 필수 fcm요청 메세지 규격 요소만 지키면 푸시앱이 발송됬기에..
FCM 메세지 요청 규격에 어떤 요소들까지 셋팅할 수 있는지 자세히 알 지 못했었습니다.
이번에 신규 프로젝트에 FCM 연동 기능이 들어가면서, 본의아니게 고도화를 하게 되었는데요
FCM 공식 홈페이지에서 문서를 읽으며 꽤나 중요한 부분들을 짚어보며 지나가면 좋을 것 같아서 포스팅하게 되었습니다..주절주절
📖 Chapter1. 메시지 우선순위 설정
Category : Firebase - docs - Cloud Messaging - 개념 밋 권장사항 - FCM 메시지 정보
ios 발송시에는, 푸시 알림을 전송하는 우선순위를 FCM 메세지 요청에 설정할 수 있습니다.
💡 iOS (APNs): iOS의 apns.apns-priority 필드에서 우선순위를 보통/높은 중에 설정할 수 있습니다.
"apns": {
"headers": {
"apns-priority": "5",
},

🫢 유의할 점
FCM을 이용하여 푸시 알림을 개발할 때 생명에 간접적인 영향을 줄 수 있는 경우로 판단될 시 이용하는 것을 금하거나, 책임은 개발자에게 있다는 내용입니다. 오.. 이건 생각해보지 못한 부분인데 확실히 토큰만료라던지 서버 문제로 앱푸시가 발송되지 않는 경우가 꽤 있어서, 긴급재난문자같은 경우에는 활용하는데 위험도가 있겠다는 생각이 드네요. 이외에도 사용자가 푸시알림을 확인하고 생명에 관련된 판단을 내려야하는 경우에 유의해서 사용해야겠습니다.


📌 Google API 사용 금지사항(A. API Prohibitions) - 4.a.7
Use the APIs for any activities where the use or failure of the APIs could lead to death, personal injury, or environmental damage (such as the operation of nuclear facilities, air traffic control, or life support systems).
🔍 이 조항이 말하는 바
API를 생명에 치명적인 영향을 미칠 수 있는 고위험 활동(예: 원자력 운영, 항공 관제, 생명유지 장치 등)에 사용해서는 안 된다는 내용입니다. 이는 사망, 부상, 환경 피해로 이어질 수 있는 용도를 명시적으로 금지하고 있습니다.
📖 Chapter2. 사용자 푸시 클릭 동작방식
Category : Firebase - docs - Cloud Messaging - 개념 밋 권장사항 - FCM 메시지 정보
발송된 푸시 알림을 클릭했을때 보통 앱으로 연결되거나, 특정페이지로 이동하는 것을 많이 경험해 보셨을텐데요.
이러한 사용자 푸시 동작방식은 Android/ios 별로 설정 필드가 다릅니다.
📎Android : android.notification.click_action
"android": {
"notification": {
"click_action": "ALERT"
}
},
📎 ios : apns.payload.aps.category
"apns": {
"payload": {
"aps": {
"category": "ALERT"
}
}
}
예전에 안드로이드 폰으로 테스트하면서 한참 개발했을때,
FCM으로 보내던 요청메세지로 ios에는 앱푸시 발송에 자꾸 실패해서 한참 헤맸던 기억이 나네요
FCM으로 푸시요청을 보내는 건 메세지 하나만 쏘면 되는 간단한 방식이지만,
안드로이드, ios 별로 메세지 필드가 다른것들이 중간중간 있기때문에 꼭 Firebase Docs를 읽어보면서 개발해야 한답니다.
Firebase Cloud Messaging
Firebase 클라우드 메시징(FCM)은 메시지를 안정적으로 전송할 수 있는 크로스 플랫폼 메시징 솔루션입니다.
firebase.google.com
📖 Chapter3. 푸시 수명설정
Category : Firebase - docs - Cloud Messaging - 개념 밋 권장사항 - FCM 메시지 정보
이건 저같은 귀차니즘만 눈치챌 수 있는 부분일텐데요
스마트폰 화면에 알림을 그 때 그 때 클릭해주지 않으면 잠금화면에 알림이 가득쌓이곤하죠
이렇게 안읽은 푸시알림을 어떤 어플의 경우에는 자동으로 몇 시간 후면 사라져있고
어떤 어플은 몇 일이 지나도 잠금화면에 남아있는 경우가 있습니다.
이 설정을 하는 부분이에요. 푸시 알림이 얼마나 화면에 살아있을것이냐.
다음은 이 기능을 사용할 수 있는 몇 가지 예입니다.
- 영상 채팅 수신 전화 - 영상채팅이 종료되면 알림이 사라져야 함
- 만료일이 있는 초대 이벤트 - 만료일이 지나면 알림이 사라져야 함
- 캘린더 일정 - 일정이 지나면 알림이 사라져야 함
메세지에 요청값으로 webpush-headers-TTL 을 작성해주면 되는 것 같습니다.(사용해보진 않았음)
TTL(time_to_live) 값이 0이면 즉시 전송할 수 없는 푸시알림의 경우 알림이 바로 삭제된다는 점에 유의하래요.
"webpush":{
"headers":{
"TTL":"4500"
}
}
이러한 설정을 message 규격에 개발자가 따로 요청하지 않는 경우를 최적의 상황 이라고 표현하는데요.
최적의 상황에서는 기기가 FCM에 연결된 경우 화면이 켜져 있고 아무런 제한사항이 없으면 메시지가 즉시 전송됩니다.
즉, 프로세스에서 FCM 요청시 바로 스마트폰에 알림이 옵니다. 저는 개발시 항상 추가 설정없이 필수값만 넘겼다보니 테스트할 때 항상 바로 푸시가 도착했었어요.
📌 메세지 축소 - 동일키 이전 메세지 발송전이라면 자동삭제
앱 서버가 FCM에 메시지를 게시한 후 메시지 ID를 수신했다고 해서 푸시알림이 이미 기기로 전송되었다는 의미는 아닙니다.
더 정확히 말하면 전송이 수락되었다는 의미입니다. 메시지 수락 후 수행되는 작업은 여러 요인에 따라 달라지는데요
위에서 최적의 상황에서는 따로 추가 설정한게 없으면 푸시 알림이 즉시 전송된다고 했죠?
반대로 기기가 연결되어 있지만 잠자기 상태인 경우(방해금지모드) FCM은 기기에서 잠자기 상태가 해제될 때까지 우선순위가 낮은 메시지를 저장합니다. 또한 이 시점에서 collapse_key 플래그가 역할을 수행합니다. 축소 키와 등록 토큰이 동일한 메시지가 이미 저장되어 전송 대기 중이라면 이전 메시지가 삭제되고 새 메시지로 대체됩니다.
즉, 이전 메시지가 새 메시지에 의해 축소됩니다. 하지만 축소 키가 설정되어 있지 않으면 나중에 전송할 수 있도록 새 메시지와 이전 메시지 모두 저장됩니다.
기기가 FCM에 연결되어 있지 않으면 연결이 설정될 때까지 축소 키 규칙을 반영하여 메시지가 저장됩니다. 연결이 설정되면 FCM이 대기 중인 모든 메시지를 기기로 전송합니다. 예를 들어 기기가 공장 재설정 상태로 초기화되는 등의 사유로 다시 연결되지 않으면 결국 메시지 제한 시간이 초과되어 FCM 스토리지에서 삭제됩니다. time_to_live 플래그가 설정되지 않은 한 기본 제한 시간은 4주입니다.
알림을 이용한 이벤트가 많은 어플리케이션의 경우 이러한 메세지 저장, 메세지 축소 등을 활용하여 TTL을 설정하고 활용하면 좋을 것 같네요. 예를들어 미션성공! 시에는 이전에 발송했던 미션재시작~ 알림을 대기시켜두었다가 삭제한다던지요.
물론. 특수한 경우가 아니면 필수사항은 아닐 것 같습니다.
글이 너무 길어질 수 있으니까 나눠서 공유해보겠습니다.
안드로이드/ios 플랫폼별 메세지 규격이 다른것을 찾아보다가 신기한게 많아서 공유해보았네요
'IT > Backend | All' 카테고리의 다른 글
| 443, 8080, 9443? 관행적으로 쓰는 포트번호💡 | 개발자가 알아야 할 주요 포트번호 정리표 (0) | 2025.06.30 |
|---|---|
| GCP와 FCM | GCP 서비스계정 권한 부여로 Firebase 접근 승인하기 (2) | 2025.06.24 |
| OOM 분석 | heap dump 파일분석 - VisualVM, Eclipse MAT (0) | 2025.04.01 |
| VisualVM | 리눅스서버에 올린 프로세스에 붙어 모니터링하기 (1) | 2025.03.20 |
| 로컬에서 리눅스 서버로 파일 옮기기 | SCP • SFTP (0) | 2025.03.19 |