دستور العمل های کوکی SameSite

کروم ، فایرفاکس ، اج و سایرین رفتار پیش‌فرض خود را مطابق با پیشنهاد IETF، کوکی‌های بهبود تدریجی تغییر می‌دهند تا:

  • کوکی‌های بدون ویژگی SameSite به عنوان SameSite=Lax تلقی می‌شوند، به این معنی که رفتار پیش‌فرض محدود کردن کوکی‌ها به زمینه‌های شخص اول است .
  • کوکی ها برای استفاده بین سایتی باید SameSite=None; Secure برای فعال کردن گنجاندن در زمینه شخص ثالث.

این ویژگی رفتار پیش‌فرض از Chrome 84 stable به بعد است. اگر قبلاً این کار را نکرده‌اید، باید ویژگی‌های کوکی‌های شخص ثالث خود را به‌روزرسانی کنید تا در آینده مسدود نشوند.

پشتیبانی از مرورگرهای متقابل

بخش سازگاری مرورگر صفحه Set-Cookie MDN را ببینید.

از کیس ها برای کوکی های بین سایتی یا شخص ثالث استفاده کنید

تعدادی از موارد استفاده رایج و الگوها وجود دارد که در آنها کوکی ها باید در زمینه شخص ثالث ارسال شوند. اگر یکی از این موارد استفاده را ارائه می‌دهید یا به آن وابسته هستید، مطمئن شوید که شما یا ارائه‌دهنده کوکی‌های خود را به‌روزرسانی می‌کنید تا اطمینان حاصل شود که سرویس به درستی کار می‌کند.

محتوای درون یک <iframe>

محتوای یک سایت دیگر که در <iframe> نمایش داده می شود در زمینه شخص ثالث است. موارد استفاده استاندارد در اینجا عبارتند از:

  • محتوای جاسازی شده به اشتراک گذاشته شده از سایت های دیگر، مانند ویدیوها، نقشه ها، نمونه کدها و پست های اجتماعی.
  • ویجت‌های خدمات خارجی مانند پرداخت‌ها، تقویم‌ها، رزرو و قابلیت رزرو.
  • ویجت‌هایی مانند دکمه‌های اجتماعی یا سرویس‌های ضد کلاهبرداری که <iframes> کمتر واضحی را ایجاد می‌کنند.

کوکی‌ها ممکن است در اینجا برای حفظ وضعیت جلسه، ذخیره تنظیمات برگزیده عمومی، فعال کردن آمار یا شخصی‌سازی محتوا برای کاربران با حساب‌های موجود در اینجا استفاده شوند.

نمودار یک پنجره مرورگر که در آن URL محتوای جاسازی شده با URL صفحه مطابقت ندارد.
اگر محتوای تعبیه‌شده از همان سایتی که زمینه مرور سطح بالایی دارد نمی‌آید، محتوای شخص ثالث است.

علاوه بر این، از آنجایی که وب ذاتاً قابل ترکیب است، <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 مستند شده اند.

کمک گرفتن

کوکی‌ها در همه جا وجود دارند و به ندرت پیش می‌آید که هر سایتی مکان تنظیم و استفاده آنها را به طور کامل بررسی کرده باشد، به خصوص زمانی که موارد استفاده متقابل سایت را در ترکیب قرار دهید. هنگامی که با مشکلی روبرو می شوید، ممکن است اولین بار باشد که کسی با آن مواجه می شود - بنابراین در تماس با آن درنگ نکنید: