FCM 토큰이 갱신 되는 케이스

이지훈·2022년 12월 6일
4
post-custom-banner

FCM 토큰이 갱신되는 경우를 정리해놓기 위해 작성한다.

FCM Token이 갱신되는 경우 FirebaseMessagingService 클래스에서 onNewToken() 함수가 호출되는데 그 케이스들은 다음과 같다.

  1. 앱이 Instance ID 를 삭제할때

  2. 앱이 새 기기에서 복구될때

  3. 유저가 앱을 지우거나/다시 설치할때

  4. 유저가 앱 데이터를 초기화할때

이 밑 부터는 개인적인 의견이기 때문에 읽지 않아도 된다. 반박시 당신이 맞습니다

위에서 처럼 생각보다 많은 경우에서 FCM 토큰의 갱신이 이루어지기 때문에
클라이언트 개발자 입장에서는 FCM 토큰을 한명의 '유저'가 아닌 하나의 '디바이스'라고 생각하는 것이 편하다.

그말은 즉슨, 로그인에서 사용자 인증을 위한 jwt 토큰 처럼 로컬에서 저장 해둔 뒤 이미 로그인 한 경우 로그인을 스킵하고, 로그아웃 할 때 해당 토큰을 로컬에서 삭제하는 등의 처리보단 앱 진입시 또는, 로그인할때마다 FCM 토큰을 발급 받아 서버 측에 전달하여 저장하는 것이 편하다는 의미이다.

서버에만 토큰을 저장 한다면?

1) 사용자가 로그인을 하지 않을 경우에도 푸시 알림을 줘야 한다면, 앱에 진입할때마다 FCM 토큰을 발급 받아 서버에 전달
2) 로그인한 사용자에 대해서만 푸시 알림을 줘도 된다면 로그인 할때마다 FCM 토큰을 발급받아 전달

만약 로컬에도 토큰을 저장을 한다면?

1) 로컬에 기존에 발급 받아 저장해 두었던 FCM 토큰을 조회, 서버에 FCM 토큰이 저장되어있는지 조회를 하고(저장되어 있다면 가져오고, 저장되어 있는게 없다면 발급)

2) 조회한 기존의 FCM 토큰과 FCM 토큰을 발급하는 함수 실행시 받아오는 FCM 토큰의 값을 비교를 해서

3) 같을 경우 FCM 토큰을 서버에 전달 과정을 생략, 서로 다를 경우 서버에 새로 발급 받은 FCM 토큰을 전달하는 방법도 있으나

오히려 더 번거롭고 생각해야 할 것이 많다는게 내 생각이다.
무분별한 API 호출을 줄이기 위하기 위해, 로컬에 저장해뒀건만, 서버에 FCM 토큰이 있는지 조회하는 함수를 호출 해야 하기 때문이다.

또한 로컬에 저장해둔 토큰을 가져오는 작업도 수행해야 하며, validation 을 위해 FCM 토큰을 발급 받는 함수를 호출하여 이 값과 비교해야할 수도 있다.

만약에 위의 4가지 경우에 의해 FCM 토큰이 갱신되거나, 로컬에 저장해두었던 토큰이 날라갈 경우의 대한 케이스도 고려를 해줘야 한다. 머리 아프다

FCM 토큰을 서버에만 저장하여 관리할 경우, SSOT 원칙을 준수할 수 있어, 관리하기에 용기하고, 토큰 갱신을 위한 validation과 같은 작업(서버에 토큰이없다면 저장, 같은 값이 이미 있다면 무시, 다른 값(토큰 갱신)이 들어올 경우 갱신) 은 서버 내에서만 이루어지도록 하는게 편할 듯 하다...

추가)

참고 했던 글들이 다 deprecated 되어서, 새로운 문서를 찾던 중

https://firebase.google.com/docs/cloud-messaging/manage-tokens?hl=ko

해당 문서를 발견 했다. FCM 토큰 등록 관리에 대한 문서인데
내 견해와 비슷한 입장인거 같아 안심이 놓인다.
앞으로는 관련한 의문이 있을 경우, 위 문서만 참고해도 될 것 같다 ㅎ

참고)

https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceIdService.html#onTokenRefresh()

https://stackoverflow.com/questions/41330078/is-fcm-token-refreshed-on-app-update

https://firebase.google.com/docs/cloud-messaging/manage-tokens?hl=ko

profile
실력은 고통의 총합이다. Android Developer
post-custom-banner

0개의 댓글