PHP'de Cookie (Çerez) ve Session (Oturum) Yönetimi

Bu içerikte PHP programlama dili ile web geliştirme yaparken sıklıkla kullanacağınız 2 yapıdan bahsetmek istiyorum. Çerezler ve Oturumlar.

Cookie (çerez) ve session (oturum) konusunu daha iyi anlayabilmeniz için; web site ve uygulamalarında kullanıcıya/ziyaretçiye özel değerleri ve verileri depolamak için kullanılan değişkenler olarak düşünebilirsiniz.

Cookie ve Session arasındaki farklar nelerdir?

Cookie ve sessionlar temelde aynı işe yarıyor olsa da yapıları ve kullanım alanları farklıdır. Cookie ve session arasındaki en temel ve ayırt edici fark veriyi depolama yerleridir.

Cookie verileri kullanıcının tarayıcısı üzerinde depolarken, session verileri sunucunun geçici (temp) dizininde tutar.

Cookie verileri kullanıcının tarayıcısı üzerinde depoladığı için kullanıcı tarafından kolaylıkla değiştirilmesi mümkündür. Bu yüzden kritik (güvenlik zafiyeti oluşturabilecek) verileri tutmak için tercih ve tavsiye edilmez. Sepet uygulamaları, bilgilendirme sistemleri gibi işlemlerde kullanılır.

Session verileri sunucu tarafında, oturum ID'si (PHPSESSID) ise kullanıcının tarayıcısında tutar. Bu yüzden kritik (güvenlik zafiyeti oluşturabilecek) verileri tutmak için tercih edilebilir. Üye giriş işlemleri gibi işlemlerde kullanılır.
Not: Session her ne kadar güvenilir olsa da bu örneğin parola gibi bilgileri orada tutmanızın güvenli olduğu anlamına gelmez.

Çok fazla sayıda cookie kullanımı web uygulamalarında hantallaşma/yavaşlama yaratabilir. Oturumlarda (session) ise böyle bir hantallaşma/yavaşlama söz konusu değildir.

Cookie verileri yazılımcının belirlediği zamana ya da kullanıcı tarayıcı geçmişini temizleyene kadar korunur, tarayıcı kapatılıp açılsa da veriler saklanmaya devam eder. Sessionlar için aynı şey söz konusu değildir; tarayıcının kapatılması, tarayıcı geçmişinin silinmesi ya da yazılım tarafından ilgili oturumun sonlandırılması (veya sunucunun kapanması) durumunda veriler yok edilir.

PHP'de tanımlanmış cookielere $_COOKIE, tanımlanmış sessionlara $_SESSION süper global dizileri ile ulaşabilirsiniz.

PHP'de Cookie (Çerez)

PHP'de cookie oluşturmak veya oluşturulan bir çerezin değerini güncellemek ya da silmek için setcookie() işlevi kullanılır. setcookie() işlevi aldığı parametreler doğrultusunda bir çerez oluşturur ve ya daha önce tanımlanmış olan bir çerezi siler.

Bu işlev şu parametreleri alır, ancak sadece ilk ikisi zorunludur ve çoğu zaman ilk üç parametre işinizi görecektir;

1. Çerez Adı (string) : Oluşturulacak ya da silinecek çerezin adı,

2. Çerezin Değeri (string) : Çerezin tutacağı veri/değer,

3. Çerezin Son Kullanma Tarihi (int) : Çerezin ne zamana kadar kullanılabileceğini belirten Unix zaman damgası. Belirtilmez; tarayıcı kapatılıncaya kadar çerez korunacaktır.

4. Yol (string) : Çerezin sitedeki hangi "path"lerde geçerli olduğunu tanımlabilmenizi sağlar. Belirtilemezse ya da "/" belirtilirse çerez tüm sitede geçerli olur ya da örneğin "/foo/" şeklinde tanımlanırsa çerez "/foo/" ve "/foo/bar/" gibi "/foo/" nun alt dizinlerinde geçerli olur.

