푸시 서비스 동작방식에 궁금증이 있습니다.

   조회 4442   추천 0    

푸시 서비스.

다들 알고 계시죠? 휴대폰 등의 알림을 제공해 주는 서비스입니다.

푸시 서비스가 없다면, 서버가 클라이언트에게 정보를 제공해 주기가 어려우니.. 클라이언트가 수시로 서버에게 알림이 왔는지 물어봐야 하는 형태가 될 겁니다. 그렇게 되면 의미 없는(?) 요청이 계속되어질 테고(알림이 계속 뜨진 않을 테니까요..) 그로 인해 서버/네트워크 부하가 가중될 것입니다.

그래서 푸시 서비스가 나온 것으로 알고 있습니다.
서버가 클라이언트에게, 필요할 때에만 정보를 제공하는 것이죠.
필요할 때 접속하는 것은 어쩔 수 없는 것이죠. 이것 때문에 부하가 가중된다면, 용량을 증설해야겠죠.

그런데 본질적인 궁금증이 있습니다.
논리적 서버는 1대로 보고.. 논리적이든 물리적이든 클라이언트는 전 세계에 수십억 대가 있을 텐데..
서버 입장에서 어디로 정보를 보내야 하는지 어떻게 식별할까요?
실제로 이런 '알림'은 거의 실시간으로 오던데..
심지어 일부 이동통신망은 공인IP도 아니고.. 사설IP로 되어 있는 경우도 있던데요..
(쉽게 말하자면 공유기 뒤에 있는 거죠. 클라이언트 입장에서 나가는 건 자유롭겠지만, 들어오는 건 막혀 있을 겁니다.)

그리고, 푸시 서비스 역시 TCP/IP 통신을 할 것 같은데..
각 클라이언트에 어떻게 연결되는 것일까요? 보통 클라이언트는 막혀 있잖아요.
하긴, 이건 클라이언트(IOS, 안드로이드)가 특정 IP/포트에 대해서 개방해 놓으면 되긴 하겠네요.

자료 검색을 좀 해 봤는데, 이런 밑바닥(?) 이야기는 별로 없어서, 질문 드려봅니다.
IOS, 안드로이드 각각 이런 푸시 서비스를 제공하고 있다는데.. 전세계의 그 많은 알림을 다 처리한다니 놀랄노자네요.
카카오는 자체 서비스를 구축했다고 그러더군요.

궁금합니다..

짧은글 일수록 신중하게.
장터알림 경우에 구글 웹푸시 기술을 사용하고 있습니다. 구글에서는 FCM (Firebase Cloud Messaging)기반으로 알림 신청 당시의 사용자 endpoint를 알려주고 메시지를 보낼때는 오픈소스 형태의 푸시서버를 통해 해당 endpoint 에 특정한 메시지를 전달하기만 하면 FCM이 해당 엔드포인트(브라우저)로 메시지를 전달해주는 역할을 합니다. 고민하시던 엔드포인트 연결이슈는 구글이 알아서 처리해줘서 응용 개발자는 별 고민없이 사용만 합니다.

예전에 장터알리미 종료할때 공개했지만, 만들때 참조했던 레퍼런스 정보들을 아래 붙입니다. 필요시 참고하시면 될것 같습니다.

Web Push Notification 참조자료들

푸시서버
(GITHUB) PHP 웹푸시 서버 https://github.com/web-push-libs/web-push-php

구글공식자료
(HTML) Introduction to Push Notifications : https://developers.google.com/web/ilt/pwa/introduction-to-push-notifications
(HTML) Push Notifications on the Open Web: https://developers.google.com/web/updates/2015/03/push-notifications-on-the-open-web
(Youtube) Intro to Web Push & Notifications : https://www.youtube.com/watch?v=ggUY0Q4f5ok
(HTML) Web Push Notifications Overview : https://developers.google.com/web/fundamentals/push-notifications

