먼저, 진단 순서부터
복잡한 로그를 보기 전에 전체가 안 오는지, 일부만 안 오는지부터 가릅니다. 이 갈림길 하나로 원인 범위가 절반으로 줄어듭니다.
안드로이드(FCM) vs iOS(APNs) — 원인이 다릅니다
두 OS는 푸시 전송 경로가 달라 원인도 갈립니다. 어느 쪽이 안 오는지에 따라 먼저 볼 곳이 정해집니다.
안드로이드 (FCM)
- 알림 권한(안드로이드 13+) 미요청
- 제조사 절전·배터리 최적화가 백그라운드 차단
- 토큰 갱신을 서버에 반영 안 함
- google-services.json / 서버 키 불일치
iOS (APNs)
- APNs 인증서(.p12) 만료 — 가장 흔함
- 개발(sandbox)/운영(production) 환경 반대
- Push 권한(entitlement) 누락
- 프로비저닝에 Push 미포함
iOS에서 가장 흔한 범인 — 인증서·키 만료
iOS만 안 온다면 APNs 인증 만료를 먼저 의심하세요. 특히 인증서(.p12)는 1년마다 만료되고, 만료되는 순간 그날부터 iOS 전체가 안 옵니다.
인증서·프로비저닝 만료가 겹쳐 앱 자체가 안 열리는 상황이라면 iOS 인증서 만료 가이드를 함께 보세요.
토큰 문제 — 보낼 대상이 비어 있지 않은지
서버는 멀쩡해도 저장된 토큰이 틀리면 아무도 못 받습니다. 토큰은 고정값이 아니라 바뀝니다.
- 앱 재설치·기기 변경 시 토큰이 바뀌는데 서버가 옛 토큰을 들고 있는 경우.
- 로그아웃 시 토큰을 지워놓고 다시 저장하지 않는 경우.
- FCM 응답의
NotRegistered·InvalidRegistration토큰을 정리하지 않아 실패가 쌓이는 경우.
실무에서 자주 만나는 원인 순서
현장에서 푸시 장애를 들여다보면, 원인은 대체로 아래 순서로 자주 나타납니다. 특정 원인부터 보면 시간을 아낄 수 있습니다.
서버·페이로드 점검
- 전송 응답을 안 봄: 서버가 FCM/APNs 응답 코드를 로깅하지 않으면 왜 실패했는지 알 수 없습니다. 먼저 응답부터 남기세요.
- 페이로드 형식:
notification만 보내면 백그라운드에서만 뜨고,data만 보내면 앱이 직접 알림을 만들어야 합니다. 의도한 동작과 맞는지 확인. - 인증 만료: 서버의 FCM 서비스 계정 키·APNs 키가 폐기·만료됐는지.
자주 묻는 질문
일부 기기만 알림이 안 와요.
보통 기기 쪽 문제입니다. 해당 앱 알림 권한이 꺼져 있거나, 제조사 절전·배터리 최적화가 백그라운드 푸시를 막거나, 그 기기의 토큰이 서버에 옛 값으로 남아 있는 경우가 많습니다.
iOS만 알림이 안 와요.
APNs 인증서(.p12) 만료를 가장 먼저 확인하세요. 1년마다 만료되고 만료되는 순간 iOS 전체가 안 옵니다. 개발/운영 환경을 반대로 보내고 있지는 않은지도 확인합니다. 갱신 부담을 없애려면 인증 키(.p8) 방식으로 전환하는 것을 권합니다.
앱 업데이트 후 갑자기 안 와요.
토큰 갱신 처리나 푸시 권한(entitlement)·프로비저닝이 업데이트 과정에서 빠졌을 가능성이 큽니다. 서버가 새 토큰을 받고 있는지, 빌드에 Push 권한이 포함됐는지 확인하세요.
보낸 건 성공이라는데 안 와요.
전송 성공은 '푸시 서버가 접수했다'는 뜻이지 '기기에 떴다'가 아닙니다. 기기 절전·권한, 또는 data-only 페이로드를 앱이 알림으로 안 그린 경우가 흔합니다. 응답 코드와 페이로드 형식을 함께 확인하세요.
무료 점검부터 시작하세요
어느 기기·어느 OS에서 안 오는지와 서버 전송 로그만 주시면, 권한·토큰·인증서·서버 중 어디서 막혔는지 먼저 진단해 드립니다.
문의: appmonster.kr@gmail.com
함께 보기: iOS 인증서 만료 · 방치된 앱 점검 체크리스트 · Firebase 보안 규칙