Ana Karargâh Neler Yapıyoruz?
Hikayemizin Perde Arkası Beyin Kıvılcımları Bağlantıya Geçin

Progressive Web App (PWA) Güvenlik Önlemleri

Merhaba değerli okuyucular! Bugün, modern web teknolojilerinin en heyecan verici gelişmelerinden biri olan Progressive Web App'ler (PWA) ve bunların güvenlik önlemleri hakkında konuşacağız. PWA'lar, web ve mobil uygulamaların en iyi özelliklerini bir araya getiriyor, ancak beraberinde bazı güvenlik zorlukları da getiriyor. Hadi bu konuyu derinlemesine inceleyelim!

Progressive Web App (PWA) Nedir?

Progressive Web App'ler, web teknolojileri kullanılarak geliştirilen, ancak geleneksel web sitelerinden daha fazla özelliğe sahip uygulamalardır. Çevrimdışı çalışabilme, push bildirimleri gönderebilme ve cihaz özelliklerine erişebilme gibi yeteneklere sahiptirler.

PWA'ların Güvenlik Zorlukları

PWA'lar birçok avantaj sunsa da, bazı güvenlik zorluklarıyla da karşı karşıya kalırlar:

  1. Veri Depolama: Çevrimdışı çalışma özelliği, hassas verilerin cihazda depolanmasını gerektirebilir.
  2. Service Worker Güvenliği: Service worker'lar, ağ isteklerini araya girebilir ve değiştirebilir.
  3. HTTPS Gerekliliği: PWA'lar için HTTPS zorunludur, ancak doğru yapılandırılmazsa güvenlik açıkları oluşabilir.
  4. Cihaz API'lerine Erişim: PWA'lar, potansiyel olarak tehlikeli olabilecek cihaz özelliklerine erişebilir.
  5. Güncellemeler: PWA'ların güncel tutulması, geleneksel web uygulamalarına göre daha karmaşık olabilir.

PWA Güvenlik Önlemleri

1. Güvenli HTTPS Yapılandırması

HTTPS, PWA'lar için olmazsa olmazdır. Güvenli bir HTTPS yapılandırması için şu adımları izleyin:


// web.config örneği (IIS için)
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="{HTTPS}" pattern="off" ignoreCase="true" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
    <httpProtocol>
      <customHeaders>
        <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

2. Güvenli Service Worker Kullanımı

Service worker'ları güvenli bir şekilde kullanmak için, kapsamlarını sınırlandırın ve içeriklerini dikkatlice kontrol edin.


// service-worker.js örneği
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open('my-cache').then((cache) => {
      return cache.addAll([
        '/',
        '/index.html',
        '/styles/main.css',
        '/scripts/main.js'
      ]);
    })
  );
});

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request).then((response) => {
      return response || fetch(event.request);
    })
  );
});

3. Güvenli Veri Depolama

Hassas verileri güvenli bir şekilde depolamak için Web Storage API veya IndexedDB kullanırken şifreleme uygulayın.


// Veri şifreleme ve depolama örneği
const secureStorage = {
  setItem: async (key, value) => {
    const encryptedValue = await encryptData(value);
    localStorage.setItem(key, encryptedValue);
  },
  getItem: async (key) => {
    const encryptedValue = localStorage.getItem(key);
    if (encryptedValue) {
      return await decryptData(encryptedValue);
    }
    return null;
  }
};

async function encryptData(data) {
  // Şifreleme mantığı
}

async function decryptData(encryptedData) {
  // Şifre çözme mantığı
}

// Kullanım
await secureStorage.setItem('user_token', 'secret_token');
const token = await secureStorage.getItem('user_token');

4. Content Security Policy (CSP) Uygulaması

CSP, XSS saldırılarına karşı koruma sağlar ve hangi kaynakların yüklenebileceğini kontrol eder.


// CSP header örneği
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' https://trusted-cdn.com; img-src 'self' data: https:; connect-src 'self' https://api.example.com;

5. Web App Manifest Güvenliği

Web App Manifest dosyanızı güvenli bir şekilde yapılandırın.