5. AlanAdı (string) : Çerezin hangi alt alan adlarında geçerli olacağını belirlemenizi sağlar. Belirtilen domainin alt domainlerinde çerez etkili olur. Örneğin; "www.example.com" belirtirseniz çereze "ww2.www.example.com" alt domaininden de erişebilirsiniz. Tüm alt alan adlarında geçerli olmasını istiyorsanız örneğin "example.com" şeklinde belirleyebilirsiniz.

6. SSL (bool) : Çerezlerin sadece SSL sertifikalı bir bağlantı kullanması için true kullanılır. Varsayılan değeri false'dür. Bu parametreyi true belirleyerek kullanabilmek için isteğin https üzerinden gelmesi gerekir.

7. HTTPOnly (bool) : Çerezlerin sadece http protokolü üzerinden erişilebilir olmasını sağlamak için true belirtilebilir. Javascript gibi betik dilleri tarafından erişilmesini engelleyerek XSS saldırılarını önlenmeye çalışılır. (Buna güvenilmemelidir, XSS önlemek için yetersizdir.) Varsayılan değeri false'dür.

setcookie() işlevinin çok parametre alabiliyor olması gözünüzü korkutmasın. Genellikle ilk 3'ü dışındakilerin kullanıldığını görmezsiniz.

PHP'de Cookie Tanımlama

Cookieleri tanımlarken dikkat etmeniz ve alışkanlık haline getirmeniz gereken cookie isimlerini verirken değişken ismi verir gibi davranmanızdır. Yani boşluk, "_" ve "-" dışındaki sembollerin kullanımından kaçının, bir de ingiliz latin afabesi dışarındaki karakterileri kullanmayın.

setcookie("cerezAdi", "Çerezin değeri");

Yukarıdaki komut cerezAdi isminde bir çerez tanımlayarak içerisinde belirtilen değeri tutacaktır. Ve oluşturulan çerez 3. parametre ile bir zaman belirtilemediği için kullanıcı tarayıcısını kapatana kadar korunacaktır.

Örneğin biz oluşturulduktan 1 saat sonra silenecek bir çerez tanımlamak isteseydik;

setcookie("cerezAdi", "Çerezin Verisi", time() + 3600);

şeklinde tanımlayabilirdik. Burada time() şuanın zaman damgasını döndürecek ve üzerine 3600 saniye (1 saat) ekleyerek 1 saat sonrasına kadar bu çerezin geçerli olduğunu söylemiş oluyoruz.

Ya da örneğin 1 gün (24 saat) geçerli bir çerez tanımlamak istersek;

$cookieTimeOut = time() + (3600 * 24);
setcookie("cerezAdi", "Cookie Değeri", $cookieTimeOut);

PHP'de Cookie Verisini Kullanma

PHP'de tanımlanmış bir çereze $_COOKIE süper global dizisi ile ulaşabilirsiniz.

Örneğin kullaniciAdi isimli bir çerez oluşturalım ve buna ulaşarak ekrana yazdıralım;

setcookie("kullaniciAdi", "muhammetsafak");
echo $_COOKIE['kullaniciAdi']; // muhammetsafak

Önemli Not : Çerezler tanımlandıktan hemen sonra $_COOKIE ile ulaşılabilir olmaz. Bir çerezin ulaşılabilir olması için tarayıcı tarafından sunucuya istek yapıldığı aşamada bildirilmiş olması gerekir. Bu yüzden yukarıdaki örnekte sayfa ilk açıldığında çerez oluşturulacak ancak ekrana hiçbir şey yazdırılmayacaktır. Bir sonraki istek sırasında tarayıcı oluşturulmuş çerezi istek sırasında sunucuya ileteceği zaman gösterim yapılabilir.

PHP'de Cookie Verisini Güncelleme/Değiştirme

PHP'de bir çerezi güncelleme işlemi için de yine setcookie() işlevi kullanılır. Kullanım şekil yine yeni bir çerez oluşturmak ile birebir aynıdır.

setcookie("urunKodu", "4E55");

# echo $_COOKIE["urunKodu"]; // 4E55

setcookie("urunKodu", "0F75");

# echo $_COOKIE["urunKodu"]; // 0F75

PHP'de Cookie Silme

PHP'de tanımlanmış bir çerezi silme işlemi çerezin geçerlilik süresini geçmiş bir zaman olarak tanımlama ile yapılıyor. Çerez geçmiş bir zamanda sonlanmış göründüğü için de tarayıcı tarafından siliniyor.

setcookie("cerezAdi", "", time() - 3600);

PHP'de bir dizi olarak Cookie Kullanma

Çerezler yapısı gereği bir dize ya da numerik veri türündeki değerleri tutmak üzere tasarlanmıştır. Ve çerez isimleri de sadece dize veri türünde olabilir. Ancak farklı bir kullanım şekli daha vardır. PHP'de bir diziymiş gibi çerez kullanımı yapabilirsiniz.

Örneğin user adında bir çerez dizisinde ziyaretçinin isim, mail ve telefon bilgilerini tutalım. Yani çerez içerisinde tutmak istediğimiz veri aşağıdaki gibi bir dizi olarak tutmak istediğimizi düşünelim.

$user = array("isim" => "Ahmet", "mail" => "example@gmail.com", "telefon" => 01234567890);

Yukarıdaki gibi bir diziymiş gibi çerez oluşturup kullanmak istiyorsak;

setcookie("user[isim]", "Ahmet");
setcookie("user[mail]", "example@gmail.com");
setcookie("user[telefon]", 01234567890);

yukarıdaki örnek ile oluşturulan 3 çerezi bir dizi gibi

$_COOKIE['user']['isim'];
$_COOKIE['user']['mail'];
$_COOKIE['user']['telefon'];

şeklinde çağırabilirsiniz.

PHP'de Session (Oturum)

PHP ile sessionlar genellikle üye giriş işlemlerinde kullanılır. Temel de çerezlere benzer olarak kullanıcıya ait verileri tutmayı sağlar ancak veriler kullanıcı tarafında değil, sunucu tarafında saklanır.

Yaşam Süresi

Sessionların yaşam süresini yapılandırma (php.ini) dosyasında tanımlanır. Bunu değiştirmek isterseniz php yapılandırma dosyasında session.gc_maxlifetime yapılandırmasından süreyi değiştirebilirsiniz. Varsayılan olarak bu değer 1440 yani 24 dakikadır.

Not : Bu süre, cookielerdeki yaşam süresinden farklı olarak kullanıcının bir işlem yapmadığı süreyi ifade eder.

Not : Yaşam süresinden bağımsız olarak kullanıcı tarayıcıyı kapatırsa; yaşam süresine bakılmaksızın oturum sonlandırılır.

session_start()

PHP içerisinde sessionları kullanabilmeniz için öncelikle başlatmanız gerekir. session_start() işlevi sessionları başlatır.

Bu işlev session tanımlama veya erişme işlemlerini yapmadan önce (tercihen ilk satırda) çağırılmalıdır.

session_start();

Session Tanımlama ve Erişme

PHP'de session oluşturmak, değerini değiştirmek, silmek ve erişmek için $_SESSION süper global dizisi kullanılır.

username adında bir session oluşturmak;

$_SESSION['username'] = "muhammetsafak";

username adındaki sessiona erişmek;

echo $_SESSION['username'];

username adındaki sessiona yeni değer atama (güncelleme);

$_SESSION['username'] = "muhammetsafak";
echo $_SESSION['username']; // Output : muhammetsafak

$_SESSION['username'] = "admin";
echo $_SESSION['username']; // Output : admin

username adındaki sessionı silmek;

unset($_SESSION['username']);

Bu sadece bir session verisini silmek için kullanılabilir. Tüm oturum verilerini yok etmek için session_destroy() işlevi kullanılır.

session_destroy()

İlgili oturuma ait tüm verileri yok eder.

Not : Bu işlev ilgili oturuma ait verilerin tutulduğu geçici dosya içerisini boşaltır.

PHP'de cookie ve session kullanımları temel olarak bu şekildedir.