کوکی HTTP (یا HTTP Cookie یا کوکی وب – کوکی مرورگر وب) قطعه های کوچکی از داده ها هستند که توسط وب سرور به مرورگر وب فرستاده می شوند و مرورگر وب آنها را درون خود ذخیره می کند تا در زمانی دیگر و در پاسخ به درخواست وب سرور، این کوکی ها مجدد از مرورگر وب به وب سرور فرستاده شوند. شکل زیر روند (مکانیزم) به کار گیری و کاربرد کوکی ها را برنامه نویسی وب (مانند ایجاد سایت ها) را نشان می دهد.

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

در برنامه نویسی وب و شبکه کوکی ها نقش مهمی را دارند. به طور نمونه از آنها می توانیم برای نگهداری داده های یک جلسه (Session) استفاده کنیم ولی این کار پیش نهاد نمی شود زیرا کوکی ها (Cookies) نسبت به جلسه ها (Sessions) امنیت کمتری دارند. توجه کنید که از کوکی ها برای نگهداریهر داده ای استفاده می شود که نیاز داریم آن را در درخواست بعدی یادآوری (Remember) کنیم. از کوکی ها می توانیم برای نگهداری داده ها و تنظیمات شخصی سازی استفاده کنیم. به طور مثال سایت به شما اجازه می دهد تا رنگ متفاوتی را برای غالب سایت نگهداری کنید به طوری که در بازدید بعدی همان رنگی که شما انتخاب کرده بودید نمایش داده شود، پس لازم است تا رنگ درون یک کوکی در مرورگر وب شما نگهداری شود تا در درخواست بعدی از همان مرورگر به وب سرور (سایت) فرستاده شود.

ایجاد کوکی ها در پی اچ پی

برای ایجاد کوکی ها باید تابعی به نام ()setcookie را همراه با ورودی های لازم استفاده کنیم. پارامتر اول، (cookie_name) تابع ()setcookie نامی است که می خواهیم برای کوکی تعیین کنیم. پارامتر دوم (cookie_value)، مقداری (داده ای) است که می خواهیم برای کوکی تنظیم کنیم. در واقع از طریق نام کوکی به مقدار آن می توانیم دسترسی داشته باشیم و همچنین مقدار کوکی قاعدتا باید درون کلاینت و به عبارت بهتر درون مرورگر مانند کروم یا فایرفاکس ذخیره می شود.

همانطور که در مطلب آرایه ها در پی اچ پی –آرایه های سراسری گفتیم، آرایه سراسری COOKIE_$ به تمامی کوکی ها دسترسی دارد و برای دسترسی به مقدار یک کوکی، باید همانند کد زیر از نام کوکی به عنوان کلید آرایه انجمنی COOKIE_$ استفاده کنیم.

پارامتر سوم (expire_date)، تاریخ انقضا و از میان رفتن کوکی را نشان می دهد. به طور مثال می خواهیم هفت روز پس از ایجاد کوکی، کوکی درون کلاینت غیر فعال شده و مقدار آن برابر با عدد 0 می شود. فرمت این پارامتر بر اساس مهر زمانی یونیکس (Unix Timesstamp) است. برای تنظیم آن می توانید از تابعی به نام ()time همراه با مدت زمان پیش از اینکه کوکی غیر فعال شود، استفاده کنید. به طور مثال اگر می خواهید کوکی از امروز و پس از گذشت ۳۰ روز (یک ماه) غیر فعال شود، می توانید از الگوی زیر استفاده کنید. در واقع ۳۰ روز برابر با ۲۵۹۲۰۰۰ ثانیه است.

تابع ()time مهر زمانی کنونی (Current) یونیکس را برگشت می دهد که در واقع زمان کنونی یا هم اکنون را برگشت می دهد. سپس آنرا با ۲۵۹۲۰۰۰ ثانیه جمع کرده تا زمان برای ۳۰ روز آینده تعیین شود. همچنین منظور از مهر زمانی یونیکس یا Unix Timestamp ثانیه های گذشته از تاریخ اول ژانویه ۱۹۷۰ تا هم اکنون است، یعنی این لحظه بر حسب ثانیه های گذشته از ابتدای ژانویه سال ۱۹۷۰ محاسبه می شود. حال اگر ثانیه های این لحظه را با عدد ۲۵۹۲۰۰ جمع کنیم، منظورمان ثانیه هایی در ۳۰ روز آینده است.

پارامتر چهارم (path) : مسیری (دایرکتوری) را تعیین می کند که کوکی درون آن قابل دسترسی است. اگر می خواهید کوکی در تمامی سرور قابل دسترسی باشد، پس باید پارامتر چهارم یا مسیر را برابر با کاراکتر / قرار دهید. بنابراین اگر پارامتر چهارم برابر با PDO/ باشد، پس کوکی تنها درون این دایرکتوری و زیر دایرکتوری های آن قابل دسترس است. همچنین اگر پارامتر چهارم تعیین نشود، پس کوکی برابر با دایرکتوری جاری خواهد بود.

