سلام. تو اولین پستم میخوایم در مورد نشست ها در پروتکل HTTP با هم صحبت کنیم و اینکه بدونیم فرقشون با کوکی ها چیه و پشت صحنه داره چه اتفاقاتی میفته که ما ازش خبر نداریم. پس در ادامه با من همراه باشید.
معمولا ما از کوکی ها برای ذخیره اطلاعات به طور موقت یا غیرموقت در حافظه مرورگر استفاده میکنیم. بیشتر برای ذخیره کوکی از جاوا اسکریپت استفاده میشه و اینکه چطور کار میکنه بماند برای بعد و خواستین خودتون تحقیق کنید. اما بریم ببینیم چه اتفاقاتی داره تو Header های HTTP Request میفته:
سرور:
HTTP/1.1 200 OK
/* ... */
Content-Type: text/html
Set-Cookie: time=16:00:00; Path=/; Version=1
Accept-Ranges: bytes
/* ... */
خب این یه نمونه Header هست که از سایتی که بهش مراجعه کردیم به ما ارسال شده. در Set-cookie مشاهده میکنیم که در متغیر تایم یه ساعتی ذخیره شده که کاری بهش نداریم. اما در دفعه های بعدی موقع رفتن به این سایت، مرورگر این Header رو برای سرور میفرسته:
/* ... */ Cookie: time=16:00:00;
/* ... */
دیدین؟ اینطوری سایت به یاد میاره که چه چیزی ذخیره کرده. البته سرور میتونه مشخص کنه که این کوکی کی حذف بشه، حتی ما هم میتونیم این کوکی هارو حذف کنیم، بهشون دسترسی داشته باشیم یا اصلا کلا اجازه ست کردن کوکی به سرور ها رو ندیم؛ از این ور اگه سایت باگ XSS داشته باشه به راحتی میشه کوکی هارو خوند :) ، پس زیاد گزینه خوبی نیست.
شرایطی رو در نظر بگیرین که میخواین سرورتون یوزرنیم و پسورد کاربرتونو بعد از لاگین کردن و رفتن به صفحات دیگر، بهیاد بیاره و از این ور ما هم نمیخوایم اینارو ذخیره کنیم تو حافظه مرورگر. چاره کار چیه؟ Session ها.
شاید این موقع ها اگه PHP کار باشین از SESSION_$ استفاده میکنین. حالا بیاین ببینیم در عمل چه چیزی اتفاق میفته:
سرور:
HTTP/1.1 200 OK
/* ... */
Content-Type: text/html
Set-Cookie: username=admin&password=admin; HttpOnly
Accept-Ranges: bytes
/* ... */
مرورگر:
/* ... */ Cookie: username=admin&password=admin;
/* ... */
حالا سرور آخر کوکیهاش یه HttpOnly گذاشت. پس از این به بعد، تا زمانی که مرورگر بسته نشده و Http هنوز در جریانه، مرورگر این کوکی رو به صفحات شما میفرسته. میتونین برای امنیت بیشتر اینهارو حتما کریپت کنین تا مشکل امنیتی بوجود نیاد.
تو نود جی اس میتونید نشست هارو اینطوری ست کنید:
http.createServer(function(res, req){
/* ... */
res.writeHead(200, {'Set-Cookie':'u=admin'});
/* ... */
});
و اینطوری بدستش بیارید:
req.headers['Cookie'];
موفق باشید.