درک کوکی ها

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

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

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

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

کوکی‌ها در عمل

فرض کنید وبلاگی دارید که می‌خواهید در آن یک تبلیغ «تازه‌ها» را به کاربران خود نمایش دهید. کاربران می‌توانند تبلیغ را رد کنند و سپس برای مدتی دیگر آن را نبینند. می‌توانید این تنظیمات را در یک کوکی ذخیره کنید، آن را طوری تنظیم کنید که ظرف یک ماه (۲،۶۰۰،۰۰۰ ثانیه) منقضی شود و فقط آن را از طریق 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 برای هیچ چیزی در سایت این شخص دیگر استفاده نمی‌شود، فقط سربار به درخواست اضافه می‌کند.

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

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

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

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

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

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