Push API Nedir? Nasıl Çalışır?

Merhaba 👋🏻 Sunucu ve istemcilerin temel olarak iki çeşit iletişim şekli vardır. Pull ve push protokolleri. Pull kelimesi çekmek ve push kelimesi de itmek anlamına gelir. Pull protokolünde istemcimiz sunucumuza bir istek gönderir ve sunucudan veri çeker. Push protokolünde ise sunucumuz ile istemcimiz arasındaki bağlantı sürekli olarak açıktır. Sunucumuz bu sürekli açık olan bağlantı aracılığıyla istemcimize bilgi gönderir. Kısacası birisinde bilgiyi istemci talep ederken diğerinde sunucu, istemcinin talep etmesine gerek kalmadan kendisi gönderir. Örnek olarak mail göndermek için kullandığımız SMTP de bir push protokolüdür. Push API dediğimiz şey en temel anlamda bir web uygulaması tarafından istemciye mesaj gönderilmesidir. Ancak bu mesajların size iletilmesi için illa ki o web uygulamasının açık olması ya da çalışıyor olması gerekmez. Sadece tarayıcınızın açık olması yeterlidir. Bir web uygulamasının push notificationlar alabilmesi için bir "service worker"a ihtiyacı vardır (Service worker hakkında da yazı gelecek). Service worker'ın bir push manager'a abone olabilmesi için iki şey gereklidir: gidip gelecek veriler için bir şifreleme anahtarı (encryption key) ve bir de endpoint. Service workerımız onpush eventini yakalayarak kendisine bir bildirim geldiğini anlar ve bildirim göstermek gibi çeşitli komutları çalıştırabilir. Oluşturulan her bir abonelik service worker'a özeldir. Endpoint dediğimiz URL de benzersizdir ve sizden başka kimse tarafından bilinmemelidir. Eğer bilinirse başkaları sizin uygulamanız üzerinden bildirim gönderebilirler. Eğer bir service workerı bildirim gönderecek şekilde ayarlamak isterseniz fazla kaynak tüketimine sebep olabilir, bu da aklınızda bulunsun. Ayrıca bütün tarayıcıların da bu konuda belirli bir standardı mevcut değil. Firefox bir uygulamanın gönderebileceği push mesaj sayısını sınırlarken Chrome herhangi bir sınır koymuyor ancak sunucunuza her bir push mesaj geldiğinde kullanıcınıza bir bildirim göndermenizi istiyor.

Nasıl Çalışır?

Push mesajların ne olduğunu az çok anladığımızı varsayıyorum. Şimdi bu işin arkasında yatan teknolojiye bir bakalım. Nasıl çalışıyor acaba bu push mesajlar? 3 adımda gerçekleşiyor aslında bu olay.
  1. İstemci tarafında izin alınması, abone (subscribe) olunması ve sunucuya bu aboneliği bildirmek
  2. Sunucu tarafında push mesaj göndermek
  3. Kullanıcının cihazında push eventini yakalamak ve işlem yapmak
Şimdi tek tek bu adımları inceleyelim.

İstemci Tarafı

Bir istemcinin bir sunucuya abone olabilmesi için öncelikle kullanıcıdan izin alması gerekmektedir. Sitelere girdiğimizde sürekli karşımıza çıkan "Bu sitenin size bildirim göndermesine izin veriyor musunuz?" ifadeleri aslında bu adımdır. Sonrasında ise tarayıcıdan bir PushSubscription alınması gerekir. PushSubscription, kullanıcıya bildirim gönderebilmek için bize lazım olan tüm bilgileri içerisinde saklar. Sakladığı veriler aslında cihazın kimliğidir diyebiliriz. Abonelik işlemleri başlatılmadan önce "Application Server Keys" adını verdiğimiz anahtarlar oluşturulur. Bu anahtarlar sizin sunucunuza özgüdür. Bu noktada bir adet public ve bir adet private keyiniz bulunmaktadır. Bu kullanıcıya bildirim göndermek için API isteği yapacağınız endpoint'i öğrenmek için push servisinize public keyinizi gönderirsiniz ve push servisiniz size endpointinizi gönderir. Bildirim göndereceğiniz zaman sunucunuzda mesajınızı ve private keyinizi şifreleyip bu endpointe gönderirsiniz. Push servisiniz yaptığınız isteğin geçerli olup olmadığını kontrol eder ve geçerli bir istek gönderdiyseniz kullanıcınızın cihazına push mesajınızı gönderir. Bu anahtarların yaptığı iş push servislerine hangi uygulama sunucusunun abone olduğunu bildirmek ve gönderilen push mesajların o sunucudan çıktığından emin olmaktır. Bir kullanıcının cihazına abone olduğunuz zaman PushSubscription bilgilerini backend tarafında göndermeniz gerekmektedir. Göndereceğiniz push mesajlar bu bilgiler sayesinde gönderilebildiği için PushSubscription ile gelen bilgileri veri tabanınıza kaydetmeniz gerekmektedir.

Kullanıcıyı Sisteme Kaydetmek

