SameSite kurabiye tarifleri

Chrome, Firefox, Edge ve diğerleri varsayılan davranışını IETF teklifi olan Artımlı Daha İyi Çerezler'e göre değiştirecek. Böylece:

  • SameSite özelliği olmayan çerezler SameSite=Lax olarak değerlendirilir. Bu da varsayılan davranışa göre çerezleri yalnızca birinci taraf içerikleriyle kısıtlamak olur.
  • Siteler arası kullanıma yönelik çerezlerin, üçüncü taraf bağlamına dahil edilmesini sağlamak için SameSite=None; Secure değeri belirtilmelidir.

Bu özellik, Chrome 84'ün kararlı sürümünden itibaren varsayılan davranıştır. Henüz yapmadıysanız üçüncü taraf çerezlerinizin özelliklerini güncelleyerek ileride engellenmemesini sağlayın.

Tarayıcılar arası destek

MDN'nin Set-Cookie sayfasının Tarayıcı uyumluluğu bölümüne bakın.

Siteler arası veya üçüncü taraf çerezlerin kullanım alanları

Çerezlerin üçüncü taraf bağlamında gönderilmesini gerektiren çeşitli yaygın kullanım durumları ve kalıplar vardır. Bu kullanım alanlarından birini sağlıyorsanız veya ona bağlıysanız hizmetin doğru şekilde çalışmaya devam etmesini sağlamak için sizin ya da sağlayıcının çerezlerini güncellediğinden emin olun.

<iframe> içindeki içerik

<iframe> içinde gösterilen farklı bir siteden gelen içerik, üçüncü taraf bağlamındadır. Standart kullanım alanları şunlardır:

  • Diğer sitelerden paylaşılan videolar, haritalar, kod örnekleri ve sosyal medya yayınları gibi yerleştirilmiş içerikler.
  • Ödemeler, takvimler, rezervasyon ve rezervasyon işlevi gibi harici hizmetlerdeki widget'lar.
  • Daha az belirginlik oluşturan sosyal düğmeler veya sahtekarlık önleme hizmetleri gibi widget'lar <iframes>.

Çerezler başka işlerin yanı sıra oturum durumunu korumak, genel tercihleri depolamak, istatistikleri etkinleştirmek veya mevcut hesapları olan kullanıcılar için içeriği kişiselleştirmek amacıyla kullanılabilir.

Yerleştirilmiş içeriğin URL&#39;sinin, sayfanın URL&#39;si ile eşleşmediği bir tarayıcı penceresinin şeması.
Yerleştirilmiş içerik, üst düzey tarama bağlamıyla aynı siteden gelmiyorsa bu üçüncü taraf içeriğidir.

Buna ek olarak, web yapısı gereği oluşturabileceğinden, üst düzey veya birinci taraf bağlamında görüntülenen içeriği yerleştirmek için <iframes> kullanılır. Bu site tarafından kullanılan tüm çerezler, site çerçeve içinde görüntülendiğinde üçüncü taraf çerezleri olarak kabul edilir. Başkaları tarafından kolayca gömülmesini istediğiniz siteler oluşturuyorsanız ve aynı zamanda çalışması için çerezlerden yararlanıyorsanız, bunların siteler arası kullanım için işaretlendiğinden veya onlar olmadan sorunsuz bir şekilde yedek alabildiğinizden de emin olmanız gerekir.

Siteler genelinde "güvenli olmayan" istekler

"Güvenli değil" kulağa biraz endişeli gelse de, bu, durumu değiştirme amaçlı olabilecek herhangi bir isteği ifade eder. Birincil olarak POST istekleri olan web'de. SameSite=Lax olarak işaretlenen çerezler, güvenli üst düzey gezinmelerde (ör. farklı bir siteye gitmek için bir bağlantının tıklanması) gönderilir. Ancak POST üzerinden farklı bir siteye yapılan <form> gönderimi gibi bir şey çerez içermez.

Bir sayfadan diğerine geçiş yapan bir isteği gösteren diyagram.
Gelen istek "güvenli" bir yöntem kullanıyorsa çerezler gönderilir.