MDN web docs
Push API : https://developer.mozilla.org/ko/docs/Web/API/Push_API
Notification API : https://developer.mozilla.org/ko/docs/Web/API/notification

사용자자료
(Youtube) Web Push Notifications in Xampp with PHP : https://www.youtube.com/watch?v=vi9d6MjiBGQ
     
아마데우쓰 2021-11
꿀벌 님. 와.. 엄청난 자료군요.
설명이 좀 이해하기 어려운데..
'endpoint' --> 제가 말하는 '클라이언트'
이렇게 이해하면 되려나요?

그리고, 이 endpoint로 연결을 어떻게 하는지는 FCM의 경우, 구글이 알아서 해 준다? --> 그 로직은 고민할 필요가 없다?
이렇게 이해하면 됩니까? ^^
          
네. 사용자는 (메시지, 엔드포인트) 를 가지고 오픈소스 푸시서버에게 메시지를 전달하면 해당 서버가 구글FCM에 해당 내용을 중간에서 대신 전달하는 역할을 합니다. 엔드포인트는 특정 url 형태로 인코딩 되어 있고요. 푸시서버 설정을 할때는 공개키/개인키 방식으로 키 발급하고 셋팅하는 과정도 필요합니다.
dateno1 2021-11
NAT를 거치더라도 리버스 커넥션하면 언제든지 가능합니다
     
아마데우쓰 2021-11
리버스 커넥션을 해서 가능하다고 하더라도.. 클라이언트가 서버에 규칙적으로 접근한다면, 그 트래픽을 무시할 수 없겠죠.
그래서 리버스 커넥션은 이번 건의 해결책은 아닌듯 합니다.
          
dateno1 2021-11
NAT있어도 리버스든 uPnP든 포트 열 방법은 얼마든지 있다는것뿐입니다
무아 2021-11
능동적으로 서버에서 클라이언트로 쏴 주는 것이 아니라
클라이언트에서 (정확히는 각 앱이 아니라 OS에서 사용하는 서비스 같은 거) 주기적으로 긁어 오는 것이겠죠.
사용자 (앱) 입장에서는 OS에서 주기적으로 확인한 내용을  앱으로 푸쉬 해주는 거니까 서버에서 푸쉬 해주는 걸로 느껴지는.. 뭐 그런 거 아닐까요?

p.s. 위에서 꿀벌님 얘기를 보니까 주기적으로 긁어오는 것이 아니라 내 위치가 바뀔 때마다 내위치만 갱신해주고 이벤트가 있을 때 서버쪽에서 바뀐 위치로 쏴주는 건가 보네요.
아마데우쓰 2021-11
여러 분들 말씀을 들어보니 이제야 이해가 좀 됩니다.
대단히 고맙습니다.

서버에 클라이언트를 등록해 둡니다.
(그러면 서버가 클라이언트에게 메시지를 보낼 수 있습니다.)
클라이언트의 위치가 바뀌거나 하면, 클라이언트가 서버에게 이를 알립니다.
그러니 서버는 항상 클라이언트에게 메시지를 보낼 수 있게 되는 것이죠.

알고 보니 별 것 아니긴 하네요. ^^


QnA
제목Page 3949/5708
2014-05   5141112   정은준1
2015-12   1675766   백메가
2015-04   4112   Lucifer
2018-05   4112   하데스
2015-03   4112   김건우
2017-07   4112   이희주
2018-01   4112   김병철
2017-10   4112   김민성
2018-06   4112   불무골
2015-05   4112   우수한
2018-10   4112   DDDIE
2016-01   4112   song05
2015-01   4111   개왕초보
2014-01   4111   Nicoffeine
2020-09   4111   막울었어요
2017-04   4111   김건우
2018-02   4111   2cpumem
2017-07   4111   앙드레준
2015-11   4111   제이든
2016-06   4111   SkyBase
2019-09   4110   술이
2015-05   4110   건전지