توکن یا Json Web Token و یا به اختصار JWT چیست؟

توکن یک استاندارد وب است که به صورت فشره و خود شمول ( Self-contained ) طراحی شده است و یک راه امن برای انتقال اطلاعات بین مقاصد را توسط یک شی Json فراهم میکند. این اطلاعات قابل اعتماد و اطمینان هستند و به صورت دیجیتال امضا میشوند. توکن ها میتوانند توسط یک کلید مخفی ( private key ) با الگوریتمی مانند HMAC و یا توسط ( private/public key ) یک جفت کلید خصوصی و عمومی با الگوریتم هایی مانند RSA و ECDSA رمزنگاری شوند.

Self-Contained : توکن ها به تنهایی شامل تمامی اطلاعات مورد نیاز برای احراز هویت یک کاربر میباشند تا نیازی نباشد برای هر درخواست یک کوئری به دیتابیس ارسال شود. و به همین دلیل از واژه خود شمول استفاده شده است.

جه زمان هایی باید از توکن ها استفاده کنیم؟

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

ساختار توکن به چه صورت است؟

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

  • Header
  • Payload
  • Signature

بنابراین ساختار یک توکن به شکل زیر است :

xxxxx.yyyyy.zzzzz

Header : هدر معمولا از دو قسمت تشکیل میشود که مشخص کننده نوع توکن و الگوریتم رمزنگاری شده می باشد. به عنوان مثال :

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

سپس این اطلاعات به صورت Base64 انکد ( Encode ) میشود و در قسمت اول توکن قرار میگیرد.

Payload : قسمت دوم payload نام دارد که در زبان فارسی به "ظرفیت ترابری" ترجمه شده -_-. payload شامل اطلاعاتی درباره موجودیت میباشد که معمولا مربوط به توکن و کاربر است. در payload اکثرا اطلاعاتی مانند تاریخ انقضای توکن,آیدی کاربر,صادر کننده توکن و... اطلاعاتی از این سری میباشد. و به شکل زیر است:

{
  "id": "1",
  "name": "Farhad Zamani",
  "admin": true
}

سپس این اطلاعات مانند هدر به صورت base64 انکد شده و در قسمت دوم توکن قرار میگیرد.

Signature : سپس برای  ساخت امضا شما باید هدر و payload که به صورت base64 انکد شده اند با یک الگوریتم و یک رمز امضا کنید. به عنوان مثال ساخت امضا با الگوریتم HMAC SHA256 و یک کلید مخفی ( Secret ) به صورت زیر است:

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

از این امضا برای مطمئن شدن از اطلاعاتی است که فرستاده شده و دستکاری نشده باشد. زیرا هدر و payload انکد شده توسط الگوریتم و کلید مخفی شما رمزنگاری شده است و اگر اطلاعاتی دستکاری شود توکن نا معتبر  و غیرقابل رمزگشایی میشود.

و در نهایت توکن تولید شده به صورت زیر می باشد که header , payload , signature با استفاده از نقطه از هم جدا شده اند :

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImkiLCJuYW1lIjoiRmFyaGFkIFphbWFuaSIsImFkbWluIjp0cnVlfQ.VlecMtrEJ4ZhT6dcHKHBGXLnCtQl_ZQY85JRM0lLRUc