لماذا يتم استخدام JWT في معظم خدمات OAuth 2.0
تشرح هذه المقالة لماذا يتم تبني JWT على نطاق واسع كصيغة لرموز الوصول في OAuth 2.0، مع تسليط الضوء على فوائده وقيوده.
يُستخدم OAuth 2.0 على نطاق واسع اليوم. كإطار عمل أساسي لخدمات التفويض، إحدى المسؤوليات الرئيسية لـ OAuth 2.0 هي إصدار رموز وصول للمستخدمين. لقد لاحظنا أن العديد من مقدمي خدمات OAuth في السوق يصدرون رموز الوصول بصيغة JWT.
في هذه المقالة، سنقدم ما هو JWT ولماذا يتم تبنيه على نطاق واسع كصيغة لرموز الوصول التي يصدرها OAuth 2.0.
مقدمة إلى JWT
JWT تعني JSON Web Token، ويتم تعريفه بواسطة RFC 7519 كما يلي:
JSON Web Token (JWT) هو وسيلة مضغوطة وآمنة للاستدلال لتمثيل الادعاءات التي يتم نقلها بين طرفين.
يجعل هذا التعريف واضحًا أن JWT هو رمز يستخدم لتمرير الادعاءات بين أطراف مختلفة.
نظرًا لأن JWTs يتم تمريرها بين أطراف متعددة، فإنه يتم توقيعها لضمان سلامة البيانات وأصالتها.
يحتوي JWT الموقع على الصيغة التالية:
يتكون من ثلاثة أجزاء مفصولة بـ .
: الرأس، الحمولة، والتوقيع.
إليك مثال على JWT في العالم الحقيقي:
يمكنك محاولة تحليله في https://jwt.io:
كما هو موضح في الصورة، يحتوي القسم header
من JWT على معلومات حول خوارزمية التوقيع المستخدمة ونوع الرمز. يحتوي قسم payload
على الادعاءات التي يحملها JWT، ويتم استخدام signature
للتحقق من سلامة JWT.
الآن بعد أن فهمنا ما هو JWT ومعنى أجزائه المختلفة، دعونا نشرح لماذا تختار العديد من خدمات تفويض OAuth استخدام JWT كرمز وصول لها.
فوائد استخدام JWT
الاختلافات الرئيسية بين JWT والرموز التقليدية المعتمدة على السلاسل العشوائية هي أن JWTs يمكنها حمل المعلومات ويمكن التحقق منها من خلال فك الترميز. تجلب هذه الاختلافات ميزتين هامتين:
- كفاءة الموارد: يمكن لـ JWTs حمل المعلومات حول المستخدم أو الجلسة، مما يلغي الحاجة إلى الوصول بشكل متكرر إلى قاعدة البيانات. يمكن أن تقلل هذه الكفاءة من استهلاك الموارد للخدمات.
- تحسين التوافر وقابلية التوسع: تقلل JWTs من الاعتماد على إدارة الحالة من جهة الخادم، مما يسمح للخدمات بأن تكون أكثر استنادًا لحالة معدومة، مما يعزز توافرها وقابليتها للتوسع.
عند استخدام الرموز التقليدية المعتمدة على السلاسل العشوائية، تكون العملية النموذجية للتحقق والمصادقة كما يلي:
كما هو موضح في المخطط، عندما يكون لدى النظام العديد من المستخدمين والعديد من خوادم الموارد المختلفة، يمكن أن يؤدي ذلك إلى الكثير من طلبات التحقق من صحة الرمز إلى خادم المصادقة.
بمرور الوقت، مع نمو النظام، يمكن أن يصبح خادم المصادقة بسهولة عنق الزجاجة، مما يشكل تحديًا لتوافر الخدمة بشكل عام.
ومع ذلك، عند تقديم JWTs، تتغير عملية التحقق:
بفضل ميزة JWTs التي تسمح بالتحقق من خلال فك الترميز، يمكن لخادم الموارد التحقق من سلامة JWTs واستخراج معلومات المستخدم منها دون الحاجة إلى التفاعل مع خادم المصادقة (للتفاصيل حول فك تشفير والتحقق من JWTs، يمكنك الرجوع إلى وثائق Logto).
قيود JWT
بينما تقدم JWTs مزايا كبيرة في هياكل البرمجيات الحديثة، فإن لها أيضًا قيودًا يجب النظر فيها.
حمولة سهلة التجسس
كما ذكرنا سابقًا، يتكون JWT من ثلاثة أجزاء: header
, payload
, وsignature
.
كيف يتم توليد هذه المكونات؟ دعونا نأخذ JWT من المثال السابق ونوضح عملية توليد JWT:
كما هو موضح في الكود أعلاه، يتم ببساطة ترميز رأس و حمول JWT كسلاسل base64.
هذا يعني أنه طالما كان لدى شخص ما الوصول إلى الرمز، يمكنهم بسهولة فك ترميز سلسلة base64 لحمولة JWT والوصول إلى المعلومات التي تحملها. على العكس من ذلك، من السهل نسبيًا تزوير حمولة واستبدال حمولة JWT الأصلية بأخرى معدلة.
بينما صحيح أن حمولة JWT يمكن تزويرها نسبيًا بسهولة، من المهم ملاحظة أن جزء التوقيع من JWT لا يمكن استبداله بمحتوى مزيف، حيث يتطلب مفتاح التوقيع السري. لذلك، بدون التوقيع الصحيح، لا يمكن لـ JWT أن يمرر التحقق.
لذا، عند استخدا م JWTs، من المهم مراعاة النقاط التالية:
- استخدم SSL دائمًا: لضمان عدم تسريب معلومات JWT أثناء النقل، من الضروري استخدام SSL (طبقة المقابس الآمنة) أو خليفتها TLS (أمان طبقة النقل) لتشفير البيانات أثناء النقل.
- تجنب تخزين البيانات الحساسة: لا يُنصح بتخزين البيانات الحساسة في حمولة JWT. يمكن فك حمولة JWT بسهولة، كما ذُكر سابقًا، ويجب أن تحتوي بشكل أساسي على الادعاءات غير الحساسة وذات الصلة.
- تحقق من JWTs: قبل الاعتماد على المعلومات الموجودة داخل JWT، تأكد من أنها اجتازت عملية تحقق صالحة وآمنة، بما في ذلك التحقق من التوقيع وفحص نهاية فترة الصلاحية. هذا يساعد في منع استخدام الرموز المعدلة أو غير المصرح بها.
صعوبة الإلغاء
بشكل عام، تحتوي رموز الوصول عادة على وقت انتهاء الصلاحية. إذا كان رمز الوصول يُمثل كسلاسل عشوائية بدون أي معلومات، يمكننا التحقق مما إذا تم إلغاء الرمز أثناء كل تحقق في خادم المصادقة.
أما بالنسبة لـ JWTs، نظرًا لأن JWTs تحتوي على معلومات الانتهاء داخلها، ولأن عملية التحقق من JWT لا تعتمد على خادم المصادقة، بمجرد إصدار خادم المصادقة لرمز الوصول بصيغة JWT، يصبح من المستحيل تغيير حالة الرمز أثناء الاستخدام.
بعد انتهاء فترة صلاحية رمز JWT بشكل طبيعي، يمكننا الحصول على JWT جديد من خادم التفويض باستخدام رمز التحديث (يمكنك الرجوع إلى مدونة Logto للحصول على معلومات حول رموز التحديث).
ومع ذلك، في بعض الحالات، مثل عندما يلغى المستخدم التفويض أو يقوم بتغيير كلمة المرور الخاصة به، وتحتاج إلى إلغاء الرمز الذي تم إصداره ولكنه لم ينتهي بعد، لا يوجد حل بسيط متاح.
هناك نهجان شائعان للتخفيف من تأثير إلغاء الرمز في منتصف الطريق:
- تحديد وقت انتهاء صلاحية أقصر لرمز الوصول والاعتماد على آلية تحديث الرمز لتحديث حالة الرمز بسرعة.
نظرًا لأن رمز الوصول له وقت انتهاء صلاحية أقصر، عندما يكتشف المستخدم أن رمز الوصول قد انتهت صلاحيته، يمكنه طلب رمز وصول جديد باستخدام رمز تحديث من خدمة التفويض. بهذه الطريقة، يمكن مزامنة حالة الرمز على جانب المستخدم مع الخلفية في أقرب وقت ممكن. ومع ذلك، هذا النهج يتضمن تكلفة إضافية يجب مراعاتها من قبل المستخدمين.
- الاحتفاظ بقائمة إلغاء لرموز الوصول والتحقق مما إذا كان الرمز موجودًا في القائمة أثناء كل تحقق.
هذه الطريقة لها بعض القيود. إحدى مزايا JWT هي أنها لا تتطلب من الخادم تخزين معلومات حالة، و JWTs عادة ما تكون بلا حالة. ومع ذلك، يتطلب الاحتفاظ بقائمة الإلغاء تخزينًا وصيانة فعالة، مما يعتمد على آليات تخزين إضافية. هذا يضحي بشكل أساسي بمزايا JWT ويمكن أن يؤدي إلى مشكلات في الأداء في النهاية. لذلك، يجب على المطورين تنفيذ آلية إلغاء الرمز بطريقة تناسب حالتهم الخاصة.
ملخص
في هذه المقالة، قدمنا مقدمة مختصرة عن JWT تسلط الضوء على مميزاته وقيوده. بحلول الآن، يجب أن تكون لديك فهم أعمق للـ JWT والسيناريوهات التي يُستخدم فيها عادة. على الرغم من التحديات التي يواجهها JWT، فإن الفوائد التي يقدمها عند استخدامه كصيغة للرموز في خدمات OAuth 2.0 تفوق بكثير عيوبه.
تستخدم Logto، بصفتها خدمة تحقق هوية سريعة النمو، أيضًا JWT كصيغة لرموز الوصول الخاصة بها. تتبع بدقة بروتوكولات التفويض والمصادقة المختلفة، مما يجعل من السهل بشكل استثنائي دمج خدمات التحقق من الهوية في منتجاتك. أطلقت Logto رسميًا خدمتها السحابية، ويمكنك تجربتها مجانًا اليوم.