JWT

امنیت JWT بخش اول: مقدمه ای بر JWT

JSON Web Token (JWT) یک راهکار امن و فشرده به منظور انتقال اطلاعات در قالب JSON Object تعریف می‌نماید. به دلیل استفاده از امضای دیجیتال در این روش، صحت  اطلاعات مذکور قابل تایید می‌باشد.

۱ JWT چیست؟

JSON Web Token (JWT) یک استاندارد باز (RFC 7519) می‌باشد که یک راهکار امن و فشرده به منظور انتقال اطلاعات در قالب JSON Object تعریف می‌نماید. به دلیل استفاده از امضای دیجیتال در این روش، صحت[۱] اطلاعات مذکور قابل تایید می‌باشد. JWT می‌تواند توسط یک کلید (الگوریتم HMAC) یا جفت کلید عمومی/خصوصی (الگوریتم‌های RSA یا ECDSA) امضا شود. همچنین به منظور تضمین محرمانگی اطلاعات انتقالی مابین طرفین ، امکان رمزنگاری JWT وجود دارد.

۲ موارد استفاده JWT

نمونه‌هایی از سناریوهای استفاده JWT به شرح ذیل می‌باشد.

مجازشماری[۲]: عمده استفاده از JWT در امر مجازشماری می‌باشد. بدین صورت که پس از ورود کاربر به سامانه، اعتبارسنجی مقدار JWT موجود در هر درخواست کاربر، مجاز بودن آن کاربری جهت دسترسی به سرویس‌ها و منابع سامانه را مشخص خواهد کرد. با توجه به سربار کم و سهولت استفاده، امروزه JWT به صورت گسترده در مکانیزم‌های Single Sign On مورد استفاده قرار می‌گیرد.

تبادل اطلاعات: JSON Web Tokenها یکی از امن‌ترین روش‌ها به منظور تبادل اطلاعات بین طرفین می‌باشد. با توجه به اینکه اطلاعات مذکور در JWT، دارای امضای دیجیتال می‌باشند، می‌توان از هویت فرد ارسال کننده اطمینان حاصل نمود. همچنین می‌توان اطمینان یافت که اطلاعات دریافتی در بین راه دستکاری نشده است.

۳ ساختار JWT

JWT دارای ۳ بخش اصلی می‌باشد که توسط کاراکتر ( . ) از یکدیگر جدا می‌شوند. هر یک از این بخش‌ها بصورت Base64 کدگذاری می‌شوند.

•  Header

•  Payload

•   Signature

برای مثال : xxxx.zzzz.yyyy  

Header: از دو قسمت اصلی alg و typ تشکیل می‌شود، که بخش alg الگوریتم استفاده شده برای امضا (به عنوان مثال HMAC SHA256 یا RSA) را تعیین نموده و بخش typ نوع token را مشخص می‎کند که همواره مقدار آن برابر JWT می‌باشد. برای مثال :

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

Payload: دومین بخش توکن شامل Claimها یا در واقع تمامی داده‌ها و اطلاعات ارسالی می‌باشد. معمولا در بخش Claim اطلاعات کاربری که باید تصدیق هویت شود قرار می‌گیرد.

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

Signature: برای ایجاد بخش Singnature بایستی تمامی بخش‌های توکن به صورت base64 کدگذاری شوند. سپس با مشخص بودن الگوریتم امضا و کلید، می‌توان امضای دیجیتال را محاسبه نمود. برای مثال جهت ایجاد یک امضا با الگوریتم HMACSHA256 می‌توان به صورت زیر اقدام نمود.

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

نهایتا پس از الحاق بخش‌های فوق، خروجی به صورت زیر خواهد بود.

۴ JWT چگونه کار می‌کند؟

پس از انجام فرآیند احراز هویت، زمانی که کاربر قصد دسترسی به یک سرویس یا منبع محافظت شده را دارد، مقدار JWT در درخواست HTTP (معمولا در یک سرآیند با نام Authorization) ارسال می‌شود.

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

از نکات مثبت استفاده از JWT می‌توان به موارد ذیل اشاره نمود.

  • در مواقعی که JWT حاوی داده‌های اطلاعاتی مورد نیاز باشد، می‌تواند منجر به کاهش تعداد پرس‌وجوها از پایگاه‌داده گردد.
  • در صورتیکه JWT به جای Cookie از طریق سرآیند Authorization ارسال شود، دیگر آسیب‌پذیری CORS (Cross Origin Resource Sharing) مطرح نمی‌باشد.

نحوه دریافت اجازه دسترسی با استفاده از JWT در تصویر ذیل نشان داده شده است.

مرحله اول: کاربر درخواستی را به سرور Authorization به منظور دسترسی به منابع ارسال می‌نماید.

مرحله دوم: زمانی که درخواست کاربر تایید و اجازه دسترسی صادر شد، سرور Authorization توکن دسترسی را به کاربر ارسال می‌کند.

مرحله سوم: کاربر از این توکن برای دسترسی به منابع محافظت شده استفاده می‌نماید.

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

تدوین: امیر حسین بابایی


[۱] Interity

[۲] Authorization