توضیح درباره کوکی‌های SameSite

Browser Support

  • Chrome: 51.
  • Edge: 16.
  • Firefox: 60.
  • Safari: 13.

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

معرفی مشخصه SameSite (تعریف‌شده در RFC6265bis) به شما امکان می‌دهد اعلام کنید که کوکی شما به بافت طرف اول یا همان سایت محدود است یا نه. مفید است که دقیقاً بدانید منظور از «سایت» در اینجا چیست. سایت ترکیبی از پسوند دامنه و بخشی از دامنه است که درست قبل‌از آن قرار دارد. برای مثال، دامنه www.web.dev بخشی از سایت web.dev است.

اصطلاح کلیدی: اگر کاربر در www.web.dev باشد و تصویری از static.web.dev درخواست کند، این درخواست همان سایت است.

فهرست پسوند عمومی مشخص می‌کند چه صفحه‌هایی در یک سایت قرار دارند. این موضوع فقط به دامنه‌های سطح بالا مثل .com بستگی ندارد، بلکه می‌تواند شامل سرویس‌هایی مثل github.io نیز باشد. این کار باعث می‌شود your-project.github.io و my-project.github.io به‌عنوان سایت‌های جداگانه محسوب شوند.

اصطلاح کلیدی: اگر کاربر در your-project.github.io باشد و تصویری از my-project.github.io درخواست کند، این یک درخواست بین‌سایتی است.

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

مشخصه SameSite در کوکی سه روش مختلف برای کنترل این رفتار ارائه می‌دهد. می‌توانید انتخاب کنید که مشخصه را مشخص نکنید، یا می‌توانید از Strict یا Lax برای محدود کردن کوکی به درخواست‌های هم‌سایت استفاده کنید.

اگر SameSite را روی Strict تنظیم کنید، کوکی شما فقط در بافت طرف اول ارسال می‌شود؛ یعنی اگر سایت کوکی با سایت نشان‌داده‌شده در نوار نشانی مرورگر مطابقت داشته باشد. بنابراین، اگر کوکی promo_shown به‌صورت زیر تنظیم شده باشد:

Set-Cookie: promo_shown=1; SameSite=Strict

وقتی کاربر در سایت شما است، کوکی طبق انتظار با درخواست ارسال می‌شود. بااین‌حال، اگر کاربر پیوندی را از سایت دیگری به سایت شما دنبال کند، کوکی در آن درخواست اولیه ارسال نمی‌شود. این برای کوکی‌های مربوط به ویژگی‌هایی که همیشه پشت پیمایش اولیه هستند، مانند تغییر گذرواژه یا خرید، خوب است، اما برای کوکی‌هایی مانند promo_shown بسیار محدودکننده است. اگر خواننده شما پیوند را دنبال کند و وارد سایت شود، می‌خواهد کوکی ارسال شود تا اولویت او اعمال شود.

SameSite=Lax به مرورگر اجازه می‌دهد کوکی را با این پیمایش‌های سطح بالا ارسال کند. برای مثال، اگر سایت دیگری به محتوای سایت شما ارجاع دهد، در این مورد بااستفاده از عکس گربه شما و ارائه پیوندی به مقاله شما به‌صورت زیر:

<p>Look at this amazing cat!</p>
<img src="https://blog.example/blog/img/amazing-cat.png" />
<p>Read the <a href="https://blog.example/blog/cat.html">article</a>.</p>

با کوکی تنظیم‌شده روی Lax به‌صورت زیر:

Set-Cookie: promo_shown=1; SameSite=Lax

وقتی مرورگر amazing-cat.png را برای وبلاگ شخص دیگر درخواست می‌کند، سایت شما کوکی را ارسال نمی‌کند. اما وقتی خواننده پیوند به cat.html را در سایت شما دنبال می‌کند، آن درخواست شامل کوکی می‌شود.

توصیه می‌کنیم از SameSite به این روش استفاده کنید، کوکی‌هایی را که بر نمایش وب‌سایت تأثیر می‌گذارند روی Lax تنظیم کنید، و کوکی‌های مربوط به کنش‌های کاربر را روی Strict تنظیم کنید.