Bu kalıp, geri dönmeden önce bazı işlemleri gerçekleştirmek üzere kullanıcıyı uzak bir hizmete yönlendirebilen (ör. bir üçüncü taraf kimlik sağlayıcıya yönlendirme) siteler için kullanılır. Kullanıcı siteden ayrılmadan önce, Siteler Arası İstek Sahtekarlığı (CSRF) saldırılarını hafifletmek için bu jetonun geri gelen istekte kontrol edilebileceği beklentisiyle, tek kullanımlık jeton içeren bir çerez ayarlanır. Bu geri dönüş isteği POST üzerinden geliyorsa çerezleri SameSite=None; Secure olarak işaretlemeniz gerekir.

Uzak kaynaklar

Bir sayfadaki uzak kaynaklar, istekle birlikte <img> etiketlerinden, <script> etiketlerinden vb. gönderilecek çerezlerden yararlanıyor olabilir. Yaygın kullanım alanları arasında izleme pikselleri ve içerik kişiselleştirme yer alır.

Bu durum, JavaScript'inizden fetch veya XMLHttpRequest tarafından başlatılan istekler için de geçerlidir. credentials: 'include' seçeneğiyle birlikte fetch() çağrılırsa bu durum, söz konusu isteklerde çerezlerin daha iyi beklendiğini gösterir. XMLHttpRequest için, true olarak ayarlanan withCredentials özelliğinin örneklerini bulmanız gerekir. Bu, söz konusu isteklerde çerezlerin iyi bir şekilde beklenebileceğinin iyi bir göstergesidir. Bu çerezlerin, siteler arası isteklere dahil edilmeleri için uygun şekilde işaretlenmesi gerekir.

Web Görünümü'ndeki içerik

Platforma özgü uygulamalarda kullanılan WebView, tarayıcı tarafından desteklenir ve aynı kısıtlama veya sorunların geçerli olup olmadığını test etmeniz gerekir. Android'de, Web Görünümü Chrome tarafından destekleniyorsa Chrome 84'te yeni varsayılanlar hemen uygulanmaz. Ancak amacınız, bunları gelecekte uygulamak olduğundan yine de test edip hazırlıklı olmanız gerekir. Ayrıca Android, platforma özel uygulamalarının çerezleri doğrudan CookieManager API aracılığıyla ayarlamasına da izin verir. Üstbilgiler veya JavaScript aracılığıyla ayarlanan çerezlerde olduğu gibi, siteler arası kullanım için tasarlanmışsa SameSite=None; Secure özelliğini eklemeyi düşünün.

SameSite nasıl uygulanır?

Yalnızca birinci taraf bağlamında ihtiyaç duyulan çerezleri, ihtiyaçlarınıza göre SameSite=Lax veya SameSite=Strict olarak işaretlemeniz gerekir. Ayrıca, hiçbir şey yapmamayı ve yalnızca tarayıcının, varsayılan ayarı zorunlu kılmasına izin vermeyi de seçebilirsiniz. Ancak bu, tarayıcılar arasında tutarsız davranış ve her bir çerez için olası konsol uyarıları riskini de beraberinde getirir.

Set-Cookie: first_party_var=value; SameSite=Lax

Üçüncü taraf bağlamında gerekli olan çerezler için SameSite=None; Secure olarak işaretlendiklerinden emin olmanız gerekir. Her iki özelliğin bir arada olması gerektiğini unutmayın. Secure olmadan yalnızca None değerini belirtirseniz çerez reddedilir. Bununla birlikte, tarayıcı uygulamalarında birbiriyle uyumlu olmayan bazı farklılıklar vardır. Bu nedenle, aşağıdaki Uyumsuz istemcileri işleme bölümünde açıklanan hafifletme stratejilerinden bazılarını kullanmanız gerekebilir.

Set-Cookie: third_party_var=value; SameSite=None; Secure

Uyumsuz istemcileri işleme

