Email: me.dev@developit.ir

JWT، مقدمه ای بر JSON Web Tokens

JSON Web Token چیست؟

JSON Web Token یا JWT یک استاندارد فشرده و جامع برای انتقال امن اطلاعات بین چند زبان یا محیط مانند JSON است.

JWT میتواند با استفاده از الگوریتم HMAC یا کلید های عمومی/خصوصی بوسیله ی RSA رمزنگاری شوند.

برخی از مفاهیم JWT به شرح زیر میباشد:

1) فشرده/Compact: از آنجایی که حجم اطلاعات کمتر میشود، JWT میتواند از طریق URL ارسال شود. به عنوان مثال ارسال اطلاعات با استفاده از پارامتر POST یا قرار دادن آنها داخل HTTP header.

کاهش حجم اطلاعات به معنی انتقال سریعتر نیز میباشد.

2) جامع/Self-contained: این بسته شامل تمام اطلاعات مورد نیاز در مورد کاربر و اجتناب از درخواست بیش از یک بار به پایگاه داده است.

چرا باید از JSON Web Tokens استفاده کنیم؟

1) احراز هویت: به طور معمول برای استفاده ازJWT  هنگام ورود کاربر به سیستم این کار انجام میشود. احراز هویت به کاربر اجازه ارسال درخواست، دسترسی به خدمات و منابع را میدهد. احراز هویت تنها یک ویژگی است که به طور گسترده در JWT استفاده میشود زیرا سربار کمی دارد و میتوان از آن به آسانی در حوزه های مختلف بهره برد.

2) تبادل اطلاعات: JWT یک روش بسیار خوب برای انتقال امن اطلاعات بین محیط های مختلف است زیرا به عنوان مثال با استفاده از کلیدهای عمومی و خصوصی رمزنگاری شده و دارای امضای دیجیتال میباشد در نتیجه شما میتوانید مطمئن باشید چه کسی اطلاعات را برای شما ارسال میکند. علاوه بر این میتوانید بررسی کنید محتوای ارسال شده دستکاری نشده باشد.

ساختار JSON Web Token چگونه است؟

JWT شامل سه قسمت میباشد که به وسیله ی نقطه ( . ) از هم جدا شده اند:

  • Header
  • Payload
  • Signature

در نتیجه JWT چیزی شبیه به xxxxx.yyyyy.zzzzz میشود.

1) Header

header معمولا از دو بخش تشکیل شده، نوع و الگوریتم رمزنگاری مورد استفاده.

به عنوان مثال:

{  "alg": "HS256",  "typ": "JWT"}

سپس این شی JSON با استفاده از Base64Url رمزنگاری شده و به عنوان بخش اول ساختار JWT قرار میگیرد.

2) Payload

بخش دوم payload است که شامل claim هاست. claim ها اطلاعاتی در مورد موجودیت ها را بیان میکنند(معمولا اطلاعاتی در باره کاربر) و همچنین میتوانند شامل داده های اضافی(metadata) نیز باشند. 

سه نوع claim وجود دارد، رزرو شده، عمومی و خصوصی.

- رزرو شده: این نوع claim ها از پیش تعریف شده و قابل استفاده هستند در حالی که اجباری برای استفاده از آنها وجود ندارد اما توصیه شده که این کار را انجام دهیم مانند iss, exp, sub و ...

- عمومی: میتواند به خواست کسانی که از JWT استفاده میکنند تعریف شود. برای جلوگیری از برخورد/تداخل claim های عمومی را باید در IANA JSON Web Token Registry یا در URL همراه با namespace تعریف کرد.

- خصوصی: این claim ها به صورت سفارشی برای به اشتراک گذاری اطلاعات بین محیط هایی ایجاد میشود که با هم در مورد آن توافق کرده اند.

به عنوان مثال payload میتواند چیزی شبیه به شی زیر باشد:

{  "sub": "1234567890",  "name": "John Doe",  "admin": true}

سپس این شی JSON با استفاده از Base64Url زمزنگاری شده و به عنوان بخش دوم ساختار JWT قرار میگیرد.

3) Signature

برای ایجاد این بخش شما به header و payload کد(رمزنگاری) شده، یک کلید محرمانه و الگوریتم مشخص شده در header احتیاج دارید.

