Google Cloud Messaging (GCM)은 개발자가 서버와 클라이언트 간에 메시지를 주고 받는것이 가능하게 해주는 무료 서비스입니다. 여기에는 서버로부터 클라이언트 앱으로 전송하는 다운스트림 메시지(Downstream Message)와 클라이언트 앱으로부터 서버로 전송하는 업스트림 메시지(Upstream Message)가 포함됩니다.
예를 들어 “새로운 메일이 도착했습니다” 노티피케이션과 같은 서버로부터의 새로운 정보를 클라이언트에 알려줄 수 있는 가벼운 형태의 다운스트림 메시지가 있습니다. 이러한 인스턴트 메시지를 사용하는 경우 GCM 메시지를 이용하면 최대 4KB의 페이로드를 클라이언트 앱에 전송할 수 있습니다. GCM 서비스는 수신 또는 송신을 하게 될 클라이언트 앱으로부터의 메시지 전송에 대한 큐잉(Queueing)을 포함한 모든 측면을 처리합니다.
GCM를 구현하는데에는 구글 커넥션 서버와 HTTP 또는 XMPP 프로토콜을 통해 커넥션 서버와 통신을 할 환경을 갖춘 앱 서버, 그리고 클라이언트 앱이 포함됩니다.
이러한 각각의 컴포넌트들은 다음과 같은 방식으로 통신하게 됩니다.
- 구글 GCM 커넥션 서버는 당신의 앱 서버로부터 다운스트림 메시지를 받아서 클라이언트 앱으로 전송을 하게 됩니다. XMPP 커넥션 서버의 경우 클라이언트 앱으로부터 업스트림 메시지를 받아서 당신의 앱 서버로 전송할 수도 있습니다. 더 많은 정보가 필요할 경우 [GCM 커넥션 서버에 대해]를 참고해 주세요.
- 당신의 앱 서버에서는 GCM 커넥션 서버와 통신을 할 HTTP 와 XMPP 프로토콜을 구현합니다. 앱 서버는 GCM 커넥션 서버에 다운스트림 메시지를 발송하고, 커넥션 서버는 이 메시지를 큐에 담에 보관합니다. 그리고 클라이언트 앱에 다시 전송하게 됩니다. 만약 당신이 XMPP를 구현하였다면 당신의 앱 서버는 클라이언트 앱으로부터 메시지를 수신받는 것이 가능합니다.
- 클라이언 앱은 GCM이 활성화 된 앱 앱을 의미합니다. GCM 메시지를 수신하기 위해 당신의 앱은 반드시 GCM에 등록되어야 하며 등록 토큰(Registration Token)이라고 불리는 유니크한 식별자를 받아야 합니다.
GCM과 관련된 기본적인 용어와 컨셉은 다음과 같습니다. 크게 다음과 같은 카테고리로 나뉘어질 수 있습니다.
- 컴포넌트(Components) : GCM에서 주요한 역할을 담당할 엔티티
- 자격(Credentials) : 메시지가 올바른 장소에 전달되도록 하는 모든 부분에서 인증을 위해 사용되는 GCM에서 사용되는 ID와 토큰
컴포넌트에는 크게 3가지로 다음과 같은 요소가 있습니다.
- GCM 커넥션 서버 : 앱 서버와 클라이언트 앱간에 메시지를 전송하는데 관여하는 구글이 관리하는 서버
- 클라이언트 앱 : 당신의 앱 서버와 통신하고자 하는 GCM이 활성화 된 클라이언트 앱
- 앱 서버 : GCM 구현의 일부가 되도록 개발 되어야 하는 앱 서버. 이 앱 서버는 GCM 커넥션 서버를 통해 클라이언트 앱에 데이터를 전송합니다. 만약 당신의 앱 서버가 XMPP 프로토콜을 구현하였다면 클라이언트 앱으로부터 메시지를 수신받는것도 가능합니다.
자격(Credentials)에는 다음과 같은 4가지 요소가 있습니다.
- Sender ID : 당신이 구글 개발자 콘솔에서 API 프로젝트를 설정함으로써 발급되는 유니크한 숫자로 된 값. 이 Sender ID는 앱서버가 클라이언트 앱에 메시지를 발송하는것이 허용되는지 여부를 확인하는데에 사용됩니다.
- API Key : API Key는 당신의 앱 서버에 저장되며 이 앱서버가 구글 서비스에 접근 가능하도록 인증하는데에 사용됩니다. HTTP 환경에서 API Key는 POST로 요청으로 발송되는 발송 메시지의 헤더에 포함되어야 합니다. XMPP 환경에서는 커넥션을 맺을 때 사용되는 비밀번호로 사용되는 인증과 같은 SASL PLAIN 인증을 사용합니다. 이 API Key는 당신의 클라이언트 코드 어디에도 포함되어서는 안됩니다.
- Application ID : 메시지 수신을 받는 클라이언트 앱이 있을 때 플랫폼 별로 다음과 같이 다른 구현이 필요합니다.
- Android : 앱 Manifest에 등록되어있는 패키지명(Package Name)을 사용합니다.
- iOS : 앱의 번들 아이디(Bundle Identifier)를 사용합니다.
- Chrome : 크롬 익스텐션의 이름을 사용합니다.
- Registration Token : 클라이언트 앱이 메시지 수신을 가능하게 하기 위해 GCM 커넥션 서버로부터 발급 받는 ID. 이 Registration Token은 보안을 신경써서 보관되어야 합니다.
GCM이 동작하는 라이프사이클 과정은 다음과 같습니다.
- GCM을 사용가능하도록 등록합니다. 메시지 수신을 하고자 하는 클라이언트 앱을 등록합니다. 더 자세한 내용은 [클라이언트 앱 등록]을 참고해주세요.
- 다운스트림 메시지 발송 및 수신하기.
- 메시지를 발송합니다. 앱 서버는 클라이언트 앱에 메시지를 발송합니다.
- 앱서버는 GCM 커넥션 서버에 메시지를 발송합니다.
- 만약 디바이스가 오프라인이라면 GCM 커넥션 서버는 수신한 메시지를 큐에 담고 저장해 둡니다.
- 디바이스가 온라인 될 때, GCM 커넥션 서버는 이 디바이스에 메시지를 발송합니다.
- 디바이스에서는, 플랫폼별로 적절하게 구현되어있는 클라이언트 앱이 메시지를 수신합니다.
- 메시지를 수신합니다. 클라이언트 앱은 GCM 커넥션 서버로부터 메시지를 수신합니다.
- 메시지를 발송합니다. 앱 서버는 클라이언트 앱에 메시지를 발송합니다.
- 업스트림 메시지 발송 및 수신하기. 이 기능은 XMPP 커넥션 서버를 사용할 경우에만 사용 가능합니다.
- 메시지를 발송합니다. 클라이언트 앱이 앱 서버에 메시지를 발송합니다.
- 디바이스에서, 클라이언트 앱은 XMPP 커넥션 서버에 메시지를 발송합니다.
- 만약 서버가 연결이 되지 않을 경우 XMPP 커넥션 서버는 메시지를 큐에 담고 저장해 둡니다.
- 서버가 다시 연결 될 때, XMPP 커넥션 서버는 앱 서버에 메시지를 발송합니다.
- 메시지를 수신합니다. 앱 서버는 XMPP 커넥션 서버로 부터 메시지를 수신받고 다음과 같은 과정을 거칩니다.
- 메시지의 헤더를 파싱하여 클라이언트 앱의 발송자 정보를 검증합니다.
- 메시지 수신을 인정하는 “ack” 신호를 XMPP 커넥션 서버에 발송합니다.
- 클라이언트 앱에서 정의한대로 메시지의 페이로드를 파싱하여 해당 정보를 사용합니다.
- 메시지를 발송합니다. 클라이언트 앱이 앱 서버에 메시지를 발송합니다.
메시지에 대한 좀 더 상세한 설명과 사용가능한 옵션에 대해 알아보실려면 [Google Cloud Messaging (GCM) 메시지 컨셉과 옵션]를 참고해주세요.
참고 : https://developers.google.com/cloud-messaging/gcm