درک کوکی ها

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

کوکی فایل کوچکی است که وب‌سایت‌ها در دستگاه کاربران خود ذخیره می‌کنند، اطلاعاتی که ذخیره می‌کند بین مرورگر و وب‌سایت رفت و آمد می‌کند.

هر کوکی یک جفت کلید-مقدار همراه با تعدادی ویژگی است که زمان و مکان استفاده از کوکی را کنترل می کند. این ویژگی ها برای تنظیم مواردی مانند تاریخ انقضا یا نشان دادن اینکه کوکی باید فقط از طریق HTTPS ارسال شود استفاده می شود. می‌توانید یک کوکی را در یک هدر HTTP یا از طریق رابط جاوا اسکریپت تنظیم کنید.

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

کوکی ها در عمل

فرض کنید وبلاگی دارید که در آن می‌خواهید تبلیغی با عنوان «چه خبر» را برای کاربران خود نمایش دهید. کاربران می‌توانند تبلیغ را رد کنند و پس از مدتی دیگر آن را نخواهند دید. می‌توانید آن اولویت را در یک کوکی ذخیره کنید، آن را روی یک ماه منقضی کنید (2,600,000 ثانیه) و فقط آن را از طریق HTTPS ارسال کنید. آن هدر به شکل زیر خواهد بود:

Set-Cookie: promo_shown=1; Max-Age=2600000; Secure
در یک پاسخ، سه کوکی از یک سرور به مرورگر ارسال می شود
سرورها کوکی ها را با استفاده از هدر Set-Cookie تنظیم می کنند.

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

Cookie: promo_shown=1
سه کوکی در یک درخواست از یک مرورگر به یک سرور ارسال می شود
مرورگر شما کوکی ها را در هدر Cookie ارسال می کند.

همچنین می‌توانید کوکی‌های موجود در آن سایت را در جاوا اسکریپت با استفاده از document.cookie اضافه کنید و بخوانید. تخصیص به document.cookie باعث ایجاد یا لغو یک کوکی با آن کلید می شود. به عنوان مثال، می توانید موارد زیر را در کنسول جاوا اسکریپت مرورگر خود امتحان کنید:

→ document.cookie = "promo_shown=1; Max-Age=2600000; Secure"
← "promo_shown=1; Max-Age=2600000; Secure"

خواندن document.cookie تمام کوکی‌های قابل دسترسی در شرایط کنونی را با هر کوکی با یک نقطه ویرگول از هم جدا می‌کند:

→ document.cookie;
← "promo_shown=1; color_theme=peachpuff; sidebar_loc=left"
دسترسی جاوا اسکریپت به کوکی ها در مرورگر
جاوا اسکریپت می تواند با استفاده از document.cookie به کوکی ها دسترسی داشته باشد.

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

کوکی های شخص اول و شخص ثالث چیست؟

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

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

در ادامه مثال بالا، فرض کنید یکی از پست‌های وبلاگ شما تصویری از یک گربه فوق‌العاده دارد و در /blog/img/amazing-cat.png میزبانی شده است. از آنجایی که این تصویر بسیار شگفت انگیز است، شخص دیگری مستقیماً از آن در سایت خود استفاده می کند. اگر بازدیدکننده‌ای به وبلاگ شما رفته است و کوکی promo_shown دارد، پس از مشاهده amazing-cat.png در سایت شخص دیگر، آن کوکی در آن درخواست برای تصویر ارسال می‌شود . این به خصوص برای هیچ کس مفید نیست زیرا promo_shown برای هیچ چیز در سایت این شخص دیگر استفاده نمی شود، فقط سربار را به درخواست اضافه می کند.

اگر این یک اثر ناخواسته است، چرا می خواهید این کار را انجام دهید؟ این مکانیزم است که به سایت‌ها اجازه می‌دهد تا زمانی که در یک زمینه شخص ثالث استفاده می‌شوند وضعیت خود را حفظ کنند. به عنوان مثال، اگر یک ویدیوی YouTube را در سایت خود جاسازی کنید، بازدیدکنندگان گزینه «تماشا در فرصتی دیگر» را در پخش کننده خواهند دید. اگر بازدیدکننده شما قبلاً وارد YouTube شده باشد، آن جلسه توسط یک کوکی شخص ثالث در پخش کننده تعبیه شده در دسترس قرار می گیرد - به این معنی که دکمه «تماشا در فرصتی دیگر» به جای اینکه از آنها بخواهد وارد سیستم شوند یا به سیستم وارد شوند، فقط ویدیو را یکجا ذخیره می کند. باید آنها را از صفحه خود دور کنید و به YouTube برگردید.

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

یکی از ویژگی های فرهنگی وب این است که به طور پیش فرض باز است. این بخشی از چیزی است که این امکان را برای افراد زیادی فراهم کرده است تا محتوا و برنامه های خود را در آنجا ایجاد کنند. با این حال، این همچنین تعدادی از نگرانی های امنیتی و حفظ حریم خصوصی را به همراه داشته است. حملات جعل درخواست بین سایتی (CSRF) بر این واقعیت متکی است که کوکی ها به هر درخواستی به یک منبع معین متصل می شوند، صرف نظر از اینکه چه کسی درخواست را آغاز می کند. برای مثال، اگر از evil.example بازدید کنید، می‌تواند درخواست‌هایی را به your-blog.example راه‌اندازی کند و مرورگر شما با خوشحالی کوکی‌های مرتبط را پیوست می‌کند. اگر وبلاگ شما مراقب نحوه تأیید این درخواست‌ها نباشد، evil.example می‌تواند اقداماتی مانند حذف پست‌ها یا افزودن محتوای خود را انجام دهد.

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

با تنظیم ویژگی SameSite مناسب می‌توانید به صراحت قصد خود را با یک کوکی بیان کنید.

برای شناسایی کوکی‌های شخص اول و تنظیم ویژگی‌های مناسب، دستور العمل‌های کوکی شخص اول را بررسی کنید.