JSON Web Tokens چیست ؟

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

JSON Web Tokens روشی امن برای Authentication (احراز هویت) و Authorization (تأیید) است چراکه بطور دیجیتالی امضاء شده است.

JSON Web Tokens می تواند با بکارگیری یک کلید سری یا یک کلید عمومی و خصوصی که الگوریتم های متفاوتی را اعمال می کند، امن شود.

JWT توسط اکثر برنامه ها مانند .NET، Java، Python، PHP، Ruby، JavaScript، Node.js و … پشتیبانی می شود.

JWT می تواند به عنوان رشته ی کوئری/جستار، کوکی ها، هدر HTTP ، یا پارامتر بدنه مورد استفاده قرار بگیرد.

این روشی بسیار کارآمد برای single sign-on است.

ساختار JSON Web Tokens

JWT از سه بخش اصلی تشکیل می شود:

  • Header (هدر)
  • Payload (بسته ی اطلاعاتی)
  • Signature (امضاء)

این سه بخش با نقطه (.) از هم جدا شده اند و همگی، بصورت زیر، در قالب فرمت رمزگذاری شده ی Base64Url هستند.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3ZpdmVra3VtYXIuY29tIiwiaWF0
IjoxNTQ0MDM0Mjg3LCJleHAiOjE1NzU1NzAyODcsImF1ZCI6Ind3dy52aXZla2t1bWFyLmNvbSIsInN1
YiI6InZpdmVrQHZpdmVra3VtYXIuY29tIiwiTmFtZSI6IlZpdmVrIEt1bWFyIiwiUm9sZSI6IkFkbWluIn0.JC
iVwlHWrgxZHrdGjGdlMH7rMij2Atd6rw0C7reVnd8

Header

معمولا از دو بخش تشکیل می شود:

  1.  Typ : بطور کلی JSON Web Tokens خواهد بود
  2. Alg : الگوریتم hashing (هش نوعی رمزگذاری می باشد)

در نشانه ی فوق، هدر بخش اول پیش از اولین نقطه (.) است، که نیز بصورت زیر در فرمت رمزگذاری شده ی Base64Url است.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

هنگامیکه Base64Url فوق را رمزگشایی کنیم، JSON را به شکل زیر بدست خواهیم آورد.

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

در اینجا “typ” برای شناسایی نوع نشانه، که بطور کلی JWT خواهد بود، بکار می رود و “alg” برای شناسایی الگوریتم hashing ، که در ایجاد امضاء برای JWT دخیل است، استفاده می شود.

Payload

در نشانه ی فوق، payload بخش دوم، بین اولین و دومین نقطه (.) است، که نیز بصورت زیر در فرمت رمزگذاری شده ی Base64Url است.

eyJpc3MiOiJodHRwczovL3ZpdmVra3VtYXIuY29tIiwiaWF0IjoxNTQ0MDM0Mjg3LCJleHAiOjE1
NzU1NzAyODcsImF1ZCI6Ind3dy52aXZla2t1bWFyLmNvbSIsInN1YiI6InZpdmVrQHZpdmVra3
VtYXIuY29tIiwiTmFtZSI6IlZpdmVrIEt1bWFyIiwiUm9sZSI6IkFkbWluIn0

payload حاوی claim ها است. claimها عباراتی در رابطه با یک موجودیت، بطور کلی کاربر، هستند و نیز شامل متادیتاهای اضافی می شوند.

