FCM(Firebase Cloud Messaging)
에서 발급되는 fcmToken
이 계속 무효화되거나 사라지는 현상은 다양한 이유로 발생할 수 있습니다. 아래에 주요 원인과 해결 방법을 구체적으로 정리해 드릴게요.
🔄 1. 앱이 삭제되거나 재설치된 경우
- 원인
- 사용자가 앱을 삭제하거나 재설치하면 기존
fcmToken
은 무효화됩니다. - 이는 FCM의 보안 정책에 따라 토큰 재발급이 강제되기 때문입니다.
- 사용자가 앱을 삭제하거나 재설치하면 기존
- 해결 방법
- 앱이 실행될 때마다
getToken()
으로 새 토큰을 받아와 백엔드에 업데이트하는 로직을 구현해야 합니다.
- 앱이 실행될 때마다
import { getToken, onMessage } from "firebase/messaging";
async function fetchAndUpdateToken(messaging) {
try {
const token = await getToken(messaging, { vapidKey: 'YOUR_PUBLIC_VAPID_KEY' });
if (token) {
// 서버에 토큰 전송
await fetch('/api/store-fcm-token', {
method: 'POST',
body: JSON.stringify({ token }),
headers: { 'Content-Type': 'application/json' },
});
}
} catch (err) {
console.error('FCM 토큰 가져오기 실패', err);
}
}
🔐 2. VAPID 키 오류 혹은 누락
- 원인
- 브라우저 환경에서는 VAPID 키가 없으면 토큰 발급이 실패하거나 짧은 시간 내 만료될 수 있습니다.
firebase.initializeApp()
이후getToken()
호출 시vapidKey
파라미터가 필수입니다.
- 해결 방법
- Firebase 콘솔 > 프로젝트 설정 > Cloud Messaging > Web Push 인증 키 > 공개 키를 확인하세요.
- 이 키를
getToken()
에 반드시 명시해야 합니다.
🔄 3. 토큰 주기적 갱신 (Token Rotation)
- 원인
- FCM은 보안을 위해 토큰을 주기적으로 재발급합니다. 이 주기는 수일~수주 단위로 자동 갱신될 수 있습니다.
- 해결 방법
onTokenRefresh()
또는 Firebase v9 이후에는 이벤트 핸들링 방식으로 갱신 감지 로직을 구현해야 합니다.onBackgroundMessage()
와onMessage()
는 알림 수신만 담당하며, 토큰 갱신에는 관여하지 않습니다.
import { onTokenRefresh } from "firebase/messaging";
onTokenRefresh(messaging, async () => {
const newToken = await getToken(messaging, { vapidKey: 'YOUR_PUBLIC_VAPID_KEY' });
// 백엔드에 다시 저장
});
⚠️ 4. 푸시 권한이 해제되었거나 차단된 경우
- 원인
- 브라우저 또는 앱 수준에서 알림 권한을 차단한 경우, 토큰이 비정상적으로 작동하거나 발급 자체가 안될 수 있습니다.
- 해결 방법
- 사용자에게 푸시 권한 요청을 다시 해야 하며, 다음과 같은 코드로 권한 확인이 가능합니다.
Notification.requestPermission().then((permission) => {
if (permission === 'granted') {
console.log('푸시 권한 허용됨');
} else {
console.warn('푸시 권한 차단됨');
}
});
💾 5. 로컬 저장소 캐시 삭제 또는 프라이빗 모드 사용
- 원인
- 사용자가 브라우저 캐시/쿠키/로컬 저장소를 지우거나 프라이빗 모드를 사용하는 경우 토큰이 삭제되거나 저장되지 않을 수 있습니다.
- 해결 방법
- 매번 앱 실행 시 토큰을 다시 요청하고 백엔드에 비교 후 업데이트하세요.
- 일정 주기로 클라이언트 측에서 유효성을 검사하거나 백엔드에서 유효하지 않은 토큰을 필터링하는 로직도 필요합니다.
🧪 디버깅 팁: fcmToken이 안 살아나는 경우 확인할 것들
getToken()
호출 시 오류 로그 (console.error
)를 반드시 확인- Firebase 콘솔의 푸시 전송 결과 로그에서
"Invalid registration token"
메시지 확인 - 브라우저에서 푸시 권한 상태를 수동 점검
- iOS의 경우, 시뮬레이터에서는 FCM 푸시가 정상 동작하지 않음
🔗 참고 링크
✅ 결론
fcmToken
이 자주 무효화되는 가장 흔한 원인은 앱 삭제/재설치, 권한 차단, 토큰 갱신 미처리입니다. FCM을 안정적으로 운영하려면 아래를 꼭 챙기세요:
- 앱 실행 시마다
getToken()
으로 최신 토큰을 받아 백엔드에 저장 onTokenRefresh
혹은 Firebase v9 방식의 갱신 감지 로직 구현- 푸시 권한 여부 사전 확인 및 안내 UX 제공
- 백엔드에서 무효 토큰은 주기적으로 삭제 처리