دليل فك تشفير JWT: البنية والمطالبات والأمان
إجابة سريعة
JWT = Base64Url(ترويسة).Base64Url(حمولة).توقيع. فك تشفير الأجزاء الأولى لرؤية المطالبات (sub، exp، iat). لكن التحقق من التوقيع يتطلب المفتاح السري. استخدم فاك تشفير JWT المجاني.
مقدمة
JWT يتكون من ترويسة (خوارزمية التوقيع)، حمولة (المطالبات مثل sub وexp وiat)، وتوقيع. الترويسة والحمولة مشفرة Base64Url ويمكن فك تشفيرها بدون مفتاح. التوقيع يتطلب المفتاح السري للتحقق. فك التشفير يكشف المحتوى لكن لا يضمن صحته.
خطوة بخطوة
-
قم بتقسيم الرمز المميز إلى ثلاثة أجزاء
يبدو JWT مثل xxxxx.yyyyy.zzzzzz. قم بالتقسيم على حرف النقطة للحصول على الرأس (الجزء 0)، والحمولة (الجزء 1)، والتوقيع (الجزء 2). إذا لم يكن هناك ثلاثة أجزاء بالضبط، يكون الرمز المميز مشوهًا.
-
Base64URL - فك تشفير الرأس
الرأس عبارة عن كائن JSON مشفر باستخدام Base64URL مثل {"alg": "HS256"، "typ": "JWT"". يستخدم Base64URL - و _ بدلاً من + و / ويحذف الحشو. قم بفك تشفيرها، ثم JSON.parse لقراءة الخوارزمية والكتابة. يقوم جهاز فك التشفير JWT الخاص بنا بذلك تلقائيًا.
-
Base64URL-فك تشفير الحمولة (المطالبات)
الحمولة هي كائن JSON من المطالبات. تشمل المطالبات المسجلة iss (المصدر)، sub (الموضوع)، aud (الجمهور)، exp (انتهاء الصلاحية)، nbf (ليس قبل)، iat (صدر في)، وjti (معرف الرمز المميز). تكون المطالبات الخاصة خاصة بالتطبيق (مثل الدور والبريد الإلكتروني). قم بفك التشفير والفحص، ولكن لا تثق حتى يتم التحقق منه.
-
التحقق من انتهاء الصلاحية وليس قبل المطالبات
exp وnbf هما طوابع زمنية لنظام Unix (بالثواني). إذا تجاوز الوقت الحالي انتهاء الصلاحية، فستنتهي صلاحية الرمز المميز ويجب رفضه. إذا كان الوقت الحالي قبل nbf، فإن الرمز المميز غير صالح بعد. تحقق من جانب العميل لتجربة المستخدم هذه، ولكن قم بفرضها من جانب الخادم للأمان.
-
التحقق من التوقيع على الخادم (ليس من جانب العميل أبدًا)
التوقيع هو HMAC-SHA256 (سري، header.payload) لـ HS256، أو RSA/ECDSA التوقيع لـ RS256/ES256. يتطلب التحقق المفتاح السري أو العام، والذي يجب ألا يصل إلى المتصفح مطلقًا. استخدم مكتبة مثل jsonwebtoken (Node) أو jose للتحقق - لا تكتب تشفيرًا خاصًا بك أبدًا.
أمثلة
نموذجي JWT (ثلاثة أجزاء)
مدخل: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpmeJf36POk6yJV_adQssw5c
الإخراج: Header: {"alg":"HS256","typ":"JWT"} Payload: {"sub":"1234567890","name":"John Doe","iat":1516239022}
الحمولة التي تم فك تشفيرها مع المطالبات القياسية
مدخل: حمولة رمز المصادقة الحقيقي
الإخراج: {"sub":"user-42","iss":"freeonlinetoolsgo.com","exp":1767229200,"iat":1767225600,"role":"admin"}
كشف الرمز المميز منتهية الصلاحية
مدخل: تاريخ انتهاء الصلاحية: 1609459200 (2021-01-01) تم التحقق منه بتاريخ 2026-08-28
الإخراج: Token is expired —current time (1767225600) > exp (1609459200). Reject and prompt re-login.
المشاكل الشائعة
- التعامل مع فك التشفير على أنه تحقق: يمكن لأي شخص صياغة JWT بأي مطالبات وتوقيع مزيف. يقرأ فك التشفير الحمولة ولكنه لا يثبت شيئًا. تحقق دائمًا من التوقيع باستخدام المفتاح السري/العام الموجود على الخادم قبل الثقة في المطالبات.
- باستخدام خوارزمية "لا شيء": تسمح المواصفات JWT بـ alg: none للرموز المميزة غير الآمنة. إذا قبلت أداة التحقق الخاصة بك alg: none، فيمكن للمهاجم تزوير الرموز المميزة. قم بتكوين مكتبتك بحيث لا ترفض أي شيء وتضع الخوارزميات المتوقعة في القائمة البيضاء.
- تخزين JWTs في localStorage: يمكن لـ XSS قراءة localStorage وإخراج الرموز المميزة. تفضل ملفات تعريف الارتباط httpOnly، الآمنة، SameSite=Strict للرموز المميزة للجلسة، أو الرموز المميزة في الذاكرة قصيرة العمر مع ملف تعريف ارتباط الرمز المميز للتحديث.
- عدم التحقق من exp/aud/iss: الرمز المميز المسروق صالح حتى تنتهي صلاحيته. تحقق دائمًا من EXP (انتهاء الصلاحية) وAUD (الجمهور المستهدف) وISS (المصدر) في كل طلب لمنع إعادة تشغيل الرمز المميز عبر الخدمات.
نصائح
- استخدم رموز الوصول قصيرة الأمد (15 دقيقة) بالإضافة إلى رموز التحديث طويلة الأمد — وهذا يحد من النافذة في حالة سرقة رمز الوصول.
- تفضل RS256 (غير متماثل) على HS256 (متماثل) عندما تتحقق خدمات متعددة من الرموز المميزة: تحصل كل خدمة على المفتاح العام، والمصدر فقط لديه المفتاح الخاص.
- استخدم وحدة فك الترميز JWT أثناء التطوير لفحص ما يصدره الخادم — فهو يعرض الرأس الذي تم فك تشفيره والحمولة وملخص المطالبة الذي يمكن قراءته بواسطة الإنسان دون إرسال الرمز المميز إلى أي مكان.
- لا تضع أبدًا بيانات حساسة (كلمات المرور ومعلومات تحديد الهوية الشخصية) في حمولة JWT - فهي مشفرة بـ Base64 وليست مشفرة، ويمكن لأي شخص يعترض الرمز المميز قراءة كل مطالبة.