JWT (JSON Web Token) هو صيغة مضغوطة لنقل بيانات موقّعة، غالبًا معلومات عن مستخدم مُصادَق عليه. يتكون الرمز من ثلاثة أجزاء مفصولة بنقاط: header.payload.signature. عند فك ترميز رمز يحتوي على بيانات عربية، يظهر تفصيل بصري يستحق الانتباه: اتجاه عرض الـ JSON الناتج.
عند فك الترميز: JSON عربي داخل صفحة RTL
لو كان الـ payload يحتوي على {"الاسم": "محمد أحمد", "المدينة": "الرياض"}، فإن بنية JSON نفسها — الأقواس والفواصل والنقطتين — مبنية على ترتيب من اليسار إلى اليمين بغض النظر عن لغة المحتوى، بينما القيم والمفاتيح العربية تُعرض من اليمين إلى اليسار. النتيجة عند عرض JSON مفكوك الترميز داخل صفحة أدوات المطورين هي مزيج بصري bidi يحتاج المتصفح لحسمه تلقائيًا، وقد يبدو ترتيب علامات الترقيم مربكًا للوهلة الأولى رغم أن البيانات صحيحة تمامًا.
الأجزاء الثلاثة للرمز
- Header — JSON يحتوي على نوع الرمز وخوارزمية التوقيع (مثل HS256 أو RS256)، مُرمَّز بـ Base64URL.
- Payload — JSON يحتوي على "claims": بيانات المستخدم، وقت الإصدار، تاريخ الانتهاء، إلخ، أيضًا بصيغة Base64URL.
- Signature — توقيع محسوب من header وpayload باستخدام مفتاح سري أو خاص، يؤكد أن الرمز لم يُعدَّل.
حجم البيانات: النص العربي يزيد طول الترميز
كل حرف عربي يُخزَّن في UTF-8 على بايتين، مقابل بايت واحد للحرف اللاتيني، لذلك فإن payload يحتوي على أسماء أو عناوين عربية يكون أطول بعد الترميز بـ Base64URL من مكافئه بالإنجليزية. هذا فرق عملي بسيط لكنه ملموس عند تصميم رموز تحتوي بيانات مستخدم بلغات غير لاتينية.
Base64URL، وليس Base64 العادي
يستخدم JWT نسخة من Base64 بأبجدية آمنة لعناوين URL: يُستبدل الحرفان + و/ بـ - و_، ويُحذف عادةً رمز الحشو =. هذا يسمح بإدراج الرمز في عنوان URL أو ترويسة دون ترميز إضافي.
تمييز مهم: فك الترميز ≠ التحقق
الـ header والـ payload مجرد Base64URL — يمكن لأي شخص فك ترميزهما وقراءة محتواهما دون أي مفتاح. لا يمكن الوثوق بمحتوى الرمز إلا بعد التحقق من توقيعه باستخدام المفتاح المناسب — وهذا التحقق يقوم به الخادم، وليس عميلًا يكتفي بالنظر إلى ما بداخل الرمز.
هجوم خطير: تبديل الخوارزمية إلى "none"
تسمح مواصفة JWT بخوارزمية none — رمز بلا توقيع. إذا وثق الخادم الخلفي بسذاجة بحقل alg الوارد في ترويسة الرمز بدلاً من التحقق باستخدام خوارزمية ثابتة معروفة مسبقًا، يستطيع المهاجم استبدال alg بـ none وإزالة التوقيع. تفرض مكتبات JWT الموثوقة تحديد الخوارزمية المتوقعة صراحةً عند التحقق، تحديدًا للحماية من هذا الهجوم.