ما هو JSON Web Token (JWT)؟
احصل على فهم واضح لأساسيات JSON Web Token (JWT) في 5 دقائق.
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 عملية بسيطة تتبع العملية العكسية لإنشائها:
- قسِّم JWT إلى ثلاثة أجزاء (الرأس، الحمولة، والتوقيع) باستخدام الفاصل
.
. - فك ترميز الرأس والحمولة بـBase64URL.
- تحقق من التوقيع باستخدام الخوارزمية المحددة في الرأس والمفتاح العام (للخوارزميات غير المتماثلة).
هناك العديد من المكتبات المتاحة للمساعدة في التحقق من JWT، مثل jose لـNode.js ومتصفحات الويب.
الخاتمة
في هذه المقالة، شرحنا باختصار المفاهيم الأساسية لـJWT، إلى جانب نظرة عامة على كيفية إنشائها والتحقق منها. تبقى العديد من التفاصيل غير مستكشفة، وسنغطيها في مقالات مستقبلية.
يستفيد Logto من المعايير المفتوحة مثل JWT وOpenID Connect لتأمين التطبيقات وواجهات برمجة التطبيقات الخاصة بك مع توفير تدفقات عمل مبسطة لكل مطور. إذا كنت مهتمًا، يمكنك تجربتها مجانًا (لا يتطلب بطاقة ائتمان).