FCM 등록 토큰 관리를 위한 권장사항

FCM API를 사용해 전송 요청을 프로그래매틱 방식으로 빌드하는 경우 시간이 지나면서 비활성 등록 토큰이 있는 비활성 기기에 메시지를 전송하여 리소스 낭비가 발생할 수 있습니다. 이러한 상황은 Firebase Console에 보고된 메시지 전송 데이터 또는 BigQuery로 내보낸 데이터에 영향을 줄 수 있으며 이로 인해 전달 속도가 급격하게 감소한 것으로 나타나지만 실제로는 그렇지 않습니다. 이 가이드에서는 효율적인 메시지 타겟팅과 유효한 전송 보고를 보장하기 위해 취할 수 있는 몇 가지 조치에 대해 설명합니다.

기본 권장사항

FCM API를 사용해 프로그래매틱 방식으로 전송 요청을 빌드하는 모든 앱에서 따라야 하는 몇 가지 기본 사항이 있습니다. 주요 권장사항은 다음과 같습니다.

  • 서버에 등록 토큰을 저장합니다. 서버의 중요한 역할은 각 클라이언트의 토큰을 추적하고 활성 토큰의 업데이트된 목록을 유지하는 것입니다. 코드 및 서버에 토큰 타임스탬프를 구현하고 이 타임스탬프를 정기적으로 업데이트하는 것이 좋습니다.
  • 저장된 토큰 중 비활성화된 토큰을 삭제합니다. 토큰 응답이 분명히 잘못된 경우 토큰을 삭제하는 것 외에도 토큰이 비활성 상태임을 나타내는 다른 징후를 모니터링해야 할 수 있습니다. 이 가이드에서는 이를 위한 몇 가지 옵션을 설명합니다.

등록 토큰 검색 및 저장

앱을 처음 시작할 때 FCM SDK가 클라이언트 앱 인스턴스용 등록 토큰을 생성합니다. 이 토큰은 API에서 타겟팅된 전송 요청에 포함하거나 주제 타겟팅을 위해 주제 구독에 추가해야 합니다.

클라이언트 설정 가이드에서 언급했듯이 앱을 처음 시작할 때 이 토큰을 검색하여 타임스탬프와 함께 앱 서버에 저장해야 합니다. 이 타임스탬프는 FCM SDK에서 제공하지 않으므로 코드와 서버에서 구현해야 합니다.

또한 토큰을 서버에 저장하고 다음과 같은 경우처럼 토큰이 변경될 때마다 타임스탬프를 업데이트하는 것이 중요합니다.

  • 새 기기에서 앱 복원
  • 사용자가 앱 제거/재설치
  • 사용자가 앱 데이터 소거

FCM 백엔드에서 잘못된 토큰 응답 감지

FCM에서 잘못된 토큰 응답을 감지하고 유효하지 않은 것으로 알려진 등록 토큰을 시스템에서 삭제하여 이에 대응해야 합니다. HTTP v1 API를 사용하면 다음과 같은 오류 메시지가 전송 요청이 비활성 토큰이나 잘못된 토큰을 타겟팅했음을 나타낼 수 있습니다.

  • UNREGISTERED(HTTP 404)
  • INVALID_ARGUMENT(HTTP 400)

자세한 내용은 ErrorCode를 참고하세요.

타겟팅한 토큰에 대해 이러한 응답 중 하나를 수신하는 경우 이 토큰은 다시 유효한 상태가 되지 않으므로 해당 레코드를 삭제하는 것이 안전합니다. 하지만 토큰이 실제로 유효하지 않은데 그렇게 표시되지 않는 경우가 있으므로 유의해야 합니다. 예를 들어 FCM 백엔드에서 기기가 영구적으로 오프라인 상태인지 확인할 수 없는 경우가 있습니다.

등록 토큰 최신 상태 보장

토큰이 최신 상태인지 비활성 상태인지를 판단하는 것이 항상 간단하지만은 않습니다. 모든 사례를 포괄하도록 토큰을 비활성 상태로 간주할 기준을 정해야 합니다. 권장사항은 2개월입니다. 2개월이 지난 토큰은 비활성 기기일 가능성이 높으며 그 외의 활성 기기는 토큰을 갱신했을 것입니다.

정기적으로 토큰 업데이트

서버에서 모든 등록 토큰을 주기적으로 검색 및 업데이트하는 것이 좋습니다. 이를 위해 다음을 수행해야 합니다.

  • 클라이언트 앱에 앱 로직을 추가하여 적절한 API 호출(예: Apple 플랫폼의 경우 token(completion):, Android의 경우 getToken())을 사용해 현재 토큰을 검색한 다음 앱 서버로 전송하여 저장합니다(타임스탬프 포함). 모든 클라이언트 및 토큰을 포괄하도록 월별 작업으로 구성할 수 있습니다.
  • 서버 로직을 추가하여 토큰 변경 여부와 관계없이 주기적으로 토큰의 타임스탬프를 업데이트합니다.

어떤 타이밍 패턴을 따르든지 토큰은 주기적으로 업데이트해야 합니다. 업데이트 빈도를 한 달에 한 번으로 설정하면 배터리에 대한 영향과 비활성 등록 토큰의 감지 기능 간에 적절한 균형을 유지할 가능성이 높습니다. 이렇게 업데이트를 수행하면 비활성화된 기기가 다시 활성화될 때 등록이 업데이트되도록 할 수도 있습니다. 일주일 이내 간격으로 업데이트를 수행해도 별다른 이점은 없습니다.

주제에서 비활성 토큰 구독 취소

비활성 등록 토큰을 삭제하기 위해 주제 구독을 관리하는 것도 고려해야 합니다. 여기에는 다음 두 단계가 포함됩니다.

  1. 앱에서는 한 달에 한 번 또는 등록 토큰이 변경될 때마다 주제를 다시 구독해야 합니다. 이에 따라 앱이 다시 활성화되면 구독이 자동으로 다시 표시되는 자가 복구 솔루션 형태를 띄게 됩니다.
  2. 앱 인스턴스가 2개월(또는 자체 비활성 기간) 동안 유휴 상태면 Firebase Admin SDK를 사용해 주제를 구독 취소하고 FCM 백엔드에서 토큰 및 주제 매핑을 삭제해야 합니다.

이러한 두 단계의 장점은 팬아웃할 비활성 토큰이 적기 때문에 팬아웃이 더 빨리 일어나고, 비활성 앱 인스턴스는 다시 활성 상태가 되었을 때 자동으로 재구독된다는 것입니다.

전송 성공 측정

일반적으로 활발히 사용되는 앱 인스턴스에서 관찰되거나 캡처된 작업을 기준으로 메시지를 타겟팅하는 것이 좋습니다. 구독자가 많은 주제에 정기적으로 메시지를 보내는 경우 특히 그렇습니다. 이러한 구독자 중 일부가 실제로 비활성 상태인 경우 시간이 지날수록 전송 통계에 큰 영향을 줄 수 있습니다.

메시지를 토큰으로 타겟팅하기 전에 다음을 고려하세요.

  • Google 애널리틱스, BigQuery에서 캡처된 데이터 또는 기타 추적 신호에 토큰이 활성 상태임이 나타나나요?
  • 일정 기간 동안 이전 전송 시도가 지속적으로 실패했나요?
  • 지난 2개월 동안 서버에서 등록 토큰이 업데이트되었나요?
  • Android 기기에서 FCM Data APIdroppedDeviceInactive로 인한 높은 메시지 전송 실패율을 보고하나요?

전송에 대한 자세한 내용은 메시지 전송 이해를 참조하세요.