همچنین می‌توانید SameSite را روی None تنظیم کنید تا نشان دهید می‌خواهید کوکی در همه زمینه‌ها ارسال شود. اگر سرویسی ارائه می‌دهید که سایت‌های دیگر از آن استفاده می‌کنند، مثل ابزاره‌ها، محتوای جاسازی‌شده، برنامه‌های وابسته، تبلیغات، یا ورود به سیستم در چند سایت، از None استفاده کنید تا مطمئن شوید هدفتان واضح است.

سه کوکی با برچسب‌های None،‏ Lax، یا Strict بسته به بافتار آن‌ها
بافت کوکی را به‌طور صریح به‌عنوان None، Lax، یا Strict علامت‌گذاری کنید.

تغییرات در رفتار پیش‌فرض بدون SameSite

Browser Support

  • Chrome: 80.
  • Edge: 86.
  • Firefox: behind a flag.
  • Safari: not supported.

مشخصه SameSite به‌طور گسترده پشتیبانی می‌شود، اما به‌طور گسترده پذیرفته نشده است. در گذشته، تنظیم کوکی‌ها بدون SameSite به‌طور پیش‌فرض آن‌ها را در همه زمینه‌ها ارسال می‌کرد، که کاربران را دربرابر «جعل درخواست بین‌سایتی» و نشت ناخواسته اطلاعات آسیب‌پذیر می‌کرد. برای تشویق توسعه‌دهندگان به بیان هدفشان و ارائه تجربه‌ای ایمن‌تر به کاربران، پیشنهاد IETF، کوکی‌های بهتر افزایشی دو تغییر کلیدی را مطرح می‌کند:

  • کوکی‌های بدون مشخصه SameSite به‌عنوان SameSite=Lax درنظر گرفته می‌شوند.
  • کوکی‌های دارای SameSite=None باید Secure را نیز مشخص کنند، یعنی به زمینه امن نیاز دارند.

هر دوی این تغییرات با مرورگرهایی که نسخه قبلی مشخصه SameSite را به‌درستی پیاده‌سازی کرده‌اند و همچنین مرورگرهایی که از نسخه‌های قبلی SameSite پشتیبانی نمی‌کنند سازگار با نسخه قدیمی هستند. هدف از این ویژگی‌ها کاهش اتکای توسعه‌دهندگان به رفتار پیش‌فرض مرورگرها ازطریق صریح کردن رفتار کوکی و استفاده موردنظر است. هر کارخواهی که SameSite=None را تشخیص نمی‌دهد باید آن را نادیده بگیرد.

SameSite=Lax به‌طور پیش‌فرض

اگر کوکی را بدون مشخص کردن مشخصه SameSite آن ارسال کنید، مرورگر با آن کوکی طوری رفتار می‌کند که گویی روی SameSite=Lax تنظیم شده است. همچنان توصیه می‌کنیم SameSite=Lax را به‌طور صریح تنظیم کنید تا تجربه کاربری‌تان در مرورگرهای مختلف سازگارتر شود.

‫SameSite=None باید ایمن باشد

وقتی بااستفاده از SameSite=None کوکی‌های بین‌سایتی ایجاد می‌کنید، باید آن‌ها را روی Secure نیز تنظیم کنید تا مرورگر آن‌ها را بپذیرد:

Set-Cookie: widget_session=abc123; SameSite=None; Secure

می‌توانید این رفتار را از Chrome 76 با فعال کردن about://flags/#cookies-without-same-site-must-be-secure، و از Firefox 69 با تنظیم network.cookie.sameSite.noneRequiresSecure در about:config آزمایش کنید.

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

برای جزئیات بیشتر درباره به‌روزرسانی کوکی‌ها برای مدیریت موفقیت‌آمیز این تغییرات در SameSite=None و تفاوت‌های رفتار مرورگر، به مقاله پیگیری دستورالعمل‌های کوکی SameSite مراجعه کنید.

با تشکر فراوان از مشارکت‌ها و بازخوردهای لیلی چن، مالته اوبل، مایک وست، راب دادسون، تام اشتاینر، و ویوک سخار.