What is Jwt and Refresh Token and Relation between Them , And Also What is Session Token
في المقال ده هتكلم عن jwt وايه علاقته ب refresh token وايه الفرق ما بين ال jwt وال session token
------------------------------------------------------------------------------------
خلينا في البداية نتفق ان ال Authentication و Authorizationهي من اهم الحاجات ال بتعملها علشان تخلي ال app بتاعك Secure ، طيب يعني ايه Authentication و يعني ايه Authorization ?
بدون الدخول في تفاصيل كتير ال Authentication دي حاجة من خلالها ال server بيعرف اذا كنت انت user عندة ولا لا ، يعني هل انت عامل signup عندة ولا لا
ال Authorization هي حاجة من خلالها السيرفر بيعرف اذا كنت ليك حق الوصول لحاجة معينه في الموقع ولا لا ، يعني خلاص user عندي واهلا وسهلاً بيك يا عم ، بس هل ده معناه انك علشان انت يعني Authentication يبقي ليك الحق انك توصل لاي حاجة عندي ؟ الاجابة لا ، ومثال علي كده Admin dashboard انت علشان تدخلها لازم تكون authenticated وكمان لازم تكون Authorized.
فدلوقتي تعال نعرف ايه هو ال jwt وازاي بيساعدنا في ال Authentication وفي ال Authorization
ال JWT ده اختصار لـ "Json web Token" وده عباره عن والتفاصيل الخاصة به موجوده في RFC 7519 وده عباره عن document فيه كل ال specification بس somehow in abstract ، بس لو حبيت تفهم تفاصيل زيادة تقدر تدور علي ال RFC 7519
ف ال JWT هو طريقه لتبادل المعلومات بشكل آمن او مش آمن اوي لانه ممكن يتكسر ، ما بين طرفين علي شكل Json object ، وزي ما احنا عارفين ان ال json object طريقه محببة لاطراف بانهم يتبادلوا المعلومات ما بينهم علي هذا الشكل ، والنظام ال بيعتمد الطريقه دي في Authentication بيسموه stateless authentication وده معناه ان السيرفر او الباك اند يعني مش بيحتفظ بأي State عن ال user ده لما يعمل authentication ، وعلي عكسة تماماً الطريقه التقليدية ال بتسمي session token وال فيها ال server بيحتفظ باي شكل ب token ده وكل المعلومات عن صاحب التوكن ده والطريقه دي بيسموها statefull authentication
في ال stateless authentication ال client بيبعت كل الداتا ال السيرفر محتاجها علشان يتعرف علي ال authenticated person ، والسيرفر بقا يعمل validate للداتا دي وعلي اساسها هيحدد هيرد بأيه ، لكن في statefull ال Client برضوا بيبعت ال session token ومن خلالة بيروح يعمل request اضافي للداتا بيز مثلا علشان يشوف ال session token ده عنده ولا لا
طيب قبل ما نعرف ازاي ال server بيعمل validate ل token بتاع ال jwt من غير ما يكون مسجل عنده اي حاجة عنه ، تعال نعرف شكله الاول
ال jwt عباره عن token كبير شويه ، متقسم لتلاث اجزاء وكل جزء مفصول عن التاني ب . وكل جزء كمان له اهمية واسم ، وكل جزء معمولة encoding ك Base64Url وده مختلف عن Base64 ، والسبب علشان نبعته بشكل امن في url
ملحوظه : ال Base64 character set مختلفة بشكل بسيط جداً عن ال Base64 Character set
فتاني احنا قولنا ال jwt متقسم لتلات اجزاء كل جزء له اسم ، وبالترتيب كده اول جزء في token ده اسمة Header وده عباره عن object لما يحصلة decoding فيه خاصيتين مهمين اول واحدة نوع ال token وفي حالتنا هنا هيبقي JWT وتاني خاصية نوع ال algorithm ال هيعمل validate ل token دة
تاني جزء من ال token ال بعد اول . اسمة payload وده فيه معلومات السيرفر باعتها ، والمعلومات دي بنسميها claims وال claims دي احنا بنستخدمها في authorization وتالت جزء في token ده بنسمية ، ب Signature ، وده اتكون عن طريق اننا خدنا ال جزء بتاع ال header والجزء بتاع payload واستخدمنا ال Algorithm ال احنا محددينه في haeder وكمان اديناله secret key وده key مهم جداً متسجل علي السيرفر محدش يعرفه غيرنا ، لانه لو اتعرف كانك مستفدتش حاجة من ال jwt وبعد ما ال Algorithm يشتغل هيطلع الناتج ، والناتج ده هيكون هو الجزء الثالث من ال jwt
وده مثال علي شكل jwt
الجزء الخاص ب payload ده جزء مهم لانه ده من خلالة بنقدر نعرف ال autorization وال payload ده عباره عن claims وشويه معلومات تانية ، وال claims دي متقسمة لثلاث انواع اول حاجة ال Registered claims وال Claims بشكل عام عباره عن properties ، وال registered claims عباره عن properties متعرفة زي ال exp property وال شايلة ال experiation date ، وعندنا ال public claims ودي عباره عن احنا ال بنعرفه ، يعني اي داتا عايزين نبعتها يعني اي اسم انت عايز حطة زي مثلا ال role بتاع ال user وبرضوا ليها list الناس متفقين فيها علي المسميات ال ممكن تحطها ، النوع الاخير ال هو ال private ده اسم انت متفق فيه مع الناس ال فيه enviroment بتاعك ، وهي خاصية ليها معني بالنسبالكوا
طيب دلوقتي احنا اتفقنا انك كل لما بتعمل request للسيرفر انت بتبعتله ال jwt ده ، طيب ازاي السيرفر بيعمل validate ل jwt ده ويشوفة صح ولا لا ، وهو اصلا ميعرفش اي حاجة عنه ، قالك هو عندة secret key ، فاول لما يجيلة ال token هياخد اول جزئين منه ال هو ال header و payload ويطبق عليهم الالجورزم بتاعه ال encoding ويشوف الناتج ، لو طلع نفس الناتج ال موجود في الجزء الاخير بتاع ال jwt يبقي ال jwt ده صح وانا ال مطلعه ، ولو لا يبقي ال jwt ده ملعوب فيه وغلط ، وساعتها هرد واقولة ان ال jwt ده مش صح
فدلوقتي انا ممكن احط اي نوع من انواع الداتا وانا مطمن محدش هيقدر يلعب فيها ، علشان لو لعب فيها انا هعرف
فيعني للتبسيط ، اعتبر الجزء الاخير بتاع ال jwt عباره عن ختم ، وانت لما بتبعت ال jwt للسيرفر فهو عنده محقق ماسك عدسة ، وقاعد يشوف الختم ده صح ولا مزور
ملحوظه : ال jwt مش معمول علشان تحط فيه معلومات مهمه زي الباسورد طبعاً ، لان ال header و payload بيحصلهم decoding بكل سهولة ، في مواقع كتير بتعمل decoding ل base64url وهتقدر تقرا الداتا ال فيها ،
فتعال اوريك صوره من الموقع الرسمي
شايف ازاي كل جزء بيتعملة decoding وبتشوف المعلومات ال شايلها ؟
فانا دلوقتي وفرت request للداتا بيز كنت بعمله مع ال Token العادي علشان اشوف ال Token ده موجود ولا لا ، وتبع انهي user
فعلشان نلخص الموضوع كلة :
ودلوقتي احنا فهمنا ال jwt و session token ودي صوره بتوضح الفرق
وعلشان نحاول نوفر لل user بتاعنا best user experience وكمان نحل مشكلة من مشاكل ال secuirty طلعلنا حاجة اسمها refresh token ، طيب ده عباره عن ايه ؟ بيقولك يا سيدي افترض انك عندي admin account وانت قررت انك تعملة disable فدلوقتي عايز تغير ال role ال موجوده في jwt بس ازاي وهو عامل login ومعاه jwt صحيح ، وبالنسبة للسيرفر فهو معاه jwt صحيح وفيه claim انه admin ، فاسهل حل اني اروح اغير ل secret key بس ده معناه ان كل ال user هيحصلهم logout وده طبعاً مش صح ، فقالك احنا هنخلي ال JWT ده له experiation قصير جداً وليكن ساعه ، بس انا كل شويه هيحصلي logout ? حاجة برضوا مش كويسه ل user ، فقالك خلاص احنا هيبقي عندنا token من نوع خاص السيرفر برضوا هيبعتهولنا اول مره لما نعمل login ، وده لما ال jwt بتاعنا وقته يخلص ، هيروح يبعتلنا request ويرجعلنا ب jwt جديد ، وطبعاً ال refresh token له وقت ولكن وقته اكبر من ال jwt ، ولكن برضوا ال refresh token له عيوب ، لانه لو attacker قدر يوصله ، فهو بقي acess زيه زي ال user وعلشان كده هو برضوا له وقت
طيب هل ال jwt له مميزات ؟ طبعاً واهم ميزه مثلا تخيل انك عندك اكتر من service وكل service شغاله ب jwt ل authentication ، فانت دلوقتي مش محتاج ان كل serivce يبقي ليها signup خاص بيها ، لان زي ما اتفقنا ، هو مش محتفظ ب token ولكن محتفظ ب secret key يقدر يعمل validate بيها ل token ، فاحنا بنحط ال secret key مثلا لكل ال services وبالتالي من خلال اي Service اقدر اعمل login
ودي حاجة مقدرش اعملها ب session token او يعني نقدر نعملها بطرق تانية ولكن مكلفة ، زي مثلا اني اعمل shared database ما بينهم ، وده هياخدنا لطريق تاني
Refrences :