انتقال امن اطلاعات بین API و App



چرا باید از 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