کروم ، فایرفاکس ، اج و سایرین رفتار پیشفرض خود را مطابق با پیشنهاد IETF، کوکیهای بهبود تدریجی تغییر میدهند تا:
- کوکیهای بدون ویژگی
SameSite
به عنوانSameSite=Lax
تلقی میشوند، به این معنی که رفتار پیشفرض محدود کردن کوکیها به زمینههای شخص اول است . - کوکی ها برای استفاده بین سایتی باید
SameSite=None; Secure
برای فعال کردن گنجاندن در زمینه شخص ثالث.
این ویژگی رفتار پیشفرض از Chrome 84 stable به بعد است. اگر قبلاً این کار را نکردهاید، باید ویژگیهای کوکیهای شخص ثالث خود را بهروزرسانی کنید تا در آینده مسدود نشوند.
پشتیبانی از مرورگرهای متقابل
بخش سازگاری مرورگر صفحه Set-Cookie
MDN را ببینید.
از کیس ها برای کوکی های بین سایتی یا شخص ثالث استفاده کنید
تعدادی از موارد استفاده رایج و الگوها وجود دارد که در آنها کوکی ها باید در زمینه شخص ثالث ارسال شوند. اگر یکی از این موارد استفاده را ارائه میدهید یا به آن وابسته هستید، مطمئن شوید که شما یا ارائهدهنده کوکیهای خود را بهروزرسانی میکنید تا اطمینان حاصل شود که سرویس به درستی کار میکند.
محتوای درون یک <iframe>
محتوای یک سایت دیگر که در <iframe>
نمایش داده می شود در زمینه شخص ثالث است. موارد استفاده استاندارد در اینجا عبارتند از:
- محتوای جاسازی شده به اشتراک گذاشته شده از سایت های دیگر، مانند ویدیوها، نقشه ها، نمونه کدها و پست های اجتماعی.
- ویجتهای خدمات خارجی مانند پرداختها، تقویمها، رزرو و قابلیت رزرو.
- ویجتهایی مانند دکمههای اجتماعی یا سرویسهای ضد کلاهبرداری که
<iframes>
کمتر واضحی را ایجاد میکنند.
کوکیها ممکن است در اینجا برای حفظ وضعیت جلسه، ذخیره تنظیمات برگزیده عمومی، فعال کردن آمار یا شخصیسازی محتوا برای کاربران با حسابهای موجود در اینجا استفاده شوند.
علاوه بر این، از آنجایی که وب ذاتاً قابل ترکیب است، <iframes>
برای جاسازی محتوایی استفاده میشود که در یک زمینه سطح بالا یا شخص اول نیز مشاهده میشود. هر کوکی استفاده شده توسط آن سایت به عنوان کوکی شخص ثالث در نظر گرفته می شود که سایت در قاب نمایش داده شود. اگر سایتهایی ایجاد میکنید که میخواهید به راحتی توسط دیگران جاسازی شوند، در حالی که برای عملکرد به کوکیها نیز تکیه میکنید، باید مطمئن شوید که آنها برای استفاده بینسایتی علامتگذاری شدهاند یا اینکه میتوانید بدون آنها بهراحتی به عقب برگردید.
درخواست های "ناامن" در سراسر سایت ها
در حالی که "ناامن" ممکن است در اینجا کمی نگران کننده به نظر برسد، این به هر درخواستی اشاره دارد که ممکن است برای تغییر حالت باشد. در وب که در درجه اول درخواست های POST هستند. کوکیهایی که بهعنوان SameSite=Lax
علامتگذاری شدهاند در پیمایشهای سطح بالای امن ارسال میشوند، به عنوان مثال روی پیوندی برای رفتن به سایت دیگری کلیک کنید. با این حال چیزی مانند ارسال <form>
از طریق POST به یک سایت دیگر شامل کوکی نمی شود.
این الگو برای سایتهایی استفاده میشود که ممکن است کاربر را به یک سرویس راه دور هدایت کنند تا قبل از بازگشت، عملیاتی را انجام دهند، برای مثال هدایت کردن به یک ارائهدهنده هویت شخص ثالث. قبل از اینکه کاربر سایت را ترک کند، یک کوکی حاوی یک نشانه یکبار مصرف تنظیم میشود با این انتظار که این نشانه در درخواست برگشتی برای کاهش حملات جعل درخواست متقابل (CSRF) بررسی شود. اگر درخواست برگشتی از طریق POST ارائه شود، لازم است کوکی ها را به عنوان SameSite=None; Secure
.
منابع از راه دور
هر منبع راه دور در یک صفحه ممکن است متکی به کوکی هایی باشد که با درخواست ارسال می شوند، از تگ های <img>
، تگ های <script>
و غیره. موارد استفاده رایج شامل ردیابی پیکسل ها و شخصی سازی محتوا است.
این همچنین در مورد درخواستهایی که از جاوا اسکریپت شما توسط fetch
یا XMLHttpRequest
آغاز میشوند، صدق میکند. اگر fetch()
با credentials: 'include'
این نشانه خوبی است که ممکن است در آن درخواست ها کوکی ها مورد انتظار باشد. برای XMLHttpRequest
باید به دنبال نمونه هایی از ویژگی withCredentials
باشید که روی true
تنظیم شده است. این نشانه خوبی است که ممکن است در این درخواست ها کوکی ها مورد انتظار باشد. این کوکی ها باید به طور مناسب علامت گذاری شوند تا در درخواست های بین سایتی گنجانده شوند.
محتوا در یک WebView
یک WebView در یک برنامه مخصوص پلتفرم توسط یک مرورگر پشتیبانی میشود و باید آزمایش کنید که آیا همان محدودیتها یا مشکلات اعمال میشود. در Android، اگر WebView توسط Chrome پشتیبانی میشود، پیشفرضهای جدید فوراً با Chrome 84 اعمال نمیشوند . با این حال، هدف این است که آنها را در آینده اعمال کنید، بنابراین همچنان باید آزمایش کنید و برای این کار آماده شوید. علاوه بر این، Android به برنامههای پلتفرم خاص خود اجازه میدهد تا کوکیها را مستقیماً از طریق CookieManager API تنظیم کنند. مانند کوکیهایی که از طریق هدر یا جاوا اسکریپت تنظیم میشوند، SameSite=None; Secure
اگر برای استفاده در سایت در نظر گرفته شده اند، SameSite=None; Secure
.
نحوه پیاده سازی SameSite
امروز
برای کوکیهایی که فقط در یک زمینه شخص اول مورد نیاز هستند، باید بسته به نیازتان آنها را بهعنوان SameSite=Lax
یا SameSite=Strict
علامتگذاری کنید. همچنین میتوانید کاری انجام ندهید و فقط به مرورگر اجازه دهید پیشفرض خود را اعمال کند، اما این خطر رفتار ناهماهنگ در مرورگرها و هشدارهای کنسول احتمالی برای هر کوکی را به همراه دارد.
Set-Cookie: first_party_var=value; SameSite=Lax
برای کوکیهای مورد نیاز در زمینه شخص ثالث، باید مطمئن شوید که آنها به عنوان SameSite=None; Secure
. توجه داشته باشید که شما به هر دو ویژگی با هم نیاز دارید. اگر فقط None
بدون Secure
مشخص کنید، کوکی رد می شود. هرچند تفاوتهای متقابل ناسازگاری در پیادهسازی مرورگر وجود دارد، بنابراین ممکن است لازم باشد از برخی از استراتژیهای کاهشدهنده شرح دادهشده در مدیریت مشتریان ناسازگار در زیر استفاده کنید.
Set-Cookie: third_party_var=value; SameSite=None; Secure
رسیدگی به مشتریان ناسازگار
از آنجایی که این تغییرات شامل None
و رفتار پیشفرض بهروزرسانی هنوز نسبتاً جدید هستند، در بین مرورگرها در مورد نحوه مدیریت این تغییرات ناسازگاری وجود دارد. میتوانید برای مشکلاتی که در حال حاضر شناخته شدهاند به صفحه بهروزرسانیها در chromium.org مراجعه کنید، اما نمیتوان گفت که آیا این کامل است یا خیر. در حالی که این ایده آل نیست، راه حل هایی وجود دارد که می توانید در این مرحله انتقالی به کار ببرید. اما قاعده کلی این است که با مشتریان ناسازگار به عنوان یک مورد خاص رفتار شود. برای مرورگرهایی که قوانین جدیدتر را اجرا می کنند استثنا ایجاد نکنید.
اولین گزینه تنظیم کوکی های سبک جدید و قدیمی است:
Set-cookie: 3pcookie=value; SameSite=None; Secure
Set-cookie: 3pcookie-legacy=value; Secure
مرورگرهایی که رفتار جدیدتر را پیادهسازی میکنند، کوکی را با مقدار SameSite
تنظیم میکنند، در حالی که سایر مرورگرها ممکن است آن را نادیده بگیرند یا به اشتباه تنظیم کنند. با این حال، همان مرورگرها کوکی 3pcookie-legacy
را تنظیم می کنند. هنگام پردازش کوکیهای شامل، سایت باید ابتدا وجود کوکی سبک جدید را بررسی کند و اگر پیدا نشد، به کوکی قدیمی بازگردد.
مثال زیر نحوه انجام این کار را در Node.js با استفاده از چارچوب Express و میان افزار تجزیه کننده کوکی آن نشان می دهد.
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);
نکته منفی این است که شامل تنظیم کوکیهای اضافی برای پوشش همه مرورگرها است و نیاز به ایجاد تغییرات هم در نقطه تنظیم و هم در خواندن کوکی دارد. با این حال، این رویکرد باید همه مرورگرها را بدون توجه به رفتار آنها پوشش دهد و اطمینان حاصل کند که کوکیهای شخص ثالث مانند گذشته به کار خود ادامه میدهند.
یا در نقطه ارسال هدر Set-Cookie
، می توانید انتخاب کنید که مشتری از طریق رشته عامل کاربر شناسایی شود. به لیست مشتریان ناسازگار مراجعه کنید و سپس از یک کتابخانه مناسب برای پلتفرم خود استفاده کنید، برای مثال کتابخانه ua-parser-js در Node.js. توصیه میشود کتابخانهای برای شناسایی عامل کاربر پیدا کنید، زیرا احتمالاً نمیخواهید خودتان آن عبارات منظم را بنویسید.
مزیت این روش این است که فقط نیاز به یک تغییر در نقطه تنظیم کوکی دارد. با این حال، هشدار لازم در اینجا این است که sniffing عامل کاربر ذاتا شکننده است و ممکن است همه کاربران آسیب دیده را دستگیر نکند.
پشتیبانی از SameSite=None
در زبان ها، کتابخانه ها و چارچوب ها
اکثر زبانها و کتابخانهها از ویژگی SameSite
برای کوکیها پشتیبانی میکنند، با این حال افزودن SameSite=None
هنوز نسبتاً جدید است که به این معنی است که ممکن است در حال حاضر نیاز داشته باشید که برخی از رفتارهای استاندارد را دور بزنید. اینها در مخزن نمونه های SameSite
در GitHub مستند شده اند.
کمک گرفتن
کوکیها در همه جا وجود دارند و به ندرت پیش میآید که هر سایتی مکان تنظیم و استفاده آنها را به طور کامل بررسی کرده باشد، به خصوص زمانی که موارد استفاده متقابل سایت را در ترکیب قرار دهید. هنگامی که با مشکلی روبرو می شوید، ممکن است اولین بار باشد که کسی با آن مواجه می شود - بنابراین در تماس با آن درنگ نکنید:
- مشکلی را در مخزن نمونه
SameSite
در GitHub مطرح کنید. - یک سوال در برچسب "همان سایت" در StackOverflow را وبلاگ کنید.
- برای مشکلات مربوط به رفتار Chromium، از طریق ردیاب مشکل Chromium یک اشکال ایجاد کنید.
- پیشرفت Chrome را در صفحه بهروزرسانیهای
SameSite
دنبال کنید.