// manifest.json örneği
{
  "name": "Güvenli PWA Örneği",
  "short_name": "GüvenliPWA",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#000000",
  "icons": [
    {
      "src": "/icons/icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/icons/icon-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ],
  "permissions": [
    "geolocation",
    "notifications"
  ]
}

6. Güvenli Push Bildirimleri

Push bildirimleri için kullanıcı iznini alın ve bildirimleri şifreleyin.


// Push bildirimi izni alma ve gönderme örneği
if ('serviceWorker' in navigator && 'PushManager' in window) {
  navigator.serviceWorker.ready.then((registration) => {
    registration.pushManager.subscribe({
      userVisibleOnly: true,
      applicationServerKey: urlBase64ToUint8Array(publicVapidKey)
    }).then((subscription) => {
      // Sunucuya aboneliği gönder
      fetch('/subscribe', {
        method: 'POST',
        body: JSON.stringify(subscription),
        headers: {
          'Content-Type': 'application/json'
        }
      });
    });
  });
}

function urlBase64ToUint8Array(base64String) {
  // Base64'ten Uint8Array'e dönüştürme
}

7. Düzenli Güvenlik Denetimleri

PWA'nızı düzenli olarak güvenlik açıkları için tarayın ve güncelleyin.


// Örnek güvenlik denetimi scripti (Bash)
#!/bin/bash

echo "PWA güvenlik denetimi başlatılıyor..."

# Bağımlılıkları kontrol et
npm audit

# Statik kod analizi
eslint .

# Lighthouse PWA denetimi
lighthouse https://your-pwa-url.com --output json --output-path ./lighthouse-report.json

# Sonuçları analiz et
node analyze-security-report.js

echo "PWA güvenlik denetimi tamamlandı."

Gerçek Dünya Örneği: Güvenli Bir E-ticaret PWA

Bir e-ticaret PWA'sının güvenlik önlemlerini düşünelim:


// index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Güvenli E-ticaret PWA</title>
  <link rel="manifest" href="/manifest.json">
  <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' https://trusted-cdn.com; img-src 'self' data: https:; connect-src 'self' https://api.example.com;">
</head>
<body>
  <!-- PWA içeriği -->
  <script src="/js/app.js"></script>
</body>
</html>

// app.js
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then((registration) => {
      console.log('Service Worker kaydedildi:', registration);
    })
    .catch((error) => {
      console.log('Service Worker kaydı başarısız:', error);
    });
}

// Güvenli veri depolama
const secureStorage = {
  setItem: async (key, value) => {
    const encryptedValue = await encryptData(value);
    localStorage.setItem(key, encryptedValue);
  },
  getItem: async (key) => {
    const encryptedValue = localStorage.getItem(key);
    if (encryptedValue) {
      return await decryptData(encryptedValue);
    }
    return null;
  }
};

// Kullanıcı oturumu açma
async function login(username, password) {
  const response = await fetch('https://api.example.com/login', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ username, password })
  });
  
  if (response.ok) {
    const { token } = await response.json();
    await secureStorage.setItem('user_token', token);
    return true;
  }
  return false;
}

// Güvenli API çağrıları
async function fetchProducts() {
  const token = await secureStorage.getItem('user_token');
  const response = await fetch('https://api.example.com/products', {
    headers: {
      'Authorization': `Bearer ${token}`
    }
  });
  return response.json();
}

// service-worker.js
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open('e-commerce-cache-v1').then((cache) => {
      return cache.addAll([
        '/',
        '/index.html',
        '/styles/main.css',
        '/js/app.js',
        '/images/logo.png'
      ]);
    })
  );
});

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request).then((response) => {
      return response || fetch(event.request);
    })
  );
});

// Push bildirim işleme
self.addEventListener('push', (event) => {
  const data = event.data.json();
  self.registration.showNotification(data.title, {
    body: data.body,
    icon: '/images/icon.png'
  });
});

Güvenlik, PWA'ların Temelidir

Progressive Web App'ler, kullanıcı deneyimini büyük ölçüde iyileştirme potansiyeline sahiptir. Ancak, bu güçlü özellikleri güvenli bir şekilde uygulamak, geliştiricilerin sorumluluğundadır. Bu yazıda bahsedilen güvenlik önlemleri, PWA'nızın güvenliğini önemli ölçüde artıracaktır.

Unutmayın ki, güvenlik sürekli evrim geçiren bir alandır. Yeni tehditler ve savunma mekanizmaları sürekli ortaya çıkmaktadır. Bu nedenle, PWA'nızın güvenliğini düzenli olarak gözden geçirmek, güncellemek ve en iyi uygulamaları takip etmek çok önemlidir.

Umarım bu yazı, Progressive Web App güvenlik önlemleri hakkında size değerli bilgiler sunmuştur. Sorularınız veya eklemek istedikleriniz varsa, yorum bölümünde bekliyorum. Güvenli kodlamalar!