پارامتر ششم (secure)، تعیین می کند که آیا کوکی باید از طریق یک انتقال امن HTTPS از کلاینت به سرور فرستاده شود. اگر مقدار این پارامتر برابر TRUE باشد، پس کوکی تنها زمانی تنظیم و ایجاد می شود که تنها کانال امن HTTPS وجود داشته باشد. پارامتر هفتم (httponly) تعیین می کند که آیا کوکی باید تنها از طریق پروتکل HTTP انتقال داده شود.

در کد زیر می خواهیم کوکی به نام mycookie تعریف کنیم که مقدار آن برابر با مقدار درون متغیر cookie_value$ است. همچنین می خواهیم کوکی پس از ۱ ساعت یا ۳۶۰۰ ثانیه غیر فعال شود. پارامتر سوم نیز مسیر ریشه یا دایرکتوری / تعیین شده است. در میان تمامی پارامترهای تابع ()setcookie تنها پارامتر اول، یعنی نام cookie الزامی است و بقیه اختیاری هستند. شکل زیر اجرای کد زیر را نشان می دهد که درون کروم یک کوکی برای دامنه localhost ایجاد شده است. توجه کنید که مسیر کوکی درون دایرکتوری ریشه است و همچنین زمان انقضا کوکی یک ساعت پس از ایجاد شدن آن است.

مرور کوکی ها و تابع ()isset

فرض کنید تابع ()setcookie در فایلی به نام php_cookie.php اجرا شود، پس زمانی که کلاینت (مرورگر وب) این صفحه را درخواست کند، ابتدا کوکی و مقدار آن به کلاینت فرستاده و درون کلاینت (مرورگر وب) ذخیره می شود و سپس و در درخواست بعدی به سرور، کوکی از سمت کلاینت به سرور فرستاده می شود. در کدهای زیر می خواهیم بررسی کنیم که آیا کوکی مورد نظر ما وجود دارد یا نه؟ در پی اچ پی برای اینکه بررسی کنیم آیا متغیری ایجاد شده یا نه باید از تابع ()isset استفاده کنیم

تابع ()isset نام یک متغیر را می گیرد و سپس اگر متغیر یا آرایه وجود داشته باشند، مقدار TRUE برگشت می دهد. توجه کنید منظور از بررسی وجود یک متغیر این است که بررسی می کند آیا متغیر پیش از این اعلان و تعریف شده باشد ولی بررسی نمی کند که آیا متغیر دارای مقدار است یا نه. در کدهای زیر که تکمیل شده کد بالا است، بررسی می کند که آیا درون آرایه انجمنی COOKIE_$ کلید mycookie وجود دارد، سپس مقدار آنرا نشان می دهد و اگر این کلید وجود نداشته باشد، رشته Welcome Guset نشان داده می شود.

باز تاکید می کنیم زمانی در نخستین درخواست از مرورگر، کوکی ایجاد و سپس به کلاینت فرستاده می شود، پس اگر فایلی که شامل کدهای بالا است را برای بار نخست اجرا کنید، پس کوکی ایجاد و فرستاده می شود ولی پیغام Welcome Guest نشان داده می شود چون برای بار اول بود که درخواست از کلاینت به سرور رفته است ولی اگر همین صفحه را Refresh کنید یا اینکه صفحه را بسته و دوباره باز کنید، پیغام Hello my name is amirnami نشان داده می شود، چون این درخواست دوم به بعد است و حال اسکریپت پی اچ پی می تواند با بررسی وجود کلید mycookie، می تواند محتوای کوکی را خوانده و سپس پیغام Hello my name is amirnami را نمایش دهد. در ادامه چندین نکته مهم در مورد کوکی ها را فهرست کرده ایم:

۱ – حتما و حتما درون اسکریپتی که کوکی را ایجاد و تنظیم می کنید، متد ()setcookie را پیش از هر دستور چاپ و نمایش خروجی فراخوانی کنید. به عبارت دیگر پس از تگ php?> می توانید تابع ()setcookie را فراخوانی و مقداردهی کنید.

۲ – چون متغیر COOKIE_$ به صورت سراسری است، پس می توانید محتوای آنرا و بررسی اینکه آیا کلیدی تنظیم شده است یا نه را در هر اسکریپتی انجام دهید.

۳ – زمانی که کلاینت برای بار نخست به سرور درخواست می فرستد، پس کوکی ایجاد و به کلاینت فرستاده می شود. بنابراین در درخواست های بعدی، کلاینت کوکی را به صورت خودکار به سرور خواهد فرستاد.

۴ – همانطور که در شکل بالا می بینید، کوکی ها را می توان از طریق مرورگر بخوانیم، پس به هیچ عنوان داده های مهم را در غالب کوکی به کلاینت نفرستید.

کوکی با زمان انقضا نامحدود و غیرفعال کردن کوکی ها