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 çerezlerSameSite=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.
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.
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:
- GitHub'daki
SameSite
örnek deposunda sorun oluşturun. - StackOverflow'da "samesite" etiketiyle bir soru blog'una yazın.
- Chromium'un davranışıyla ilgili sorunlar için Chromium sorun izleyici aracılığıyla hata bildiriminde bulunun.
SameSite
güncellemeleri sayfasından Chrome'un ilerleme durumunu takip edin.