None öğesini içermek ve varsayılan davranışı güncellemek için yapılan bu değişiklikler hâlâ nispeten yeni olduğundan, bu değişikliklerin işlenme şekliyle ilgili tarayıcılar arasında tutarsızlıklar mevcuttur. Şu anda bilinen sorunlar için chromium.org'daki güncellemeler sayfasına bakabilirsiniz ancak bunun kapsamlı olup olmadığını söylemek mümkün değildir. Bu ideal olmamakla birlikte, bu geçiş aşamasında uygulayabileceğiniz geçici çözümler vardır. Ancak genel kural, uyumsuz istemcilerin özel durum olarak ele alınmasıdır. Yeni kuralları uygulayan tarayıcılar için istisna oluşturmayın.

İlk seçenek hem yeni hem de eski stil çerezleri ayarlamaktır:

Set-cookie: 3pcookie=value; SameSite=None; Secure
Set-cookie: 3pcookie-legacy=value; Secure

Yeni davranışı uygulayan tarayıcılar çerezi SameSite değeriyle ayarlarken, diğer tarayıcılar çerezi yoksayabilir veya yanlış ayarlayabilir. Ancak bu tarayıcılar 3pcookie-legacy çerezini ayarlar. Dahil edilen çerezleri işlerken, site ilk olarak yeni stildeki çerezin varlığını kontrol etmeli, bulunamazsa da eski çereze geri dönmelidir.

Aşağıdaki örnekte, Express çerçevesi ve cookie-parser ara yazılımından yararlanılarak bunun Node.js'de nasıl yapılacağı gösterilmektedir.

const express = require('express');
const cp = require('cookie-parser');
const app = express();
app.use(cp());

app.get('/set', (req, res) => {
  // Set the new style cookie
  res.cookie('3pcookie', 'value', { sameSite: 'none', secure: true });
  // And set the same value in the legacy cookie
  res.cookie('3pcookie-legacy', 'value', { secure: true });
  res.end();
});

app.get('/', (req, res) => {
  let cookieVal = null;

  if (req.cookies['3pcookie']) {
    // check the new style cookie first
    cookieVal = req.cookies['3pcookie'];
  } else if (req.cookies['3pcookie-legacy']) {
    // otherwise fall back to the legacy cookie
    cookieVal = req.cookies['3pcookie-legacy'];
  }

  res.end();
});

app.listen(process.env.PORT);

Bunun olumsuz tarafı, tüm tarayıcıları kapsayacak yedek çerezlerin ayarlamayı ve hem çerezin ayarlanması hem de okunması sırasında değişiklik yapılmasını gerektirmesidir. Ancak bu yaklaşım, davranışlarından bağımsız olarak tüm tarayıcıları kapsamalı ve üçüncü taraf çerezlerinin eskisi gibi çalışmaya devam etmesini sağlamalıdır.

Alternatif olarak, Set-Cookie üstbilgisini gönderirken kullanıcı aracısı dizesi aracılığıyla istemciyi algılamayı seçebilirsiniz. Uyumsuz istemcilerin listesine bakın ve platformunuza uygun bir kitaplıktan (örneğin, Node.js'deki ua-parser-js kitaplığı) yararlanın. Normal ifadeleri kendiniz yazmak istemeyeceğiniz için kullanıcı aracısı algılamayı işleyecek bir kitaplık bulmanız önerilir.

Bu yaklaşımın avantajı, çerez ayarlanırken yalnızca tek bir değişiklik yapılmasını gerektirmesidir. Ancak buradaki gerekli uyarı, kullanıcı aracısı ile yoklama işlevinin doğası gereği hassas olduğu ve etkilenen kullanıcıların tamamını yakalayamayacağıdır.

Diller, kitaplıklar ve çerçevelerde SameSite=None desteği

Dillerin ve kitaplıkların çoğu, çerezler için SameSite özelliğini desteklemektedir. Ancak SameSite=None eklenmesi hâlâ nispeten yenidir. Bu nedenle, şimdilik standart davranışlardan bazılarını gidermeniz gerekebilir. Bunlar, GitHub'daki SameSite örnek deposunda belgelenmiştir.

Yardım alma

Çerezler her yerde bulunur ve özellikle de siteler arası kullanım alanları da dahil olmak üzere, nerede ayarlanıp kullanıldıklarını tam olarak denetlenmeyen siteler oldukça nadirdir. Herhangi bir sorunla ilk kez karşılaşmış olabilirsiniz. Bu nedenle bize ulaşmaktan çekinmeyin: