Firebase 클라우드 메시징 구현 노트

etainclub(65)
Published in
#kr
Words
537
Reading
3 min
Listen
Play
7y

이타인클럽 앱을 개발중에 있습니다. 앱 구현 방법을 그냥 끄적여 봅니다. 왠지 구현 노트를 스팀잇에 정리해도 좋겠다는 생각이 듭니다.

일단 Firebase의 Cloud Messaging을 이용해서 앱이 설치된 기기에 푸쉬 알림을 보내는 것까지는 테스트 되었습니다.

그런데, 실제 구현해야 할 것은 각 앱 사용자가 도움 요청 메시지를 다수의 앱 사용자들에게 보내는 것입니다. 그것도 Firebase에서 수동으로 보내는 것이 아니라, 앱 상에서 알아서 보내야 합니다. 채팅앱과 유사합니다. 한 사용자가 다수의 유저가 있는 채팅창에 메시지를 보내면, 해당 사용자들에게 메시지가 전달되는 것과 같습니다.

정보 검색

처음엔 어디서 부터 검색해야 막막했는데, 조금씩 인터넷 검색을 하다 보니 내용들이 검색됩니다. 원하는게 딱 이 그림과 같은 기능입니다.

image01.gif

Brute-Force 방법 (막무가내 방법)

찾다보니 아래 글이 검색되었습니다.
https://blog.usejournal.com/send-device-to-device-push-notifications-without-server-side-code-238611c143

글을 보면, 제가 원하는 기능을 수행할 수 있는 내용이 자세히 정리되어 있습니다.
그런데 말입니다!!! 위 방법은 심각한 보안 문제가 있습니다. 각 사용자가 Firebase의 서버키를 가지고, 직접 다른 사용자 기기로 메시지를 보내도록 구현되어 있습니다. 저도 글의 누군가의 댓글을 보고 보안 문제를 알게됐습니다.

image.png

서버키가 앱 코드에 포함되면 앱 리버스 엔지니어링을 통해 키가 노출되고, 아무나 메시지를 보낼 수 있게 되는 것입니다. 이 방식은 포기해야 합니다.

위 댓글 내용 중에 보안 취약점을 해결하려면 Firebase의 Cloud Function 기능을 사용하라는 부분이 나옵니다. 이를 단서도 또다시 검색합니다.

Back-end 서버에서 Firebase 메시지 관리

한 기기에서 다수의 기기로 메시지를 보내는
2016년 글이긴 한데, 구현 방법이 설명되어 있습니다.
https://firebase.googleblog.com/2016/08/sending-notifications-between-android.html

구현 흐름은 다음과 같습니다.

  1. 사용자 앱에서 메시지 전송 요청
    2 Back-end 서버에 메시지 전송 요청
  2. Back-end 서버에서 서버키를 이용해서 Firebase Cloud Messing API로 메시지 전송
    (메시지를 수신할 기기의 Token 정보가 필요합니다.)

위 글이 이와 같은 방법을 설명하고 있습니다. 구현 흐름은 좋습니다만, Back-end 서버를 구현하고 이를 서버에 deploy해서 서비스를 해줘야 하는 문제가 있습니다. 글 서두에 이와 같은 내용이 기술되어 있고, 역시나 Cloud Function을 사용하는 글이 링크되어 있습니다.

그 구현 흐름은 이런 그림이 됩니다.
image.png
https://firebase.google.com/docs/functions/use-cases#notify_users_when_something_interesting_happens

Firebase공식 문서가 있는 것은 땡큐인데, 역시나 공식 문서의 설명은 왠지 이해가 잘 안됩니다. 그래서 좀 더 검색을 해봅니다.

Cloud Function이용 방법

Firebase의 Function 기능은 Back-end 서버와 유사하게 사용자의 요청을 처리할 수 있게끔 코드를 구현할 수 있는 기능입니다.

Firebase의 Cloud Function을 사용하는 방법을 찾다보니 동영상 강좌가 검색되었습니다. 일단 10일은 무료 사용할 수 있다고해서 얼른 신청했습니다.
https://app.pluralsight.com/library/courses/android-firebase-cloud-messaging-storage-crash-reporting/table-of-contents

이 동영상 강좌는 비추입니다.

기본적으로 Back-end 서버의 기능을 수행하는 코드를 로컬 PC에서 구현하여 Firebase의 Function에 배포하는 방식입니다. 동영상 내용 중 Cloud Function쓰는 내용은 많지 않지만, 그래도 이해하는데 도움이 됩니다.

좀 더 검색해 봅니다.

이 동영상 강좌보다 훨씬 자세히 Cloud Function을 사용하는 예제를 찾았습니다.
Build a Serverless full stack app using firebase cloud functions.

제목부터가 이목을 확 잡아 끕니다. Serverless full stack app.

그렇습니다. Back-end서버에서 수행하는 대부분의 일들을 Firebase의 DB, Cloud Messaging, Cloud Function 등의 기능을 이용해서 할 수 있다고 합니다. 사실 Firebase가 Back-end서버 아니냐 할 수 있습니다. 위 글에서는 기존의 Back-end 서버와 Cloud 서버의 차이점을 딱 하나로 요약합니다.

Cloud 서버의 경우, 서버 요청이 발생하면 서비스 되고, 사용한 만큼 비용을 지불한다

한 마디로, 서버 운영에 효과적입니다.

비록 위 예제는 메시지 보내는 예제는 아니지만, Firebase DB, Cloud Function 등을 사용하는 훌륭하고 자세한 예제입니다. Cloud Messaging 부분을 잘 접목하면 제가 원하는 다수의 사용자에게 메시지를 보내는 것이 가능합니다.

일단 이 방식으로 구현을 진행하려고 합니다. 아낌없는 조언 부탁드립니다~

React Native with Android:
https://agostini.tech/2018/09/16/using-firebase-cloud-functions/

React Native with iOS:
https://medium.com/yale-sandbox/react-native-push-notifications-with-firebase-cloud-functions-74b832d45386


끝으로, 애초에 우버나 카카오택시앱과 같은 앱 구현 방법에 대해서 검색을 했었는데, 우버 앱의 동작 원리 및 구현 내용과 앱 소스가 발견되어 같이 첨부합니다.
How to Make an App Like Uber: Complete Guide
https://github.com/caioariede/uber-react

오늘의 실습: 풀고자 하는 문제의 검색어에 대해서 고민해 보세요. 검색어에 따라 검색결과가 엄청 차이 납니다.

이타인클럽 - 우리 동네를 바꾸는 도움 선순환 운동
https://cafe.naver.com/etainclub
51% Service to Others

Firebase 클라우드 메시징 구현 노트 | Ecency