PHP'de Session (Oturum) ve Cookie (Çerez) Yönetimi Nasıl Yapılır?

Web uygulamalarında kullanıcı durumunu takip etmek ve kişiselleştirilmiş deneyimler sunmak için session ve cookie mekanizmaları temel taşlardır. Bu rehberde PHP'de oturum ve çerez yönetiminin temel prensiplerini, pratik kullanımlarını ve güvenlik ile performans odaklı iyi uygulamaları ele alacağız.

Giriş: Session ve Cookie Nedir, Ne İçin Kullanılır?

Session (oturum), sunucu tarafında saklanan ve her kullanıcıya özel bir kimlik (session id) üzerinden erişilen veri deposudur. Genellikle giriş bilgisi, kullanıcı tercihleri veya işlem durumları gibi sunucu tarafı bilgileri için kullanılır. Session verileri sunucuda saklandığı için hassas bilgilerin korunması daha kolaydır.

Cookie (çerez) ise tarayıcıya gönderilen ve istemcide saklanan küçük veri parçalarıdır. Çerezler, oturum bilgisinin sürdürülebilir olması, kullanıcı tercihlerini hatırlama veya izleme amaçlarıyla kullanılır. Ancak çerezler istemci tarafında saklandığından güvenlik ve gizlilik açısından daha dikkatli yönetilmelidir.

PHP'de Oturum Yönetimi (Session)

Oturumu başlatma ve temel kullanım

Bir oturumı başlatmak için sayfanın en üstünde, herhangi bir çıktıdan önce session_start() çağrılmalıdır. Oturum verileri $_SESSION süper global dizisiyle okunur ve yazılır.

<?php
session_start();

// Değer atama
$_SESSION['user_id'] = 123;
$_SESSION['username'] = 'gokhan';

// Değer okuma
echo $_SESSION['username'];
?>

Oturum sonlandırma ve güvenlik

  • Oturum verilerini temizleme: session_unset() ile oturum değişkenleri temizlenir.
  • Oturumu tamamen sonlandırma: session_destroy() ile sunucudaki session verisi silinir; ayrıca tarayıcıdaki session cookie'si de silinmelidir.
  • Oturum kimliği yenileme: session_regenerate_id(true) ile oturum açma sonrası ID yenilenmeli; bu, session fixation saldırılarını önler.
<?php
// Oturum temizleme ve yok etme
session_start();
$_SESSION = array();

// Eğer session cookie kullanılıyorsa cookie'yi sil
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params['path'], $params['domain'], $params['secure'], $params['httponly']
    );
}

session_destroy();
?>

Güvenlik iyi uygulamaları (Session)

  • Her başarılı oturum açmada session_id'yi yenileyin (session_regenerate_id).
  • Session çerezlerinde HttpOnly ve Secure bayraklarını kullanın.
  • Gerekliyse aynı site politikası için SameSite ayarını yapılandırın.
  • Oturum süresi (inactivity timeout) belirleyin ve uzun süreli oturumları kapatın.
  • Hassas verileri oturumda düz metin olarak saklamayın; mümkünse ID referansı tutup veriyi güvenli sunucu ortamında saklayın.

PHP'de Çerez Yönetimi (Cookie)

Çerez oluşturma ve okuma

PHP'de çerez oluşturmak için setcookie() fonksiyonu kullanılır. Bu fonksiyon, yanıt başlıkları gönderilmeden önce çağrılmalıdır.

<?php
// Basit bir çerez oluşturma (tarayıcıya gönderilir)
setcookie('site_theme', 'dark', time() + 86400); // 1 gün

// Yeni PHP sürümlerinde dizi ile opsiyonlar
setcookie('session_token', 'abc123', [
    'expires' => time() + 3600,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax'
]);

// Çerez okuma
if (isset($_COOKIE['site_theme'])) {
    echo $_COOKIE['site_theme'];
}
?>

Çerez güvenliği ve gizlilik

  • HttpOnly: JavaScript ile erişimi engeller; XSS riskini azaltır.
  • Secure: Çerezin yalnızca HTTPS üzerinden iletilmesini sağlar.
  • SameSite: CSRF riskini azaltmak için Lax veya Strict olarak ayarlanmalıdır.
  • Hassas verileri çerezde saklamayın: Kimlik doğrulama belirteçleri dahi ise imzalı veya kısa ömürlü ve sunucu tarafı doğrulaması olan yapı kullanılmalı.

Session vs Cookie: Hangi Durumda Hangisini Kullanmalı?

  • Kısa süreli güvenli veriler (ör. giriş durumu): Session tercih edilir çünkü sunucu tarafında saklanır.
  • Tarayıcıda kalıcı tercihleri hatırlama (tema, dil): Cookie daha uygundur.
  • Performans: Çok büyük session verileri sunucuda yük oluşturabilir; sadece gerekli verileri saklayın ve büyük verileri veritabanında tutun.

Uygulama Örnekleri ve İyi Pratikler

Login akışı örneği (özet)

  • Kullanıcı giriş formu gönderir.
  • Kimlik doğrulama sunucuda yapılır; başarılı ise session_start() ile oturum başlatılır ve kullanıcı ID'si $_SESSION içine yazılır.
  • session_regenerate_id(true) ile oturum kimliği yenilenir.
  • Gerekliyse uzun süreli oturumlar için güvenli, imzalı ve kısa ömürlü token'lar çerezde saklanır ve sunucuda doğrulanır.

Ek güvenlik önlemleri

  • IP adresi ve user-agent gibi ek kontroller ile oturumun tutarlı kullanımı doğrulanabilir, ancak kullanıcının değişken ağ ortamlarında false pozitife dikkat edilmelidir.
  • Oturum veritabanı veya redis gibi merkezi bir store kullanarak çok sunuculu mimarilerde tutarlılığı sağlayın.
  • Oturum dosyalarının sunucu dosya sisteminde doğru izinlerle saklandığından emin olun.

Özet ve Sonuç

PHP'de session ve cookie yönetimi, doğru uygulandığında kullanıcı deneyimini iyileştirir ve uygulama güvenliğini artırır. Temel kurallar şunlardır:

  • Session: Hassas ve sunucu tarafında saklanması gereken veriler için kullanın; session_regenerate_id ve HttpOnly/Secure gibi bayraklarla güvenliği güçlendirin.
  • Cookie: Kullanıcı tercihleri ve kalıcı ama güvenlilik gerektirmeyen ayarlar için tercih edin; güvenlik için SameSite, Secure ve HttpOnly kullanın.
  • Genel yaklaşım: Hassas bilgileri istemci tarafında saklamayın, oturum ömrünü yönetin, ID yenileme ve merkezi oturum yönetimi ile ölçeklenebilir ve güvenli bir yapı kurun.

Bu rehber, PHP ile oturum ve çerez yönetimine pratik, güvenli ve sürdürülebilir bir bakış sunmayı amaçladı. Uygulama gereksinimlerinize göre bu prensipleri uyarlamak; güvenlik, ölçeklenebilirlik ve kullanıcı deneyimi arasındaki dengeyi sağlamanıza yardımcı olacaktır.