تفاوت Strict, Lax, None و No SameSite برای ویژگی SameSite در کوکی

آشنایی با samesiteدر کوکی

ویژگی SameSite Cookie توسط مرورگرها برای تشخیص اینکه آیا یکی کوکی قابل دسترسی هست یا خیر استفاده می شود. Samesite attributی توان مقادیر strict، lax یا none را داشته باشد. حال بیاید ببینیم تفاوت بین این مقادیر چیست؟

خب فرض کنید یک وبسایت داریم با نام «Sadegh-khan.ir» . داخل این وبسایت یک دکمه داریم که زمانیکه کاربر روی آن کلیک می کند (post request)، سرور یه کوکی تنظیم می کنه و اون رو به مرورگر کاربر ارسال می کند. اگر کوکی تنظیم شود، کاربر میتونه یه تصویر رو ببینه.

خب بریم ببینیم چه اتفاقی می افته اگر Samesite برابر باشه با:

۱- Strict

SameSite = strict; secure;

در این مورد، اگر سایت برای کوکی، مشابه با سایتی که در حال حاضر روی مرورگر نشان داده می شود باشد، مروگر کوکی را ارسال می کند. منظور اینه که مرورگر کوکی رو به وبسایت های دیگه ارسال نمی کند. مثلا به «hivajet.com» ارسال نمی کنه و فقط به وبسایت مشابه یعنی «Sadegh-khan.ir» که در فرض ابتدایی مطرح کردیم ارسال می کند.

۲- Lax

SameSite = Lax; secure;

زمانی که Samesite برابر با Lax باشد، کوکی به وبسایت ها متفاوت،top level navigation، ارسال می شود. برای مثال با دنبال کردن یک لینک.

فرض کنید یک تصویر در« Sadegh-khan.ir/img/profile.png» وجود دارد، در این حالت، این تصویر با دنبال کردن لینک از یه سایت دیگه مثل «hivajet.com» قابل نمایش خواهد بود. اما نکته اینجاست که تصویر نمیتونه مستقیما در «hivajet.com» نمایش داده شود.

<img src="https://Sadegh-khan.ir/img/profile.png" />

یه لینک به تصویر باید باشد:

<a href="https://Sadegh-khan.ir/img/profile.png">Look at the key</a>

۳ – None:

SameSite = None;

در این مورد، تصویر « Sadegh-khan.ir/img/profile.png» درون سایت «hivajet.com» میتونه نمایش داده بشه:

<img src="https://Sadegh-khan.ir/img/profile.png" />

در این حالت، زمانی که Samesite برابر با None است، شما می توانید بدون این که در دامنه یکسانی باشید درخواست های get/post از وبسایت داشته باشید.

۴ – نبود Samesite:

اگر samesiteدر کل تنظیم نشده باشد، مرورگرهای پیشرفته با اون طوری رفتار می کنند که انگکار مقدار lax داره. به این معنیست که کوکی در top level navigation ارسال می شود.

امیدوارم تونسته باشم خوب توضیح بدم و کمک حالتون بوده باشه 🙂

باز یه مثال بزنیم برای درک بیشتر lax و None :

وضعیتی که کوکی های Laxمی تونند به صورت cross-sitre ارسال شوند باید دو مورد زیر رو رعایت کنند:

  • request باید یک ناوبری سطح بالا باشد (top-level navigation). می تونید این رو معادل زمانی در نظر بگیرید که URLنشان داده شده در نوار URL تغییر می کند. برای مثال کاربر روی یه لینک کلیک می کنه تا به یه سایت دیگه بره.
  • متد request باید امن باشه (برای مثال GETیا HEAD نه POST)

برای مثال:

۱- بیاید فرض کنید یک کاربر روی سایت a.com هست و روی یه لینک کلیک می کنه تا به سایت b.com بره. این یک درخواست cross-site هست . (cross-site request) . این یک top-level navigation و یک درخواست GET هست، بنابراین کوکی های Lax به سایت b.com ارسال می شوند. اگرچه کوکی های strict ارسال نمی شوند چرا که این یک درخواست cross-site هست.

۲- کاربر روی سایت a.com هست و اونجا یک iframe وجود داره که روی اون سایت b.com باگذاری میشه. این یکی درخواست cross-site هست ولی top-level navigation نیست (کاربر همچنان روی سایت a.com هست، زمانی که iframeلود میشه نوار URL تغییری نمی کند.) بنابراین نه کوکی های Lax و نه Strict به سایت-b.com ارسال نمی شوند.

۳ – کاربر در سایت a.com است که فرمی را به سایت b.com ارسال می کند. این یک درخواست بین سایتی (cross-site request) است، اما روش (POST) ناامن است. این معیارهای کوکی‌های Lax در قرارگرفتن در cross-site را برآورده نمی‌کند ، بنابراین نه کوکی‌های Lax و نه Strict به سایت b.com ارسال نمی‌شوند.

یه تصویر خفن دیگه (یه تصویر که هزارن حرف داره واسه خودش):

منابع: مرجع۱ ،