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

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

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

اگر قبلاً این کار را نکرده‌اید، باید ویژگی‌های کوکی‌های شخص ثالث خود را به‌روزرسانی کنید تا در آینده مسدود نشوند.

Browser Support

  • کروم: ۵۱.
  • لبه: ۱۶.
  • فایرفاکس: ۶۰.
  • سافاری: ۱۳.

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

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

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

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

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

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

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

از آنجا که وب ذاتاً قابل ترکیب است، <iframes> همچنین برای جاسازی محتوای مشاهده شده در یک زمینه سطح بالا یا شخص ثالث استفاده می‌شود. هر کوکی که سایت نمایش داده شده در iframe از آن استفاده می‌کند، کوکی‌های شخص ثالث در نظر گرفته می‌شوند. اگر سایت‌هایی ایجاد می‌کنید که می‌خواهید سایت‌های دیگر آنها را جاسازی کنند و برای عملکرد آنها به کوکی نیاز دارید، باید مطمئن شوید که این کوکی‌ها برای استفاده بین سایتی علامت‌گذاری شده‌اند یا می‌توانید بدون آنها به راحتی به کار خود ادامه دهید.

درخواست‌های «ناامن» در سایت‌های مختلف

«ناامن» ممکن است در اینجا نگران‌کننده به نظر برسد، اما به هر درخواستی اشاره دارد که ممکن است برای تغییر وضعیت در نظر گرفته شده باشد. در وب، این درخواست‌ها عمدتاً درخواست‌های POST هستند. کوکی‌هایی که با SameSite=Lax مشخص شده‌اند، در پیمایش‌های سطح بالای ایمن، مانند کلیک روی یک لینک برای رفتن به سایتی دیگر، ارسال می‌شوند. با این حال، چیزی مانند ارسال <form> به سایتی دیگر با استفاده از POST شامل کوکی‌ها نمی‌شود.

نموداری از یک درخواست که از یک صفحه به صفحه دیگر منتقل می‌شود.
اگر درخواست ورودی از روشی «امن» استفاده کند، صفحه کوکی‌ها را ارسال می‌کند.

این الگو برای سایت‌هایی استفاده می‌شود که می‌توانند کاربر را قبل از بازگشت، برای انجام برخی عملیات، به یک سرویس از راه دور هدایت کنند، به عنوان مثال، هدایت به یک ارائه‌دهنده هویت شخص ثالث. قبل از اینکه کاربر سایت را ترک کند، یک کوکی حاوی یک توکن یکبار مصرف تنظیم می‌شود با این انتظار که این توکن در درخواست برگشتی بررسی شود تا حملات جعل درخواست میان‌سایتی (CSRF) کاهش یابد. اگر آن درخواست برگشتی از طریق POST ارسال شود، باید کوکی‌ها را به صورت SameSite=None; Secure علامت‌گذاری کنید.

منابع از راه دور

هر منبع از راه دور در یک صفحه، مانند تگ‌های <img> یا <script> ، ممکن است به کوکی‌هایی که با درخواست ارسال می‌شوند، متکی باشد. موارد استفاده رایج شامل ردیابی پیکسل‌ها و شخصی‌سازی محتوا است.

این موضوع همچنین در مورد درخواست‌های ارسالی از جاوا اسکریپت شما با استفاده از fetch یا XMLHttpRequest صدق می‌کند. اگر fetch() با گزینه credentials: 'include' فراخوانی شود، این درخواست‌ها احتمالاً شامل کوکی‌ها نیز می‌شوند. برای XMLHttpRequest ، کوکی‌های مورد انتظار معمولاً با مقدار withCredentials به صورت true مشخص می‌شوند. این کوکی‌ها باید به طور مناسب علامت‌گذاری شوند تا در درخواست‌های بین سایتی گنجانده شوند.

محتوای درون یک وب ویو

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

اندروید همچنین به برنامه‌های مختص پلتفرم خود اجازه می‌دهد کوکی‌ها را مستقیماً با استفاده از API CookieManager تنظیم کنند. همانند کوکی‌هایی که با استفاده از هدرها یا جاوا اسکریپت تنظیم می‌شوند، اگر کوکی‌ها برای استفاده بین سایتی در نظر گرفته شده‌اند، در نظر داشته باشید که 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 و رفتار پیش‌فرض به‌روزرسانی هنوز نسبتاً جدید هستند، مرورگرهای مختلف آنها را به روش‌های مختلفی مدیریت می‌کنند. می‌توانید برای فهرستی از مشکلات شناخته‌شده به صفحه به‌روزرسانی‌ها در chrome.org مراجعه کنید، اما این فهرست ممکن است جامع نباشد.

یک راه حل ممکن این است که هر کوکی را هم به سبک جدید و هم به سبک قدیمی تنظیم کنید:

Set-cookie: 3pcookie=value; SameSite=None; Secure
Set-cookie: 3pcookie-legacy=value; Secure

مرورگرهایی که رفتار جدیدتر را پیاده‌سازی می‌کنند، کوکی را با مقدار SameSite تنظیم می‌کنند. مرورگرهایی که رفتار جدید را پیاده‌سازی نمی‌کنند، آن مقدار را نادیده می‌گیرند و کوکی 3pcookie-legacy را تنظیم می‌کنند. هنگام پردازش کوکی‌های اضافه شده، سایت شما ابتدا باید وجود سبک جدید کوکی را بررسی کند و سپس اگر نتواند نوع جدیدی پیدا کند، به کوکی قدیمی بازگردد.

مثال زیر نحوه انجام این کار را در Node.js، با استفاده از چارچوب Express و میان‌افزار cookie-parser آن نشان می‌دهد:

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

پشتیبانی از SameSite=None در زبان‌ها، کتابخانه‌ها و چارچوب‌ها

اکثر زبان‌ها و کتابخانه‌ها از ویژگی SameSite برای کوکی‌ها پشتیبانی می‌کنند. با این حال، از آنجا که اضافه شدن SameSite=None هنوز نسبتاً جدید است، ممکن است لازم باشد فعلاً روی برخی رفتارهای استاندارد کار کنید. این رفتارها در مخزن نمونه‌های SameSite در GitHub مستند شده‌اند.

دریافت کمک

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