العربية
  • jwt
  • auth
  • authentication
  • identity
  • api
  • openid
  • oauth

ما هو JSON Web Token (JWT)؟

احصل على فهم واضح لأساسيات JSON Web Token (JWT) في 5 دقائق.

Gao
Gao
Founder

JSON Web Token (JWT) يُستخدم على نطاق واسع في تطبيقات الويب الحديثة والمعايير المفتوحة مثل OpenID Connect، مما يسهل التحقق والتفويض. بينما يعتبر RFC 7519 مرجعًا أساسيًا، فإنه سيكون صعب الفهم للمبتدئين. في هذه المقالة، سنركز على المفاهيم الأساسية لـJWT ونقدمها بلغة بسيطة مع أمثلة.

لماذا نحتاج إلى JWT؟

في الوقت الحاضر، من الشائع استخدام JSON لتبادل البيانات بين طرفين. فكر في كائن JSON يمثل مستخدمًا:

sub هو اختصار لـ"subject"، وهو مطلب قياسي في OpenID Connect لتمثيل معرف المستخدم (user ID).

كيف يمكننا ضمان سلامة هذا الكائن JSON؟ بعبارة أخرى، كيف يمكننا التأكد من أن البيانات لم تُغير أثناء الإرسال؟ الحل الشائع هو استخدام التوقيعات الرقمية. على سبيل المثال، يمكننا استخدام التشفير بالمفتاح العام: يقوم الخادم بتوقيع كائن JSON بمفتاحه الخاص، ويمكن للعميل التحقق من التوقيع باستخدام المفتاح العام للخادم.

باختصار، JWT يوفر طريقة معيارية لتمثيل كائن JSON وتوقيعه.

صيغة JWT

نظرًا لوجود العديد من الخوارزميات لإنشاء التوقيعات الرقمية، من الضروري تحديد الخوارزمية المستخدمة لتوقيع JWT. يتم ذلك من خلال بناء كائن JSON:

alg هو اختصار لـ"algorithm"، وtyp هو اختصار لـ"type".

عادةً ما يتم تعيين typ إلى JWT بأحرف كبيرة. في مثالنا، alg هو HS256، والذي يرمز إلى HMAC-SHA256 (سنشرحه قريبًا)، ويشير إلى أننا نستخدم هذه الخوارزمية لإنشاء التوقيع.

الآن، لدينا جميع العناصر اللازمة لJWT:

  • JSON الرأسي: الخوارزمية والنوع
  • JSON الحمولة: البيانات الفعلية
  • التوقيع: التوقيع الشامل للرأس والحمولة

ومع ذلك، تعتبر بعض الأحرف مثل المسافات وفواصل الأسطر غير مريحة للإرسال عبر الشبكة. لذلك، تحتاج الرأس والحمولة إلى أن تكون مرمزة Base64URL. تبدو JWT النموذجية هكذا:

. يعمل كفاصل.

لنجمع كل شيء معًا وننشئ JWT:

الرأس

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

مرمز Base64URL: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

الحمولة

JSON: {"sub":"foo","name":"John Doe"}

مرمز Base64URL: eyJzdWIiOiJmb28iLCJuYW1lIjoiSm9obiBEb2UifQ

التوقيع

في HMAC-SHA256، يتم إنشاء التوقيع باستخدام سر:

على سبيل المثال، مع السر some-great-secret، يصبح التوقيع: XM-XSs2Lmp76IcTQ7tVdFcZzN4W_WcoKMNANp925Q9g.

JWT

JWT النهائي هو:

يمكن لأي طرف يمتلك السر التحقق من صحة JWT هذا.

اختيار خوارزمية التوقيع

كما ذكرنا سابقًا، هناك خوارزميات مختلفة لإنشاء التوقيعات الرقمية. استخدمنا HS256 كمثال، ولكنه قد لا يكون قويًا بما يكفي نظرًا لأنه يجب مشاركة السر بين الأطراف (مثل العميل والخادم).

في السيناريوهات الواقعية، قد تشمل العملاء تطبيقات عامة مثل تطبيقات React التي لا يمكنها الحفاظ على السر بأمان. وبالتالي، يتم تفضيل النهج الذي يستخدم التشفير بالمفتاح العام (أي التشفير غير المتماثل) للتوقيع على JWT. لنبدأ بالخوارزمية الأكثر شهرة: RSA.

RSA

RSA، خوارزمية غير متماثلة، يستخدم زوجًا من المفاتيح: مفتاح عام ومفتاح خاص. يتم استخدام المفتاح العام للتحقق من التوقيع، بينما يستخدم المفتاح الخاص للتوقيع.

الرأس JSON لـRSA يبدو هكذا:

RS256 يرمز إلى RSA-SHA256، مما يعني أن التوقيع يُنشأ باستخدام خوارزمية RSA ودالة هاش SHA256. يمكنك أيضًا استخدام RS384 وRS512 لإنشاء توقيعات باستخدام دوال هاش SHA384 وSHA512 على التوالي.

يتم إنشاء التوقيع باستخدام المفتاح الخاص:

مرة أخرى، يمكننا تجميع هذه الأجزاء لإنشاء JWT، وتبدو JWT النهائية هكذا:

الآن، يمكن للعميل التحقق من التوقيع دون معرفة المفتاح الخاص.

ECDSA

على الرغم من أن RSA معتمد على نطاق واسع، إلا أنه يُعاني من توقيعات أكبر، تتجاوز أحيانًا الحجم الإجمالي للرأس والحمولة. خوارزمية توقيع المنحنى الإهليلجي الرقمي (ECDSA) هي خوارزمية غير متماثلة أخرى يمكنها إنشاء توقيعات أكثر إحكامًا وتقديم أداء أفضل.

لإنشاء مفتاح خاص لـECDSA، نحتاج إلى اختيار منحنى. هذا خارج نطاق هذه المقالة، لكن يمكنك العثور على مزيد من المعلومات هنا.

الرأس JSON لـECDSA يبدو هكذا:

ES256 يرمز إلى ECDSA-SHA256، مما يعني أن التوقيع يُنشأ باستخدام خوارزمية ECDSA ودالة هاش SHA256. يمكنك أيضًا استخدام ES384 وES512 لإنشاء توقيعات باستخدام دوال هاش SHA384 وSHA512 على التوالي.

يتم إنشاء التوقيع باستخدام المفتاح الخاص:

تحافظ JWT النهائية على نفس هيكل RSA ولكن بتوقيع أقصر بكثير:

التحقق من JWT

التحقق من JWT عملية بسيطة تتبع العملية العكسية لإنشائها:

  1. قسِّم JWT إلى ثلاثة أجزاء (الرأس، الحمولة، والتوقيع) باستخدام الفاصل ..
  2. فك ترميز الرأس والحمولة بـBase64URL.
  3. تحقق من التوقيع باستخدام الخوارزمية المحددة في الرأس والمفتاح العام (للخوارزميات غير المتماثلة).

هناك العديد من المكتبات المتاحة للمساعدة في التحقق من JWT، مثل jose لـNode.js ومتصفحات الويب.

الخاتمة

في هذه المقالة، شرحنا باختصار المفاهيم الأساسية لـJWT، إلى جانب نظرة عامة على كيفية إنشائها والتحقق منها. تبقى العديد من التفاصيل غير مستكشفة، وسنغطيها في مقالات مستقبلية.

يستفيد Logto من المعايير المفتوحة مثل JWT وOpenID Connect لتأمين التطبيقات وواجهات برمجة التطبيقات الخاصة بك مع توفير تدفقات عمل مبسطة لكل مطور. إذا كنت مهتمًا، يمكنك تجربتها مجانًا (لا يتطلب بطاقة ائتمان).