به عنوان مثال شما میخواهید از الگوریتم HMAC SHA256 استفاده کنید، signature به صورت زیر خواهد شد:

HMACSHA256(  base64UrlEncode(header) + "." +  base64UrlEncode(payload),  secret)

signature به منظور بررسی ارسال کننده JWT استفاده میشود تا از ارسال کننده و اینکه محتوای ارسال شده را بدون تغییر دریافت میکنیم مطمئن باشیم.

در نهایت خروجی یک رشته Base64 شده است که در آن سه بخش توضیح داده شده با نقطه از هم تفکیک شده اند. حال میتوان به راحتی در محیط های مختلف از JWT استفاده کرد در حالی که نسبت به استاندارد های XML-based فشرده تر و کوچکتر است.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

 

این مطلب آخرین بار در تاریخ 1396/09/06 - 13:06 ویرایش شده است.

3 نظر
cybercoder در تاریخ 1396/07/06 - 15:42 نوشته:
با عرض سلام و تقدیر بابت مطلب بروز و خوبی که قرار داده شده است.
در مورد دو سوال پایین:
token ایجاد شده از طریق SSL/TLS در متد لاگین به کاربر ارسال می شود. می توان token را در محل های ذخیره سازی مانند local storage در angular یا در پایگاه داده سمت کاربر مثل SQLite و ... نگهداری کرد. در هربار request کلاینت به سرور، این token تدرون header یا payload پروتکل http/https (و احتمالا در coAP هم چنین باشد) ارسال می شود و (معمولاً تحت middle ware هایی) تقاضا قبل از تصمیم گیری و مسیریابی با فراخواندن jwt ، عمل verify کردن token صورت می گیرد و در صورت صحیح بودن token اجازه دسترسی داده می شود و در غیر این صورت reject می شود. به این شیوه از session و cookie بی نیاز می شویم و نکته مهم این است که برای امنیت کامل نیاز به SSL/TLS است تا رشته token در شبکه sniff که شد، قابل کدگشایی نباشد.
به کمک jwt مکانیزم های ثبت نام و ورود کاربران مانند app تلگرام به راحتی امکانپذیر و دلپذیر می شود.

موفق باشید.
پاسخ احسان:

ممنون از پاسخ و زماني كه براي نظرات گذاشتيد. پاسختون رو براي اين كاربر ايميل كردم.


aby در تاریخ 1396/06/04 - 20:38 نوشته:
اخیرا به کتابخانه JWT نگاهی داشتم . اما چیزی که تو مثال ها اومده انکد و دیکود کردن رشته ها هستش . متاسفانه اتفاقاتی که در زمان احراز هویت میفته رو نشون ندادن . یا من متوجهش نمیشم . اینکه این توکن اصلا چیه یه فایل JSON Iهست؟ اصلا جایی ذخیره و نگهداری میشه ؟ بالاخزه یه جایی باید ثبت و نگهداری بشه اونجا کجاس ؟ ما نام و ایمیل و یه سری چیزا رو میگیریم و رمزنگاری میکنیم .حالا مثلا با فراخوانی اکشن هر کنترلر باید چک کنیم که این رشته وجود داره یا نه ؟ آیا سبم احراز هویت این تیپی میشه ؟ اگه امکانش هست کمک بفرمایید
پاسخ احسان:

مثال هاي زيادي براش توي اينترنت وجود داره كه پاسخ تمام سوالاتتون رو ميده. 

لطفا گوگل كنيد.


aby در تاریخ 1396/06/04 - 16:08 نوشته:
با سلام و تشکر از مطالبی که عنوان نمودید . سوال من ایجاست که خب ما این توکن که یه رشته رمزنگاری شده هست رو ایجاد کردیم . نه کوکی هست که تو مرورگر ذخیره بشه و نه سشن که تو سرور ذخیره بشه . بالاخره این رشته که قرار هست decode بشه رو کجا باید نگه داری کنیم ؟؟؟ دقیق تر بپرسم که ما یه سری اطلاعات رو میگیریم و رمزنگاری میکنیم و یه رشته یکتا بدست میاریم . حالا برا اهراز هویت الان باید چبکار کنیم ؟؟؟؟؟؟؟؟؟؟؟
پاسخ احسان:

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


عضویت در خبرنامه
جهت اطلاع از آخرین فعالیت های من لطفا در خبرنامه عضو شوید