Chrome, Firefox, Edge ve diğer tarayıcılar, varsayılan davranışlarını IETF teklifine uygun şekilde değiştiriyor. Artımlı Olarak Daha İyi Çerezler teklifi sayesinde:
SameSite
özelliği olmayan çerezlerSameSite=Lax
olarak değerlendirilir. Bu, varsayılan davranışın çerezleri yalnızca birinci taraf bağlamlarıyla kısıtlamak olduğu anlamına gelir.- Siteler arası kullanıma yönelik çerezlerde, üçüncü taraf bağlamına dahil edilmeyi etkinleştirmek için
SameSite=None; Secure
belirtilmelidir.
Henüz yapmadıysanız üçüncü taraf çerezlerinizin özelliklerini, gelecekte engellenmeyecekleri şekilde güncellemeniz gerekir.
Siteler arası veya üçüncü taraf çerezlerinin kullanım alanları
Çerezlerin üçüncü taraf bağlamında gönderilmesi gereken bazı yaygın kullanım alanları ve kalıplar vardır. Bu kullanım alanlarından birini sağlıyorsanız veya bu alanlardan birine bağlıysanız hizmetin düzgün şekilde çalışması için sizin veya sağlayıcının çerezlerini güncellediğinizden emin olun.
<iframe>
içindeki içerikler
<iframe>
içinde gösterilen farklı bir siteden alınan içerik, üçüncü taraf bağlamındadır. Standart kullanım alanları şunlardır:
- Diğer sitelerden paylaşılan yerleştirilmiş içerikler (ör. videolar, haritalar, kod örnekleri ve sosyal medya yayınları).
- Ödeme, takvim, rezervasyon ve rezervasyon özellikleri gibi harici hizmetlerden alınan widget'lar.
- Sosyal medya düğmeleri veya sahtekarlık karşıtı hizmetler gibi daha az belirgin bir deneyim oluşturan widget'lar
<iframes>
.
Çerezler, oturum durumunu korumak, genel tercihleri depolamak, istatistikleri etkinleştirmek veya mevcut hesapları olan kullanıcılar için içeriği kişiselleştirmek gibi çeşitli amaçlarla burada kullanılabilir.
Web doğası gereği birleştirilebilir olduğundan, <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 bunların çalışması için çerezlere ihtiyacınız varsa bu çerezlerin siteler arası kullanım için işaretlendiğinden veya bunlar olmadan sorunsuz bir şekilde geçiş yapabileceğinizden de emin olmanız gerekir.
Siteler arasında "güvenli olmayan" istekler
"Güvenli değil" ifadesi endişe verici görünse de durum değişikliği amaçlı olabilecek tüm istekleri ifade eder. Web'de bu, esas olarak POST istekleridir. SameSite=Lax
olarak işaretlenen çerezler, farklı bir siteye gitmek için bir bağlantıyı tıklamak gibi güvenli üst düzey gezinmelerde gönderilir. Ancak POST yöntemini kullanarak farklı bir siteye <form>
gönderim yapılması gibi işlemler çerez içermez.
Bu kalıp, kullanıcıyı geri dönmeden önce uzak bir hizmete yönlendirerek bazı işlemleri gerçekleştirebilen siteler için kullanılır (ör. üçüncü taraf kimlik sağlayıcıya yönlendirme). Kullanıcı siteden ayrılmadan önce, Siteler Arası İstek Sahteciliği (CSRF) saldırılarını azaltmak için döndürülen istekte kontrol edilebileceği beklentisiyle tek kullanımlık bir jeton içeren bir çerez ayarlanır. Döndürülen istek POST üzerinden geliyorsa çerezleri SameSite=None; Secure
olarak işaretlemeniz gerekir.
Uzaktan kaynaklar
Bir sayfadaki uzak kaynaklar (ör. <img>
veya <script>
etiketleri), istekle birlikte gönderilen çerezleri kullanabilir. İzleme pikselleri ve içeriği kişiselleştirme, yaygın kullanım alanlarından bazılarıdır.
Bu durum, JavaScript'inizden fetch
veya XMLHttpRequest
kullanılarak gönderilen istekler için de geçerlidir. fetch()
, credentials: 'include'
seçeneği ile çağrılırsa bu isteklerin çerez içermesi muhtemeldir.
XMLHttpRequest
için beklenen çerezler genellikle true
için withCredentials
değeri ile belirtilir. Bu çerezler, siteler arası isteklere dahil edilmek için uygun şekilde işaretlenmelidir.
WebView'deki içerik
Platforma özgü bir uygulamadaki WebView, tarayıcı tarafından desteklenir. Geliştiricilerin, uygulamalarını etkileyen kısıtlamaların veya sorunların uygulamalarının WebView'leri için de geçerli olup olmadığını test etmesi gerekir.
Android, platforma özgü uygulamalarının doğrudan CookieManager API'yi kullanarak çerez ayarlamasına da olanak tanır.
Üstbilgi veya JavaScript kullanılarak ayarlanan çerezlerde olduğu gibi, siteler arası kullanım için tasarlanmış çerezleri SameSite=None; Secure
ile ekleyebilirsiniz.
SameSite
'ü bugün uygulama
Yalnızca birinci taraf bağlamında ihtiyaç duyulan çerezleri ihtiyaçlarınıza bağlı olarak SameSite=Lax
veya SameSite=Strict
olarak işaretleyin. Bu çerezleri işaretlemezseniz ve bunları işlemek için varsayılan tarayıcı davranışına güvenirseniz tarayıcılar arasında tutarsız davranabilir ve her çerez için konsol uyarıları tetikleyebilir.
Set-Cookie: first_party_var=value; SameSite=Lax
Üçüncü taraf bağlamında ihtiyaç duyulan tüm çerezleri SameSite=None; Secure
olarak işaretlediğinizden emin olun. Her iki özellik de gereklidir. Secure
olmadan yalnızca None
değerini belirtirseniz çerez reddedilir. Tarayıcı uygulamalarındaki farklılıkları hesaba katmak için Uyumlu olmayan istemcileri işleme bölümünde açıklanan azaltma stratejilerinden bazılarını kullanmanız gerekebilir.
Set-Cookie: third_party_var=value; SameSite=None; Secure
Uyumsuz istemcileri işleme
None
'ü dahil etme ve varsayılan davranışı güncellemeyle ilgili bu değişiklikler henüz nispeten yeni olduğundan farklı tarayıcılar bunları farklı şekillerde ele alır. Bilinen sorunların listesi için chromium.org'daki güncellemeler sayfasına göz atabilirsiniz. Ancak bu liste eksik olabilir.
Olası bir geçici çözüm, her çerezi hem yeni hem de eski tarzda ayarlamaktır:
Set-cookie: 3pcookie=value; SameSite=None; Secure
Set-cookie: 3pcookie-legacy=value; Secure
Daha yeni davranışı uygulayan tarayıcılar, çerezi SameSite
değerine ayarlar. Yeni davranışı uygulamayan tarayıcılar bu değeri yok sayar ve 3pcookie-legacy
çerezini ayarlar. Siteniz, dahil edilen çerezleri işlerken önce yeni stil çerezin varlığını kontrol etmeli, ardından yeni bir çerez bulamadığı takdirde eski çereze geri dönmelidir.
Aşağıdaki örnekte, Express çerçevesi ve 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, gereksiz çerezleri ayarlama ve hem çerezi ayarlama hem de okuma noktasında değişiklik yapma konusunda ek çalışma yapmanızı gerektirir. Ancak bu, davranışlarından bağımsız olarak tüm tarayıcıları kapsayacak ve üçüncü taraf çerezlerinin çalışmasını sağlayacaktır.
Alternatif olarak, Set-Cookie
başlığı gönderildiğinde kullanıcı aracısı dizesini kullanarak istemciyi algılayabilirsiniz. Uyumlu olmayan istemcilerin listesine bakın ve platformunuz için uygun bir kullanıcı aracısı algılama kitaplığı kullanın (ör. Node.js'deki ua-parser-js kitaplığı). Bu yaklaşımda yalnızca bir değişiklik yapmanız gerekir ancak kullanıcı aracısı koku alma işlemi, etkilenen tüm kullanıcıları yakalamayabilir.
Dillerde, kitaplıklarda ve çerçevelerde SameSite=None
desteği
Dillerin ve kitaplıkların çoğu, çerezler için SameSite
özelliğini destekler. Ancak SameSite=None
'ün eklenmesi nispeten yakın zamanda olduğu için şimdilik bazı standart davranışlardan kaçınmanız gerekebilir.
Bu davranışlar, SameSite
GitHub'daki örnekler deposunda açıklanmıştır.
Yardım alma
Çerezler web'in her yerinde kullanılır ve özellikle siteler arası kullanım alanlarında, geliştirme ekiplerinin sitelerinin çerezleri nerede ayarlayıp kullandığı hakkında tam bilgiye sahip olması nadirdir. Karşılaştığınız sorun, ilk kez karşılaşılan bir sorun olabilir. Bu nedenle bizimle iletişime geçmekten çekinmeyin:
- GitHub'daki
SameSite
örnekler deposunda sorun bildirin. - StackOverflow'da "samesite" etiketiyle soru sorun.
- Chromium'un davranışıyla ilgili sorunlar için Chromium sorun izleyicisinde hata kaydı oluşturun.
- Chrome'un ilerleme durumunu
SameSite
güncellemeleri sayfasında takip edebilirsiniz.