Kullanıcılarınıza bir push mesaj göndermek istediğiniz zaman push servisinize, kullanıcılarınıza mesaj göndermek istediğinize dair bir istek göndermeniz gerekmektedir. Bu isteği gönderirken isteğin içerisinde push mesaj gönderilecek olan cihazların bilgileri ve gönderilmek istenen veri olmalıdır. Burada ufak bir ara vermek istiyorum. Birkaç kez push servis ifadesini kullandık. Bu push servisin ne olduğunu kısaca açıklayalım. Push servis, sizin kendisine bildirdiğiniz mesajları, sizin bildirdiğiniz cihazlara push mesaj olarak gönderme işini yapan servislerdir. Eğer mesaj gönderilmek istenen tarayıcı çevrimdışı ise göndermek istediğiniz mesaj kuyruğa alınır ve tarayıcı online olduğunda gönderilir. Kullanılacak push servisi konusunda geliştiricilerin bir seçim yapma şansı yoktur. Her bir tarayıcı hangi push servisini kullanacağını kendisi belirler. Bütün push servislerinin API'ları aynıdır. Sadece uygun endpoint'e bir API isteği atmanız yeterlidir. Bir kullanıcının cihazına abone olduğunuz zaman PushSubscription adı altında birtakım bilgiler elde edeceğimizi söylemiştim. Bu bilgiler şuna benzeyecek:
{
  "endpoint": "https://some.pushservice.com/something-unique",
  "keys": {
    "p256dh":
"BIPUL12DLfytvTajnryr2PRdAgXS3HGKiLqndGcJGabyhHheJYlNGCeXl1dn18gSJ1WAkAPIxr4gK0_dQds4yiI=",
    "auth":"FPssNDTKnInHVndSTdbKFw=="
  }
}
Kullanıcımızın kullandığı tarayıcıya göre değişen benzersiz bir endpoint adresi ve anahtarlar. Buradaki anahtarları kullanıcımıza mesaj gönderirken bu gönderdiğimiz mesajları şifrelemek için kullanacağız. PushSubscription bilgisi geldikten sonra bu bilgileri uygulamamızın backendine gönderiyoruz ve veri tabanımıza kaydediyoruz.

Push Mesaj Göndermek ve İstemci Tarafında Bu Mesajı Almak

Uygulamamıza abone olan her kullanıcının PushSubscription bilgilerini alıp veri tabanımıza kaydetmiştik. Şimdi kullanıcılarımıza bir mesaj göndermek istediğimizi varsayalım. Bu işlemi yapmak için kullanılabilecek birçok kütüphane var ancak bu yazımızda kod örneği olmayacak. Sadece olayın çalışma mantığını anlatmak istiyorum. Kullanıcımıza göndermek istediğimiz mesajımız kullanıcımızdan aldığımız keyler ile şifreleniyor. Bu şifrelemenin amacı push servisimizin mesajlarımızın içeriğini okuyamaması. Şifrelenmiş mesajımız kullanıcımıza özel olan endpointe gönderiliyor ve push servisimiz tarafından kullanıcımızın cihazına gönderiliyor. Kullanıcımızın cihazı bu keyler kendisinde de saklı olduğu için push servis tarafından gelen şifreli mesajı çözüyor ve sonrasında ne için programlandıysa o işi yapıyor (Örneğin bildirim göndermek). Eğer kullanıcımızın bilgisayarı çevrimiçi değilse bu durumda da push servisimiz bu gönderdiğimiz mesajı kuyruğa alıyor ve kullanıcımızın cihazı çevrimiçi duruma geldiğinde ona gönderiyor. Ayrıca push servisleri tarafında kullanabileceğimiz birkaç güzel özellik var. Bunlardan bir tanesi de push mesajın yaşam süresi. Push mesajınız için bir yaşam süresi belirleyebiliyorsunuz. Bu özellik sayesinde "1 gün içerisinde mesajım iletilmezse kuyruktan silinsin ve kullanıcıya gönderilmesin" gibi komutlar verebiliyorsunuz. Gönderdiğiniz mesajlar için konular belirleyebiliyorsunuz. Aynı konuda bir mesaj gönderdiğiniz zaman kuyruktaki push mesajlarınız yenisiyle değiştiriliyor. Bu arada yazımızın ortalarında bir yerde bütün push servislerinin aynı API isteklerine cevap verdiğini söylemiştik. Bunun da bir standardı var, ismi "Webpush Protokol". Şu adreste protokole ait bütün bilgileri bulabilirsiniz: https://tools.ietf.org/html/draft-ietf-webpush-protocol-12#page-10 En temel anlamda Push API'nin ne olduğunu ve nasıl çalıştığını anlatmaya çalıştım. Umarım faydalı bir içerik olmuştur. Aklınıza takılan soruları yorumlar bölümünden sorabilirsiniz. Bu yazıyı yazarken benim faydalandığım kaynakları incelemek isteyebilirsiniz. Onları da şuraya bırakayım:

1 Yorum

  1. Service Worker Nedir? | Mustafa Zahid EFE
    Yanıtla

    […] Service Worker, tarayıcınızın web sitenizden bağımsız olarak arka planda çalıştırabildiği, çalışması için kullanıcı aksiyonuna ihtiyaç duymadan bir Javascript betiğidir. Arkaplanda çalışabiliyor olması sayesinde web uygulamalarınıza çeşitli özellikler katar. Bu özelliklerden biri olan Push Notification'ları geçen haftaki yazımda anlatmıştım. Eğer nasıl çalıştığı hakkında fikir sahibi olmak isterseniz şu yazıyı okuyabilirsiniz: Push API Nedir, Nasıl Çalışır? […]

Yorum Bırakın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir