JWT یا JSON Web Token چیست ؟؟

JSON Web Token
JSON Web Token

سلام به همه برنامه نویسا یا آدمای اهل فن که اومدن تا این مطلب رو بخونن (یکم خوشآمدگوییم یطوری شد)

توی این مقاله یا پست یا هرچیزه دیگه، میخوایم راجع به JSON Web Token یا به اختصار JWT صحبت کنیم.

خب برای شروع بهتره یکم به عقب تر برگردیم.

برای اینکه بتونیم از JWT حرف بزنیم بیاید ببینیم کلا سیستم احراز هوییت چطوری کار میکنه و اصلا چی هست (و طبیعتا این بخشو زود جمعش میکنیم تا از بحث اصلی دور نشیم)

What is Authentication??

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

What is Authorization??

یکم اسماشون شبیه همن. به اولی احراز هویت میگن و به دومی ،(authorization) سطح دسترسی میگن.

برگردیم به همون مثال بالا:

خب تا اینحای کار مردم دو دسته اند: کسایی که کارت ورود به شرکت رو دارند و کسایی که اون کارت رو ندارن.

ولی داستان احراز هوییت به اینجا ختم نمیشه؛ توی همون اداره، اجازه افراد برای ورود به اتاق های شرکت فرق میکنه، مثلا مسئول بخش حسابداری اجازه ورود به اتاق جلسات بخش فنی رو نداره،‌ یعنی این که اون کارته که زده و وارد شرکت شده رو وقتی میزنه که بره تو اتاق جلسات با پیغام " unauthorized " مواجه میشه ولی خب مدیرکل شرکت اجازه دسترسی به همه بخش های شرکت رو داره و حتی میتونه دسترسی بقیه افراد رو هم تغییر بده. ( و اگر باز هم این مفهوم رو خوب متوجه نشدین بهتره گوگلش کنید.)

خب حالا میتونیم راجع به سیستم های احراز هوییت حرف بزنیم؛ سیستم های احراز هوییت چند دسته اند:

  1. Cookie Based Authentication
  2. Session Cookie Based Authentication
  3. Token Based Authentication

روش اولی به خاطر ماجرای دزدیده شدن کوکی ها و استفاده آنها به راحتی توسط دزد منسوخ شده.

ولی روش دوم و سوم چه فرقی دارن و کدوم بهتره؟؟؟

معمولا برنامه نویسای تازه کار یا به قولی نووب ها دومی رو پیشنهاد میدن چون فکر میکنن جدید تره ولی خب سخت در اشتباهن.

ما باید تکنولوژی هامونو خوب بشناسیم و توی جای درست ازشون استفاده کنیم پس یه توضیح ریزی راجع به سیستم Session Cookie میدم.

توی این سیستم صفحه ها از سمت سرور به صورت رندر شده میان و مرورگر هم اوناره نشون میده.

و صورت کلی درخواست به صورت یک درخواست رندر یک صفحه به صورت استاتیک برای یک یوزر خاص هستش و نهایی برای داینامیک کردنش میان چندتا از درخواستارو با AJAX هندل میکنن تا خیلی هم استاتیک نباشه.

معمولا بعد از وارد کردن یوزر و پسورد توسط کاربر، سرور یک رشته طولانی رو به کاربر میده تا در صفحه اش نگه دارد که کوکی می نامیمش و یک رشته دیگر نیز سمت خودش تحت عنوان Session نگه میداره تا اونو توی دیتابیس بریزه و بدونه این کوکی متعلق به کدوم یوزر هستش. و در هر درخواست به صورت خودکار مرورگر اون کوکی رو به سرور میده تا سرور بهش اجازه مرور کردن صفحات بعدی را داشته باشه و البته سرور بدونه که درخواست کدوم یوزر رو داره برسی میکنه.

حالا میرسیم به جای خوب:

JSON Web Token چیه حالا

JSON Web Token یا JWT (که البته تو خونه توکن هم صداش میکنن)

توی دسته بندی بالا جزو توکن هاست و از اسمش معلومه که توی قوانین JSON فعالییت میکنه و در آخر به اسم وب میرسیم.

حالا توکن چیه؟

توکن یه رشته طولانی ولی مرتبه دار هستش که در اکثر مواقع کارکتر های تشکیل دهنده اون معنی دار هم هستن و مثلا آیدی یوزر داخل هست (البته داخل کوکی هم میشه اینو گذاشتش)

ولی JWT دقیقا چیه؟

JWT یه رشته طولانی هستش ولی این رشته از سه بخش تولید شده که با کارکتر نقطه به هم وصل میشن و یک رشته طولانی رو تشکیل میده که الان اجزاش میریزیم بیرون

۱. Header:

هدر وظیفه نگهداری الگوریتم هش رو به عهده میگیره. و همچنین اطلاعاتی راجع به زمان انهدام توکن.

۲.PayLoad:

که وظیفه این بخش، ذخیره اطلاعاتیه که ما موقع ساختنش میخوایم توکن مون داشته باشه مثل آیدی یا شماره موبایل یوزر (حواست باشه پسوردشو حتی هش شده نریزی تو توکن ش)

و بخش هیجان انگیز توکن

۳. Signature:

این بخش، هش شده PayLoad با الگوریتمیه که ما تو هدر ذخیره کردیم و البته با Secret ای که توی کدمون استفاده شده.

بهتر بخوایم بگیم موقع ساین کردن، ما میایم الگوریتم و تاریخ انقضا رو از تو هدر میخونیم و اطلاعات PayLoad رو باهاش با SecretKey هش میکنیم و با نقطه میچسبونیم به بقیه توکن.


ساختار JWT
ساختار JWT


چندتا نکته مهم:

  1. توکن تاریخ انقضا داره،‌یعنی بعد از یه مدتی که توی ساین کردنش وارد کردین، میمیره و دیگه نمیتونه شماره از نگهبانان سرسخت سرور عبور بدن
  2. PayLoad رو همه میتونن بخونن؛ اگرچه به صورت یه رشته نا خوانا دیده میشه ولی تابعی نوشت که بتونه ای اطلاعات رو بخونه( برای همین گفتم توش پسورد نریزین )
  3. حتی هدر هم قابل خوندنه
  4. حواستون باشه که برای احراز هوییت با توکن،‌ نیازی نیست که توکن ها در دیتابیس ذخیره و در هر درخواست از دیتا بیس چک بشن، فقط کافیه الگوریتم با اون SecretKey که در سرور هست مطابقت داشته باشه.

خب میدونم الان یکم گنگ شدین، پس با یه مثال یکم بهتر این JWT رو توضیح میدم.

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

خب بهتره که بقیه این مقاله یا پست رو به قسمت بعدی منتقل کنیم؛ در پست بعدی به انواع JWT میپردازیم و با یک مفهوم جدید و جذاب روبرو خواهیم بود.

http://vrgl.ir/asb0I

در آخر هم اینو میگم که این اولین پست من در ویرگول بود و جدیدا تصمیم به نوشتن بلاگ کردم؛ پس خوشحال میشم نظرتون رو راجع به این پست همین زیر کامنت کنید.