• 1397/10/12

استفاده از token به جای cookie :

سلام استاد خسته نباشید آیا پیادهسازی با token هم آموزش میدهید ؟

بنظر من دیگه cookie  کم کم محو میشه چون وب معمولا همراه تکنولوژی های دیگر به غیر از وب  مانند اپ mobile   یا angular  میاید  که آنها باید از token  استفاده کنند.حتی SignalR هم خودش گفته باید از token به جای cookie  استفاده بشود

  • 1397/10/12
  • ساعت 13:46

سلام دوست من 😉،

"بنظر من دیگه cookie کم کم محو میشه چون وب ..." این جمله درست نیستش چون کوکی ها جزئی از ساختار Http هستند و برنامه های تحت وبی که میخواهند یک سیستم احراز هویت معمولی داشته باشند مناسب هست و نیازی به پیاده سازی احراز هویت از طریق توکن نیست. صرفا دورن کوکی هم یک توکن وجود دارد یک سری اطلاعات از کاربر را رمز نگاری کرده و درون خود قرار می دهد و دقیقا همان اطلاعات با یک فرمت دیگر دورن سیستم های احراز هویت دیگه ماننده JWT قرار دارد. 

یک سوال از خودمان بپرسیم، چرا از کوکی استفاده میکنیم؟ 

اگر یک نگاه به این تعریف از HTTP Cookie که در سایت MDN که یکی از مراجع مستندات وب می باشد نگاه بی اندازیم نوشته است:

An HTTP cookie (web cookie, browser cookie) is a small piece of data that a server sends to the user's web browser

 

 

در اینجا مطرح شده است که مقداری از داده ها که به (مرورگر) کاربران ارسال میشود. پس تا این اینجا ذهنیت ما بر این مبنا قرار میگیرد که کوکی بیشتر مربوط به مرورگر هاست. 

یکی کوکی چگونه تنظیم یا بهتر است بگویم تنظیم میشود؟

کوکی توسط یک HTTP Header به نام Set-Cookie تنظیم میشود و این Header تنها مختص با یک Response هست و یک Request نمیتواند از آن استفاده کنید. 

Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly

هر کوکی شما خصوصیاتی از جمله دامنه، زمان منقضی شدن، اسم کوکی و مقدار کوکی می باشد و هنگام تنظیم کردن به آن ها نیاز دارید.

به عنوان مثال شما وقتی نام کاربری و رمز عبور را ارسال می کنید اگر درست باشد در Response شما این هدر وجود دارد و دقیقا رو مرورگر شما تنطیم می شود و پس از که کوکی تنظیم شد شما در هر درخواست ارسالی به سرور آن را با خود ارسال می کنید که این کار توسط یک Header دیگر به نام Cookie انجام می شود. 

Cookie: <cookie-list>
Cookie: name=value
Cookie: name=value; name2=value2; name3=value3

حال یک سوال من از شما میپرسم، آیا کوکی تنها برای احراز هویت طراحی و پیاده سازی شده 😄؟ قطعا خیر شما هر داده ای که نیاز داشته باشید در آن ذخیره می کنید و از آن در درخواست های دیگر استفاده می کنید. به عنوان مثال تنظیمات قالب ، نگه داری تاریخچه جستجو ...، این ها مواردی هستند که به غیر از احراز هویت میشود از کوکی استفاده کرد. پس مقایسه این که بگوییم کوکی ها در برابر توکن ها محو میشوند درست نیست 😉. 

حال مرویم سراغ احراز هویت با توکن ها، باید ببینیم که چه تفاوتی بین این دو وجود دارد.

  • احراز هویت با توکن مختص به مرورگر نیست. 
  • شما با استفاده از توکن محدود هایی که کوکی ها دارن از جمله سایز، متصل بودن به دامنه، محل ذخیره سازی نخواهید داشت.
  • توکن ها رابطه خوبی با حمله های XSS و XSRF دارند.

نحوه ارسال توکن چگونه است؟

توکن ها ماننده کوکی ها از طریق HTTP Header ارسال میشوند ( اگر جایی دیدید که از طریق دیگری ارسال می کنند باید بگویم که صحیح نیست)، یک Header به نام Authorization وجود دارد که تنها در Request استفاده می شود و با این Header سرور به شما اجاز درسترسی به منابع را می دهد.

Authorization: <type> <credentials>

 

در قسمت type نوع احراز هویت مشخص میشود و در قسمت credentials توکن احراز هویت قرار میگیرد، شما در هر درخواست باید آن را ارسال کنید. به عنوان مثال در JWT  به جای type کلمه bearer قرار میگیرد و سپس توکن موردنظر جلوی آن، شما با استفاده از توکن دست باز تری دارید، اما واقعا به آن نیاز دارید؟

همیشه بر اساس نیاز های خود انتخاب کنید، نه این که کدام بهتر است. من دریک برنامه تحت وب معمولی نیازی به از پیاده سازی توکن ها ندارم و با کوکی کار میکنم. در یک web api سرویس گیرنده بنده یک موبایل هست بهتر است از مکانیزم های احراز هویت Token base استفاده کنم. 


  • 1397/10/12
  • ساعت 14:40

ممنون بابت پاسخ کامل


logo-enamadlogo-samandehi