سه نوع Claim وجود دارد.

  1.  Registered Claimsهای ثبت شده
  2.  Public Claims های عمومی
  3. Private Claims (claimهای خصوصی

Registered Claims

این ها، claim های از پیش تعریف شده هستند که پیشنهاد می شوند و باید هنگام ایجاد نشانه از آن ها استفاده کنیم، برخی از آن ها هنگام اعتبارسنجی نشانه از طریق سرویس دیگر بسیار کارآمد هستند اما الزامی نیستند.

در ادامه، مثالی از registered claims آمده است،

  •  Issuer : ( منتشر کننده )

مدیری که JSON Web Tokens  را منتشر کرده شناسایی می کند. بطور کلی یک نام DNS.

  • Subject: فاعل

مدیری که فاعل JWT است را شناسایی می کند. فاعل در زمینه/متن منتشر کننده، منحصر بفرد است. بطور کلی شناسه ی کاربری یا شناسه ی ایمیل در زمینه/متن کاربر است.

  •  Audience : مخاطب

گیرنده ای که JWT برای آن در نظر گرفته شده است را شناسایی می کند. در حالت کلی، مقدار “aud” آرایه ای از رشته های حساس به حروف بزرگ و کوچک است، که هر کدام حاوی یک مقدار StringOrURI است.

در حالت خاص زمانیکه JWT یک مخاطب دارد، مقدار “aud” ممکن است یک تک رشته ی حساس به حروف بزرگ و کوچک حاوی یک مقدار StringOrURI باشد.

  • Expiration Time : زمان انقضاء

زمان انقضاء را در زمان یا پس از اینکه JWT دیگر معتبر نباشد، شناسایی می کند.

  •  Not Before : نه پیش از اینکه

زمانی که پیش از آن JWT نباید پذیرفته شود را شناسایی می کند.

  • Issued At : منتشر شده در

زمانی که JWT منتشر شده را شناسایی می کند.

  • JWT ID : شناسه ی JWT

یک شناسه ی منحصر بفرد برای JWT است، اساسا می توان گفت که یک کلید هویت برای هر JWT است.

Public Claims

این claimها می توانند بطور دلخواه توسط آن هایی که از JWTها استفاده می کنند تعریف شوند.

با این حال، جهت اجتناب از برخوردها، هر نام claim جدید، یا باید در رجیستری IANA “JSON Web Token Claims” شده باشد و یا مقداری باشد که حاوی یک نام CollisionResistant است.

در هر کدام از حالت ها، تعریف کننده ی نام یا مقدار باید اقدامات احتیاطی لازم را انجام دهد تا اطمینان حاصل کند که در کنترل بخشی از فضای نامی که برای تعریف نام claim از آن استفاده می کنند، هستند.

نمونه های فضای نام های مقاوم در برابر برخورد شامل این موارد هستند:

 Domain name (نام دامنه)
UUID (شناسه ی منحصر بفرد جهانی)

Private Claims

این ها claimهای سفارشی هستند، یک تولید کننده و مصرف کننده برای اشتراک اطلاعات استفاده می شوند.

این نام claimها می توانند هر چیزی به جز registered claims یا public claims باشند.

اگر Base64Url مربوط به Payload فوق را رمزگشایی کنیم، JSON را بصورت زیر بدست می آوریم،

{  
    "iss": "https://vivekkumar.com",  
    "iat": 1544034287,  
    "exp": 1575570287,  
    "aud": "www.vivekkumar.com",  
    "sub": "vivek@vivekkumar.com",  
    "Name": "Vivek Kumar",  
    "Role": "Admin"  
}   

Signature (امضاء)

در نشانه ی فوق، Signature آخرین بخش پس از نقطه ی دوم (.) است.

JCiVwlHWrgxZHrdGjGdlMH7rMij2Atd6rw0C7reVnd8

Signature مسئول اعتبارسنجی JWT است.

برای ایجاد بخش Signature، نیاز به هدر کدگذاری شده، payload کدگذاری شده، و یک رمز داریم.

حال می توانیم از الگوریتمی برای ایجاد یک signature استفاده کنیم. یا می توانیم از یک کلید سری با عنوان رمزنگاری متقارن استفاده کنیم یا می توانیم از رمزنگاری کلید عمومی با عنوان رمزنگاری نامتقارن برای امضاء استفاده کنیم.

کاملا به ما بستگی دارد که کدام الگوریتم را برای ایجاد یک signature/امضاء پیاده سازی می کنیم.

در ادامه برخی از الگوریتم هایی که برای ایجاد یک امضاء استفاده می شوند، آورده شده است،

  •  HS256
  •  HS384
  •  HS512
  • RS256
  • RS384
  • RS512
  •  ES256
  • ES384
  •  ES512
  • PS256
  •  PS384

در این نشانه ی فوق، از الگوریتم HMAC SHA256 با عنوان HS256 (الگوریتم کلید متقارن) استفاده می کنیم، از این رو، باید از روش زیر استفاده کنیم

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

اکنون بیشتر به تفحث و جستجو می پردازیم تا بتوانیم به روشی ساده تر آن را درک کنیم.

ابتدا، هدر کدگذاری شده و payload کدگذاری شده را بصورت زیر ترکیب می کنیم.

encodedHeaderPayload = base64urlEncode(header) + “.” + base64urlEncode(payload)  

حال، از تابع Hashing به انتخاب خود استفاده می کنیم.

hashedData = ( hashFunction encodedHeaderPayload ), secret در این مثال، secret/رمز رشته ای است که می خواهیم برای رمزنگاری بفرستیم. حال، بخش آخر، تبدیل hashedData به فرمت base64urlEncode بصورت زیر است.

signature = base64urlEncode(hashedData)  

در نتیجه، هر سه جزء/کامپوننت را بصورت زیر در کنار یکدیگر قرار می دهیم

header + “.” Payload + “." + signature  

می توانیم از https://jwt.io برای مشاهده ی اطلاعات هدر و payload مربوط به JWT استفاده کنیم و نیز می توانیم آن را بصورت زیر تأیید کنیم

JSON Web Tokens

چه زمان از الگوریتم کلید متقارن و الگوریتم کلید نامتقارن استفاده کنیم؟

الگوریتم کلید متقارن

اگر بخواهیم نشانه ای ایجاد کنیم و خودمان آن را تأیید کنیم، تنها در آن زمان می توانیم از الگوریتم کلید متقارن استفاده کنیم، بدین معنا که سرور احراز هویت و سرور برنامه یکی هستند.

الگوریتم کلید نامتقارن

اگربخواهیم به یک برنامه ی شخص ثالث/واسطه اجازه دهیم که نشانه ی ما را تأیید کند، می توانیم از کلیدهای نامتقارن استفاده کرده و کلید عمومی را با واسطه ها به اشتراک بگذاریم.

از آنجاییکه کلیدهای عمومی نمی توانند برای امضاء استفاده شوند، بنابراین هیچکس نمی تواند یک نشانه ی معتبر را با claimهای سفارشی جعل کند. روش اشتراک گذاری کلید عمومی به ما بستگی دارد.

مثال کلیدهای Google در اینجا.

JSON Web Tokenها چگونه کار می کنند؟

اول از همه، اگر کاربری بخواهد یک JWT بدست بیاورد، باید اعتبارنامه های خود را به عنوان بخشی از احراز هویت ارائه کند و پس از ثبت موفقیت آمیز وقایع، JWT بازگردانده خواهد شد.

اکنون، هرگاه کاربر بخواهد به منبعی حفاظت شده از سرور دسترسی یابد، عامل/نماینده ی کاربر JWT را ارسال می کند که بطور کلی، در هدر Authorization با بکارگیری طرح Bearer قرار دارد.

هدر محتوا بصورت زیر است

Authorization: Bearer <JWT>  

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

بطور کلی، حاوی تمامی داده های مورد نیاز است، بنابراین نیازی به فراخوانی پایگاه داده نداریم.

غالبا از Role یا Scopeها در payload برای دسترسی به منابع حفاظت شده استفاده می کنیم.

کتابخانه های متن باز بسیاری برای پشتیبانی JWT در اکثر زبان ها مانند .NET، Java، PHP، Python، Ruby، Go، Scala، C، C++، JavaScript و … وجود دارد.

نتیجه گیری

در این مقاله، درکی از JSON Web Tokens و مزایای آن پیدا کردیم.

می توانیم الگوریتم را به عنوان الگوریتم کلید متقارن یا الگوریتم کلید نامتقارن بر اساس نیازمندی هایمان انتخاب کنیم.

زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

ما یک پرسشنامه‌ی کوچولو داریم، که قول میدیم وقتتون رو خیلی نمی‌گیره، ولی کلی به ما کمک می‌کنه، چون هم assessment مونه ,و هم شما به ما در این زمینه کمک میکنید.بزن بریم