آنچه در این مقاله میخوانید
زمانی که یک وبسایت در مرورگر باز میشود، برخی از منابع وبسایت، مانند تصاویر و دادهها در مکانی به نام کش مرورگر (Browser Cache) ذخیره میشوند. این ذخیرهسازی برای آن است که وقتی کاربر دوباره از همان وبسایت بازدید میکند، به جای بارگیری مجدد این منابع از سرور اصلی (که زمان بیشتری طول میکشد)، به صورت محلی از کش مرورگر بارگیری شوند. برای تعیین اینکه کدام منابع برای چه مدت زمانی در کش مرورگر ذخیره شوند، از معیار Cache-Control استفاده میشود.
Cache-Control (کنترل کش) که در هدر HTTP تعریف میشود، رفتار کش را تعیین میکند؛ این معیار مشخص میکند که مرورگر برای نشان دادن وبسایت به کاربر، منابع مورد نیاز را از کش محلی خود بارگیری کند یا اینکه باید درخواست دریافت منابع را به سرور اصلی ارسال کند.
برای درک بهتر Cache-Control و نحوه عملکرد آن، ابتدا کش مرورگر (browser caching) و هدرهای HTTP را توضیح میدهیم. سپس، پارامترهای Cache-Control و کاربردهای هر یک از آنها را بررسی میکنیم.
جهت آشنایی بیشتر با مفهوم کش به مقاله “Cache (حافظه کش) چیست و چگونه کار میکند؟” مراجعه کنید.
کش مرورگر چیست؟
همانطور که قبلا اشاره شد، کش مرورگر زمانی انجام میشود که مرورگر منابع وبسایت را ذخیره میکند تا مجبور نباشد دفعه بعد دوباره آنها را از سرور اصلی دانلود کند. مثلا، اگر تصویر پسزمینه یک وبسایت در کش مرورگر ذخیره شده باشد، زمانی که کاربر برای بار دوم از آن وبسایت بازدید میکند، این تصویر از کش مرورگر بارگیری شده و خیلی سریع به کاربر نشان داده میشود.
مرورگرها این منابع را فقط برای یک دوره زمانی محدود که با Time To Live (TTL) مشخص میشود، ذخیره میکنند. اگر TTL منقضی شود، مرورگر باید دوباره به سرور متصل شده و یک نسخه جدید از منبع را دانلود کند. مرورگرها و سرورهای وب چگونه TTL را برای هر منبع تشخیص میدهند؟ اینجاست که هدرهای HTTP وارد عمل میشوند.
هدرهای HTTP
پروتکل انتقال ابرمتن (Hypertext Transfer Protocol – HTTP) فرایندی را در برقراری ارتباطات شبکه جهانی وب (World Wide Web) تشریح میکند، که شامل رد و بدل کردن درخواستها بین کلاینتها و سرورها است. این درخواست و پاسخهای HTTP هر کدام با یک سری جفت کلید-مقدار به نام «هدر» مهر میشوند.
این هدرها حاوی اطلاعات مهمی در مورد هر یک از ارتباطات هستند. به عنوان مثال، هدر درخواست معمولا شامل موارد زیر است:
- اطلاعات در مورد چه منبعی درخواست شده است.
- کاربر از کدام مرورگر استفاده میکند.
- کاربر چه نوع فرمت داده را میپذیرد.
و هدر پاسخ شامل موارد زیر است:
- درخواست با موفقیت انجام شده است یا خیر.
- زبان و قالب هر منبع در بدنه پاسخ چه هستند.
هدر کنترل کش میتواند هم در درخواستها و هم در پاسخهای HTTP ظاهر شود.
در هدر Control-Cache چه معیارهایی وجود دارد؟
هدرها از چند جفت “کلید-مقدار” تشکیل شدهاند که با دو نقطه (:) از هم جدا میشوند. “کلید” یا قسمت سمت چپ دو نقطه، همیشه “cache-control” است و در سمت راست دو نقطه “مقدار” نوشته میشود که میتواند یک یا چند تا مقدار باشد.
این مقادیر تعیین میکنند که چه کسی میتواند منبع یا محتوا را در حافظه کش ذخیره کند و تا چه مدت زمانی میتواند آن منابع را قبل از به روز رسانی مجدد در حافظه کش نگه دارد.
در زیر به برخی از رایجترین مقادیر cache-control اشاره میکنیم:
cache-control: private
این دستورالعمل بیان کننده این است که محتوا فقط توسط کاربر (کلاینت) میتواند کش شود و توسط عوامل واسط مانند CDN یا پروکسی قابل کش کردن نیست. این دستور اغلب برای محتواهای خصوصی که شامل دادههای محرمانه هستند به کار برده میشود. مانند وبسایتی که اطلاعات شخصی کاربر را نمایش میدهد.
cache-control: public
دستورالعمل “public” به این معنی است که محتوا میتواند توسط هر نوع کشی ذخیره شود.
cache-control: no-store
این دستورالعمل نشان میدهد که محتوا تحت هیچ شرایطی توسط هیچ نوع عاملی (کاربر، CDN و…) کش نمیشود. این بدان معنی است که هر بار کاربر درخواست دریافت این محتوا را میکند، درخواست او باید برای دریافت محتوا به سرور اصلی ارسال شود. این دستورالعمل معمولا برای منابعی محفوظ است که حاوی دادههای بسیار حساس هستند، مانند اطلاعات حساب بانکی.
cache-control: no-cache
با استفاده از این دستور، نمیتوان از نسخههای کش شدهی محتوای درخواستی، بدون بررسی اولیه برای مشاهده نسخه بهروزرسانیشده آنها استفاده کرد. این کار معمولا با استفاده از ETag انجام میشود.
ETag یکی دیگر از هدرهای HTTP است که دارای نشانه منحصر به فردی برای مشخص کردن نسخه محتوا در زمان درخواست آن است. هر زمان که محتوا به روز شود، این نشانه در سرور مبدأ تغییر میکند.
هنگامی که کاربر به صفحهای با مقدار «no-cache» باز میگردد، مرورگر باید به سرور مبدأ متصل شود و ETag محتوای ذخیره شده در سرور را با نمونه کش شده مقایسه کند. اگر ETagها یکسان باشند، محتوای کش شده در حافظه پنهان در اختیار کاربر قرار میگیرد. در غیر این صورت، به این معنی است که محتوا به روز شده است و مرورگر باید نسخه جدید را دانلود کند تا در اختیار کاربر قرار دهد. این فرآیند تضمین میکند که کاربر همیشه به روزترین نسخه محتوا را دریافت میکند.
cache-control: max-age
این دستور مشخص میکند که محتوای کش شده تا چه مدت زمان (برحسب ثانیه) در حافظه پنهان ذخیره بماند. به عنوان مثال، اگر max-age روی 1800 تنظیم شود، یعنی محتوا به مدت 1800 ثانیه (30 دقیقه) به صورت نسخه کش شده به کاربر تحویل میشود. اگر کاربر پس از انقضای 30 دقیقه دوباره محتوا را درخواست کند، مرورگر باید نسخه جدید را از سرور اصلی درخواست کند.
دستورالعمل ‘s-maxage’ به طور خاص برای کشهای مشترک مانند CDNها تعریف میشود، که تعیین کننده مدت زمان نگهداری از محتوا در حافظه پنهان خود هستند. این دستورالعمل، دستور “max-age” را برای کلاینتهای فردی لغو میکند.
چرا cache-control مهم است؟
کش مرورگر یک راه حل بسیار خوب برای حفظ محتوا و بهبود تجربه کاربری در اینترنت است، اما بدون تعریف معیار cache-control بی فایده خواهد بود؛ زیرا در این صورت منابع وبسایت بدون در نظر گرفتن ماهیت محتوا کش میشوند، مثلا اطلاعات حساس همانند اطلاعات عمومی در حافظه پنهان ذخیره میشوند و محتوایی که قرار است به طور مکرر به روز شود همانند محتوایی که به ندرت تغییر میکند، ذخیره خواهد شد.
Cache-Control با برطرف نمودن این مشکلات، باعث کارآمدی کش مرورگر میشود و به توسعهدهندگان اجازه میدهد نحوه ذخیرهسازی هر محتوا را مشخص کنند. همچنین، این معیار به واسطههایی مانند CDN اجازه میدهد تا Caching را به بهترین شکل ممکن اجرا کنند؛ و این مسئله مشخص میکند که چرا وبسایتهایی که از CDN، مانند CDN اَبر دِراک، استفاده میکنند، نسبت به وبسایتهایی که این کار را نمیکنند، عملکرد بسیار بهتری دارند.
منابع:
https://www.cloudflare.com/learning/cdn/glossary/what-is-cache-control/