출석체크 애플리케이션 프로젝트에서 이벤트 알림 방법으로 웹 푸시알림이 선택되었습니다.
사용자가 이벤트를 즐겨찾기로 등록하면, 다음 두가지 경우 푸시알림을 받을 수 있습니다
학교 내에서 이루어지는 이벤트 특성 상 10분전과 시작 시간에 알림을 준다면
이벤트 종료전에 사용자가 참여할 수 있을것이라 판단했습니다
먼저 웹 Push 동작방식에 대해 학습했습니다.
웹 Push동작은 서버에서 클라이언트로 데이터를 밀어넣는 것입니다.
이때 클라이언트가 먼저 요청을 보내지 않아도 서버가 데이터를 밀어 넣을 수 있습니다.
웹 Push의 동작에는 3가지 주체가 등장합니다.
전체 흐름은 다음과 같습니다
1. 서버에서 푸시 알림 메세지를 Push 서비스로 전달합니다
2. Push 서비스에서 클라이언트를 식별한 뒤, 푸시 알림 메세지를 전송합니다
조금 더 세부적으로 들어가면 웹 푸시 프로토콜에 의해 규약을 지켜야해서
몇 가지 과정이 더 추가됩니다
웹 푸시 프로토콜에 의해 위와 같은 5가지 과정으로 이루어집니다.
4번 순서에서 푸시 알림 메세지와 구독정보를 암호화합니다.
안전하게 전달하기 위해 푸시 알림의 표준 암호화 방식인 VAPID 인증방식을
사용하여 암호화합니다.
VAPID는 공개키 암호화 방식으로 주어진 메세지를 암호화합니다
공개키 암호화 방식을 사용하면
평문은 비공개 키로 암호화하고 공개키로 복호화할 수 있고,
공개키로 암호화하면 비공개 키로만 복호화할 수 있습니다
서버에서 Push 서비스로 메세지를 전달할 때
VAPID 명세가 담긴 JWT를 VAPID 비공개 키로 암호화해서 함께 전달합니다.
해당 JWT를 Push 서비스에서 공개키로 복호화한 뒤 유효성 검증을 진행할 수 있습니다.
유효성 검증을 통과한다면 5번 과정이 진행되겠지만,
통과하지 못한다면 Push 서비스에서 5번 과정을 진행하지 않습니다.
해당 방식을 통해 Push 서비스로 전송하는 과정에서 메세지를 보호할 수 있고,
검증되지 않은 Push 메세지도 미리 차단해서 서비스를 보호할 수 있습니다.
번외: 웹 푸시알림과 서비스 워커
웹 푸시알림은 클라이언트와 서버가 연결되어 있지 않은 환경에서도
Push 서비스로부터 메세지를 수신할 수 있습니다.이것이 가능한 이유는 브라우저 백그라운드 환경에서 동작하는 서비스 워커 덕분입니다.
서비스 워커는 푸시 서비스의 메세지를 수신하고 이벤트 트리거 역할을합니다.해당 개발은 프론트엔드에서 담당했습니다.
웹 푸시 알림 방식도 정리되었으니 어떻게 개발할지를 생각해야합니다.
보통 두 가지 방법으로 푸시 알림 서비스 개발할 수 있습니다.
해당 프로젝트에서는 FCM을 선택했습니다.
직접 Push API를 개발하는 것보다 FCM을 선택하는 것이
비용 및 성능을 고려했을 때 더 합리적이라고 판단했기 때문입니다.
FCM은 무료로 메세지를 전송할 수 있는 교차 플랫폼 메세징 솔루션입니다.
FCM의 가장 장점은 다음과 같습니다
외부 서비스를 이용할때 항상 고민하는 것이 바로 비용입니다.
하지만 FCM을 사용하면 비용 걱정없이 사용 가능합니다. 모든 사용이 무료입니다!
앞서 FCM은 교차 플랫폼 메세징 솔루션이라고 정의하였습니다.
즉 다양한 플랫폼에서 사용가능하며, 웹 브라우저와 앱 운영환경의 제한 없이
어느 플랫폼에서도 FCM을 사용할 수 있습니다!
특정 이벤트에 대해 푸시알림을 보낼 때, 많은 사용자에게 발송할 것을 고려해야합니다
Outbound 트래픽에 따른 서버 성능 저하와 비용을 고려해야합니다..
하지만 외부 서비스인 FCM에 일임한다면, 발송 트래픽에 대한 부담을 덜어낼 수 있습니다
위와 같은 장점으로 FCM을 선택했습니다.
FCM이 푸시 알림을 보내는 방법은 크게 두가지 방법이 있습니다
FCM 서버와 통신하기 위해 사용되는 고유 식별자입니다.
FCM 토큰은 디바이스마다 고유합니다.
따라서 서버는 FCM 토큰을 이용해서 특정 디바이스로 메세지를 전송할 수 있습니다
TOPIC은 채널과 같은 역할을 하며, 채널에 들어온 수신자에게 메세지를 전송할 수 있습니다
수신자는 구독과 구독 취소 방법을 통해 TOPIC 채널에 들어오거나 나갈 수 있습니다
TOPIC을 사용하면 토픽을 구독한 사용자들에게만 메세지를 전송할 수 있으며,
제한없이 구독한 사용자 모두에게 메세지를 전송할 수 있습니다
프로젝트에서 선택한 방법은 FCM TOPIC 방법입니다.
이유는 다음과 같습니다
사용자가 많은 환경에서 적합하지 않은 선택이라 생각했고,
마침 이벤트라는 좋은 공통 주제도 존재해서 FCM TOPIC이 적합하다고 판단했습니다.
웹 푸시 알림 방법으로 FCM TOPIC 방법을 선택했습니다.
이제 즐겨찾기 기능과 연결하여, 구체적으로 어떻게 사용할 것인지 설계하고
Spring boot에서 어떻게 구현할 것인지 3부에서 이어서 작성하겠습니다.