[iOS / FireBase] Push Notification 구현하기 (2편 - FCM을 이용한 푸시알림 구현)
Remote Notification
Remote notifications는 Push notifications라고도 하며, 앱이 실행중이지 않을 때에도 작은 양의 데이터를 특정 디바이스에 보내는 기능을 말한다.
Remote Notification이 필요한 이유
애플에서 제공하는 Notifcation은 Local Notification과 Remote Notification으로 나뉘는데, Local Notification의 경우에는 정해진 시간, 정해진 위치, 정해진 시간간격, 고정된 알림만을 제공한다는 한계가 있다. 불특정한 시간(mobile team이 원하는 시간), 불특정 인원(특정 대상에게만 알림 보내기), 불특정 장소에 있는 유저에게 알림을 보내기 위해서 Remote Notification이 필요하다.
Remote Notification이 가지는 가장 큰 특성은 알림을 보내는 시기와 메시지에 자유도가 높다는 것이다. 서비스 팀은 원하는 시점에 원하는 메시지를 전송할 수 있기 때문에 로컬 알림으로만은 부족한 User Experience를 보충할 수 있다.
Remote Notification이 전달되는 플로우
Remote Notification은 아래 4가지의 핵심 요소와 관련되어 있다.
- Provider server : Third-Party 서버를 말한다. 앱의 Backend 서버.
- APNs(Apple Push Notification Service) : Remote Notification의 보안 및 관리
- 유저의 기기
- 유저의 디바이스에서 실행중인 앱
Remote Notifcation은 Provider Server에서 시작하여, 어떤 알림을 어떤 유저에게 언제 보낼지에 대해 결정한다. 알림을 보낼 시기가 되면, 유저의 디바이스에 대한 unique identifier와 알림 데이터를 포함한 request를 생성한다. 이렇게 만들어진 request를 APNs에 보내면, APNs는 이를 받아서 알림들을 관리하고 유저들에게 전달한다. 유저의 기기에 알림이 도착할 때까지, 유저 기기의 운영체제는 특정 user interaction을 관리하고 앱에 알림을 전달한다.
APNs의 역할
Remote Notification을 전달하기 위해 거치는 Apple Push Notification Service(APNs)가 하는 역할은 다음과 같다.
- QOS 기능 : 알림 전달을 시도했을 때 기기아 오프라인이면, 알림을 저장해 놓은 다음 온라인 상태에서 다시 전달한다.
- 알림 관리 : 기기 및 앱 별로 최신의 알림만 저장한다. 오프라인 상태에서 저장된 알림이 존재할 때, 다시 한 번 알림 전송을 하면 가장 나중에 보낸 알림만 전달된다. 또는 알림이 너무 많이 쌓인 경우 Resource 관리를 위하여 시간이 너무 오래 지난 알림을 삭제한다.
- 보안 : 알림이 중간에 제 3자에 의해 탈취되면 악의적인 목적으로 사용될 수 있다. 이러한 문제를 해결하기 위해 APNs는 자체 보안 아키텍쳐를 이용해 알림을 안전하게 관리한다.
Connection Trust(APNs의 보안 기능)
APNs는 공급자 서버와 유저의 기기가 신뢰할만한 연결인지 판단하기 위해 Connection Trust를 보장하는 메커니즘을 가진다.
우선 공급자 서버와 APNs 간의 신뢰는 애플과 계약을 맺은 회사가 소유한 승인된 공급자만 APNs와 연결하여 푸시알림을 전달할 수 있도록 하기 위해 요구된다. 이러한 승인된 공급자의 예로 보편적으로 사용되는 Firebase Cloud Message 기능이 있다. Provider Server와 APNs 간의 신뢰 구축하는 방법으로 token-based(유효한 인증 키)와 certificate-based(SSL 인증서 기반)가 있는데, Backend 개발자의 역할이기에 간단히 넘어가자.
다음으로 APNs와 Device의 Connection trust를 위해서는 Device token Trust 방식을 이용한다. 디바이스 토큰은 애플이 특정 장치의 특정 앱에 할당한 고유한 식별정보인 NSData인데, 이 객체는 오직 APNs많이 해독하고 이해할 수 있다. 따라서 누군가에게 탈취되어도 안전을 보장한다. 따라서 Remote Notification을 이용하기 위해서는 특정 앱의 특정 Device Token을 얻어서 APNs에 등록해서 알림이 전달될 디바이스가 어떤 디바이스인지에 대해 미리 알려줘야 한다. 이 토큰을 Provider Server에 제공하면 추후 Provider Server가 이 토큰에 원하는 메시지를 담아서 APNs에 전달하고, APNs는 다시 Device token에 담긴 정보를 토대로 목표 Device에 알림을 전달하는 것이다.
하나의 앱에 대한 device token은 해당 앱에서만 사용할 수 있다. 같은 기기에 설치되어 있는 다른 앱에서 재사용될 수 없다. 각각의 앱들은 반드시 그 앱만의 특별한 device token을 요청하고 provider server에 보내줘야 한다.
Remote Notification을 구현하기 위해 개발자가 할 일
Remote Notification은 위와 같은 흐름으로 유저에게 전달되지만, 개발자는 이 모든 과정을 다룰 필요가 없다. 개발자들이 해야 할 일은 provider server를 세팅하고, 유저의 기기에 도착한 알림을 다를 수 있도록 Client를 세팅하기만 하면 된다. 알림에 대한 보안이나 관리는 APNs에서 모두 처리해준다.
이러한 Provider Server를 세팅하는 방법 중의 하나로 Firebase Cloud Messaging을 이용할 수 있다. APNs의 보안 요건을 갖춘 서버를 직접 구축하기 힘들거나 자체 서버를 구축할 수 없을 때, Console을 통해 간편하게 이를 세팅하고 iOS 앱 개발에 집중할 수 있다. 다음 글에서는 FCM을 이용하여 Remote Notification을 실제로 구현해 보겠다.
참고