Chrome, Firefox, Edge ve diğerleri varsayılan davranışını IETF teklifi olan Artımlı Daha İyi Çerezler'e göre değiştiriyor. Böylece:
SameSite
özelliği olmayan çerezlerSameSite=Lax
olarak değerlendirilir. Bu durumda, varsayılan davranış, çerezleri yalnızca birinci taraf bağlamlarıyla kısıtlamaktır.- Siteler arası kullanıma yönelik çerezlerin, üçüncü taraf bağlamına dahil edilmesini sağlamak için
SameSite=None; Secure
değeri belirtilmelidir.
Henüz yapmadıysanız, ileride engellenmemeleri için üçüncü taraf çerezlerinize ilişkin özellikleri güncellemeniz gerekir.
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 etmesi için sizin ya da sağlayıcının çerezlerini güncellediğinizden 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ı aşağıdakileri içerir:
- Diğer sitelerden paylaşılan videolar, haritalar, kod örnekleri ve sosyal medya yayınları gibi yerleştirilmiş içerikler.
- Ödemeler, takvimler, rezervasyon ve rezervasyon özellikleri gibi harici hizmetlerden 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'sinin, sayfanın URL'si ile eşleşmediği bir tarayıcı penceresinin şeması.](https://web.dev/static/articles/samesite-cookie-recipes/image/diagram-a-browser-window-809ed902fbce7.png?authuser=5&hl=tr)
Web, yapısı gereği derleme yapılabildiği için <iframes>
, üst düzey veya birinci taraf bağlamında görüntülenen içeriği yerleştirmek için de kullanılır. iframe'de görüntülenen sitenin kullandığı tüm çerezler, üçüncü taraf çerezleri olarak kabul edilir. Diğer sitelerin yerleştirmesini istediğiniz siteler oluşturuyorsanız ve bu sitelerin çalışması için çerezlere ihtiyacınız varsa, bunların siteler arası kullanım için işaretlendiğini veya bunlar olmadan sorunsuz şekilde geri çekilebilmenizi de sağlamanız gerekir.
Siteler genelinde "güvenli olmayan" istekler
Burada "güvenli değil" ifadesi kulağa endişe verici gelebilir, ancak durumunu değiştirmesi beklenen tüm istekleri ifade eder. Web'de bunlar öncelikli olarak POST istekleridir. SameSite=Lax
olarak işaretlenen çerezler, farklı bir siteye gitmek için bir bağlantıyı tıklama gibi güvenli üst düzey gezinmelerde gönderilir. Ancak POST kullanarak 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.](https://web.dev/static/articles/samesite-cookie-recipes/image/diagram-a-request-moving-46b47373768e3.png?authuser=5&hl=tr)
Bu kalıp, geri dönmeden önce bir işlem yapması (ör. üçüncü taraf kimlik sağlayıcısına yönlendirme) amacıyla kullanıcıyı uzak bir hizmete yönlendirebilen siteler için kullanılır. Kullanıcı siteden ayrılmadan önce, Siteler Arası İstek Sahtekarlığı (CSRF) saldırılarını azaltmak amacıyla 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 gelirse çerezleri SameSite=None; Secure
olarak işaretlemeniz gerekir.
Uzak kaynaklar
Bir sayfadaki <img>
veya <script>
etiketleri gibi uzak kaynaklar, istekle birlikte gönderilen çerezlere dayanarak olabilir. Yaygın kullanım alanları arasında
izleme pikselleri ve içerik kişiselleştirme yer alır.
Bu durum, fetch
veya XMLHttpRequest
kullanılarak JavaScript'inizden gönderilen istekler için de geçerlidir. fetch()
, credentials: 'include'
seçeneğiyle çağrılırsa bu istekler büyük olasılıkla çerez içerir.
XMLHttpRequest
için beklenen çerezler genellikle true
için withCredentials
değeriyle gösterilir. Bu çerezlerin, siteler arası isteklere dahil edilmeleri için uygun bir şekilde işaretlenmesi gerekir.
Web Görünümü'ndeki içerik
Platforma özgü uygulamalardaki bir WebView, tarayıcı tarafından desteklenir. Geliştiricilerin, uygulamalarını etkileyen kısıtlamaların veya sorunların, uygulamalarının Web Görünümleri için de geçerli olup olmadığını test etmeleri gerekir.
Android, platforma özel uygulamalarının çerezleri doğrudan CookieManager API'yi kullanarak ayarlamasına da izin veriyor.
Üstbilgiler veya JavaScript kullanılarak 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şaretleyin. Bu çerezleri işaretlemez ve
bunları işlemek için varsayılan tarayıcı davranışından yararlanırsanız çerezler, tarayıcılarda
tutarsız davranabilir ve her bir çerez için konsol uyarılarını tetikleyebilir.
Set-Cookie: first_party_var=value; SameSite=Lax
Üçüncü taraf bağlamında gerekli olan tüm çerezleri SameSite=None; Secure
olarak işaretlediğinizden emin olun. Her iki özellik de zorunludur. Secure
olmadan yalnızca None
değerini belirtirseniz çerez reddedilir. Tarayıcı uygulamalarındaki farklılıkları hesaba katmak için 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şleyin
None
öğesini eklemek ve varsayılan davranışı güncellemek için yapılan bu değişiklikler henüz nispeten yeni olduğundan farklı tarayıcılar bunları farklı şekillerde ele almaktadır. Bilinen sorunların listesini görmek için chromium.org adresindeki güncellemeler sayfasına göz atabilirsiniz ancak bu listede tüm örneklere yer verilmemiş olabilir.
Olası geçici çözümlerden biri, her bir çerezi hem yeni hem de eski stilde 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 ayarlar. Yeni davranışı uygulamayan tarayıcılar bu değeri yoksayar ve 3pcookie-legacy
çerezini ayarlar. Dahil edilen çerezleri işlerken, sitenizin öncelikle yeni çerez stilinin olup olmadığını kontrol etmesi, ardından yeni bir çerez bulamaması durumunda eski çereze geri dönmesi gerekir.
Aşağıdaki örnekte, Express çerçevesi ve onun cookie-parser ara yazılımı kullanılarak Node.js'de bunun 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);
Bu yaklaşım, fazladan çerezler ayarlamak ve hem çerezi ayarlamak hem de çerezi okumak sırasında değişiklik yapmak için fazladan çalışma yapmanızı gerektirir. Ancak, davranışları ne olursa olsun tüm tarayıcıları kapsamalı ve üçüncü taraf çerezlerinin çalışmaya devam etmesini sağlamalıdır.
Alternatif olarak, Set-Cookie
başlığı gönderildiğinde kullanıcı aracısı dizesini kullanarak istemciyi tespit edebilirsiniz. Uyumsuz istemcilerin listesine bakın ve platformunuz için uygun bir kullanıcı aracısı algılama kitaplığı (ör. Node.js'deki ua-parser-js kitaplığı) kullanın. Bu yaklaşım yalnızca tek bir değişiklik yapmanızı gerektirir ancak kullanıcı aracısı yoklama yöntemi, etkilenen tüm kullanıcıları yakalamayabilir.
Diller, kitaplıklar ve çerçevelerde SameSite=None
desteği
Dillerin ve kitaplıkların çoğu çerezler için SameSite
özelliğini destekler. Ancak, SameSite=None
eklenmesi hâlâ nispeten yeni olduğundan, şimdilik bazı standart davranışlara geçici bir çözüm bulmanız gerekebilir.
Bu davranışlar, GitHub'daki SameSite
örnek deposunda belgelenmiştir.
Yardım alma
Çerezler web'de her yerde kullanılır ve sitelerinin özellikle siteler arası kullanım durumlarında bunları nerede ayarladığı ve kullandığı konusunda tam bilgi sahibi olan geliştirme ekiplerine çok nadir rastlanır. Bir sorunla ilk defa karşılaşmış olabilirsiniz. Bu nedenle bize ulaşmaktan çekinmeyin:
- GitHub'daki
SameSite
örnek deposunda sorun oluşturun. - StackOverflow'da "samesite" etiketinde bir soru sorun.
- Chromium'un davranışıyla ilgili sorunlar için Chromium sorun izleyicisinde hata oluşturun.
SameSite
güncellemeleri sayfasından Chrome'un ilerleme durumunu takip edin.