본문 바로가기
Web 프로그래밍/Javascript

FCM Token이 계속 무효화되는 이유와 해결 방법

by 데브업 2025. 5. 22.

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()에 반드시 명시해야 합니다.

🔗 VAPID Key 설명 공식 문서


🔄 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('푸시 권한 차단됨');
  }
});

🔗 FCM 브라우저 권한 문제 해결 가이드


💾 5. 로컬 저장소 캐시 삭제 또는 프라이빗 모드 사용

  • 원인
    • 사용자가 브라우저 캐시/쿠키/로컬 저장소를 지우거나 프라이빗 모드를 사용하는 경우 토큰이 삭제되거나 저장되지 않을 수 있습니다.
  • 해결 방법
    • 매번 앱 실행 시 토큰을 다시 요청하고 백엔드에 비교 후 업데이트하세요.
    • 일정 주기로 클라이언트 측에서 유효성을 검사하거나 백엔드에서 유효하지 않은 토큰을 필터링하는 로직도 필요합니다.

🧪 디버깅 팁: fcmToken이 안 살아나는 경우 확인할 것들

  1. getToken() 호출 시 오류 로그 (console.error)를 반드시 확인
  2. Firebase 콘솔의 푸시 전송 결과 로그에서 "Invalid registration token" 메시지 확인
  3. 브라우저에서 푸시 권한 상태를 수동 점검
  4. iOS의 경우, 시뮬레이터에서는 FCM 푸시가 정상 동작하지 않음

🔗 참고 링크


✅ 결론

fcmToken이 자주 무효화되는 가장 흔한 원인은 앱 삭제/재설치, 권한 차단, 토큰 갱신 미처리입니다. FCM을 안정적으로 운영하려면 아래를 꼭 챙기세요:

  • 앱 실행 시마다 getToken()으로 최신 토큰을 받아 백엔드에 저장
  • onTokenRefresh 혹은 Firebase v9 방식의 갱신 감지 로직 구현
  • 푸시 권한 여부 사전 확인 및 안내 UX 제공
  • 백엔드에서 무효 토큰은 주기적으로 삭제 처리