یک نوع توکن اعتبارسنجی که به طور گسترده برای اشتراک اطلاعات بین کلاینت و سرور استفاده میشه. مهمه که توجه داشته باشیم که JWT گارانتی نمیکنه که دیتا رمزنگاری شده باشه بلکه encode شده و دیتا توسط هرکسی که رهگیریش کنه، قابل دیدنه، به همین دلیل HTTPS همراه با JWT بسیار پیشنهاد میشه.
به یاد داشته باشیم که JWT یک توکن sign شده است نه رمزنگاری شده. پس اطلاعات حساس رو داخلش قرار ندیم.
در واقع JWT مخفف JSON Web Token است که یک استاندارد بازه که انتقال اطلاعات JSON، بین دو موجودیت رو امن میکنه.
یک JWT که sign شده، میتونه یکپارچگی اطلاعات داخلش رو ادعا کنه، درحالیکه یک توکن encrypt شده، میتونه مخفی بودن اون اطلاعات رو ادعا کنه. امضای روی توکن امضا شده با public/private key گواهی میکنه که فقط کسی که کلید خصوصی رو داره، توکن رو امضا کرده.
در پروتوکلهای stateless، چیزی در مورد درخواست قبلی نمیدونه و باید با هر درخواست خودت رو معرفی کنی. اینکه بخوای از session استفاده کنی و کاربر درخواست لاگین بده و بعد یک session id بگیره و با هر درخواست بعدیش بفرسته، راهکار مناسبی نیست، چون این داده session روی سرور ذخیره میشه و حافظه میگیره، مدیریت باید بکنیش و session های غیرفعال رو منقضی کنی. هربار باید چک کنی که session معتبر هست یا نه و این کار سربار داره.
اما JWT از session استفاده نمیکنه، سرور بجای ایجاد session، وقتی کاربر اطلاعات شناسایی شو میفرسته، یک JSON Web Token برمیگردونه، که باهاش همه کارهایی که نیاز به دسترسی داره رو میتونی انجام بدی.
مشابه کارت هتله که بعد از رجیستر کردن بهت میدن و باهاش به اتاقت و کافه و استخر و بقیه بخشها دسترسی داری اما به بقیه اتاقها و بخشهای مدیریتی دسترسی نداری و تاریخ انقضا هم داره.
سه بخش اصلی داره که به این شکله:
<<header>>.<<payload>>.<<signature>>
معمولا دو بخش توی header هست، نوع توکن (JWT) و الگوریتمی که برای امضا شدنش استفاده شده (RSA, HMAC).
این بخش شامل اطلاعاتی که ادعا میشه از سرور اومده. میتونه اطلاعات مرتبط با یک موجودیت یا هر اطلاعاتی باشه. ما سه نوع claim داریم که در این قسمت میتونیم استفاده کنیم:
برای تولید امضا، لازمه که encoded header و encoded payload و secret رو با الگوریتمی که در header مشخص کردیم sign کنیم.
در نهایت از ترکیب این سه بخش، JWT token ما ایجاد میشه.
encode64({ "alg": "HS256", "typ": "JWT" }). encode64({ "sub": "1234567890", "name": "John Doe", "admin": true, "iat": 1516239022 }). HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret )