لینکدین توضیح می دهد: چگونه JWT های خود را ایمن کنیم

Summarize this content to 400 words in Persian Lang
به عنوان بخشی از برنامه بسیار مؤثر صبحگاهی “من را هرچه سریعتر از رختخواب بیرون بیاور”، ساعت 7 صبح بود و من در لینکدین پیمایش می کردم.
و من این پست رو دیدم…
من را در زمان بی سابقه ای از رختخواب بیرون آورد، اما در تمام طول روز با احساس عصبانیت و انقباض در اطراف پرسه می زدم (یک عارضه جانبی روال، گاهی اوقات شما تحریک می شوید).
در این پست وبلاگ، من میخواهم نقطه به نقطه اشاره شده توسط برادر در پست بالا را بررسی کنم و در واقع سعی کنم نگرانیهای امنیتی، عملکرد و استفاده عمومی JWTها را توضیح دهم.
زیرا، انصافاً، برخی از ما که کمی بیش از حد عملی هستیم (از جمله خودم) معمولاً در سالهای اولیه زندگی خود وقت کافی برای بررسی رمزنگاری و اصول امنیتی نداریم.
تئوری!
اکنون که دامنه توجه بسیار کم شما را جلب کرده ام، نوبت به نظریه ای رسیده است که شما با خوشحالی از آن گذشتید!
وا..وای…صبر کن! صبر کن
برگه را نبندید! به من گوش کن…
من قول می دهم، اگر ادامه دهید، یک لحظه “آها” را از این پست حذف خواهید کرد.
بر خلاف جعلی برادر “آره من آن را احساس کردم، شگفت انگیز بود، حالا برو بخواب” “آها” این در واقع یک “آها” خواهد بود.
پر از لذت زمین لرزان.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0OTM3ZWFhMC1lMzcyLTQ2OTItOTAxMS05MTA2ODliZjU0YzIiLCJpc3MiOiJhcHBsZS5jb20iLCJleHAiOjE3MjYzNDk0NDQsImlhdCI6MTcyNjM0MjI0NH0.zP46kmVHlANxt-dPJyA5WiRK_pX-EsYJWZnG2wd-h4U
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
بیایید با این نشانه شروع کنیم.
چی میبینی؟ بیهوده اونگا بونگا رشته های 3 نقطه ای جدا شده.
بیرون آوردن هر کدام…
# 1 (HEADER)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
# 2 (PAYLOAD)
eyJzdWIiOiI0OTM3ZWFhMC1lMzcyLTQ2OTItOTAxMS05MTA2ODliZjU0YzIiLCJpc3MiOiJhcHBsZS5jb20iLCJleHAiOjE3MjYzNDk0NDQsImlhdCI6MTcyNjM0MjI0NH0
# 3 (SIGNATURE)
zP46kmVHlANxt-dPJyA5WiRK_pX-EsYJWZnG2wd-h4U
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
2 بخش اول این توکن رشته های کدگذاری شده base64 هستند.
بخش سوم ترکیبی از 2 بخش اول است که توسط یک “کلید مخفی” رمزگذاری شده است.
اگر از نماد base64 به شکل قابل خواندن توسط انسان گسترش دهید:
😯
به یاد داشته باشید دوست شما جاوا اسکریپت؟ راحت است atob تابعی که برای تبدیل رشته های کدگذاری شده base64 به رشته های معمولی تعبیه شده است، می توانید این موضوع را در اینجا در این برگه تأیید کنید.
رمزگذاری/رمزگشایی:تبدیل داده به/از فرمت متفاوت (به عنوان مثال کاراکتر معمولی به ascii یا بالعکس)
رمزگذاری/رمزگشایی:تبدیل داده ها به/از فرمت غیرقابل خواندن با هدف پنهان کردن اطلاعات.برای خواندن اطلاعات پنهان از متن رمزی به یک “کلید” نیاز دارد.
بخش اول شامل الگوریتم ENCRYPTION است که در امضا و سایر ابردادههای مربوط به خود توکن استفاده میشود.
بخش دوم دادههای واقعی است که میخواهید در اینجا رمزگذاری کنید، استاندارد به شما دستور میدهد از یک قرارداد نامگذاری خاص پیروی کنید و دادههایی که کدگذاری میکنید باید یک رشته JSON معتبر باشند (به RFC7519 مراجعه کنید).
اما چرا base64؟ که پست وبلاگ خود را می خواهد پس اینجاست (نه مال من).
اجازه دهید اکنون به بخش 3 در توکن خود نگاه کنیم.
رشته به درستی کدگذاری نشده است زیرا یک رشته کدگذاری شده base64 نیست.
این یک “امضا” است، بخشی که توکن را ضد دستکاری می کند (برو امنیتی).
در اینجا یک گرافیک برای درک این قسمت وجود دارد:
HMACSHA256 یکی از بسیاری از الگوریتم های رمزگذاری مورد استفاده با JWT ها است.
ما به یک “کلید” نیاز داریم که نتیجه به هم پیوسته HEADER (#1) و PAYLOAD (#2) را رمزگذاری کند.
نتیجه ای که از این تابع رمزگذاری به دست می آید، unga bunga واقعی است، تا زمانی که کلید را در اختیار داشته باشیم.
اگر قسمتهای هدر یا محموله در یک توکن دستکاری شوند، نتیجه عملکرد رمزگذاری تغییر میکند و با امضای موجود در توکن مطابقت نمیکند.
برای این نوع عدم تطابق، کتابخانههای JWT خطاهایی ایجاد میکنند، زیرا ممکن است توکن دستکاری شده باشد.
از این رو، هرگونه دستکاری در JWT منجر به شکستن توکن می شود.
🤯
حالا، اگر شخصی به این «کلید» شما دسترسی پیدا کند، چه میشود؟ خوب… آنها می توانند از این کلید برای ایجاد نشانه هایی به میل خود برای جعل هویت هر کاربر و ایجاد امضای معتبر برای آن JWT ها استفاده کنند (panik).
برای همین برادر گفت:
🔑 کلیدهای مخفی قوی: همیشه مطمئن شوید که کلید مخفی شما به سختی شکسته می شود و ایمن ذخیره می شود.
برای کسب اطلاعات بیشتر در مورد JWT می توانید از این وب سایت استفاده کنید: jwt.io
اما، چرا JWT؟
اکنون که آناتومی اساسی یک JWT را میدانید، بیایید در مورد «چرا» پشت آن بحث کنیم.
همانطور که می دانید JWT ها عمدتا در مکانیسم های احراز هویت استفاده می شوند.
قبل از JWTs، ما در هنگام ورود به هر کاربر یک رشته unga bunga با نام مستعار جلسه ID اختصاص میدادیم.
شناسه جلسه صرفاً در سمت سرور معنی دارد.
سرور این شناسههای جلسه را در ورودهای موفق ایجاد میکند و نقشهای را به شناسه کاربر و ابردادههای لازم در برابر آنها در پایگاه دادهای مانند Redis برای دسترسی سریع ذخیره میکند.
با این حال، به دلیل نگهداری نسبتاً زیاد احراز هویت مبتنی بر جلسه، افراد شروع به استفاده بیشتر از JWT کردهاند.
نگرانی های امنیتی
اگر مشکلات مهارتی را به صورت روزانه تجربه می کنید و روی برنامه ای کار می کنید که در آن کاربران می توانند چیزی را پست کنند که سایر کاربران در وب سایت می توانند ببینند.
این احتمال وجود دارد که یک آسیب پذیری XSS در برنامه وب شما وجود داشته باشد.
این بدان معنی است که کسی می تواند یک را اضافه کند محتوای ارسال شده خود را برچسب گذاری کنید، هنگامی که افراد محتوا را مشاهده می کنند، آن را از راه دور در مرورگرهای همه اجرا کنید و همه چیز از جمله JWT کاربران را از LocalStorage، SessionStorage و کوکی های ناامن می گیرند و به سرورهای خود ارسال می کنند.
مهاجم برای مدت زمانی که انقضا را تنظیم کرده اید به تمام حساب های کاربران آسیب دیده دسترسی خواهد داشت (exp) پارامتر در JWT.
به همین دلیل است که معمولاً توصیه می شود JWT های خود را کوتاه مدت نگه دارید زیرا … مشکلات مهارتی.
برای کاهش کامل این مشکل می توانید استفاده کنید HttpOnly کوکیها اما مجموعهای از بردارهای حمله احتمالی خود را دارند (مثلا حملات CSRF).
در نهایت، آمدن به پست لینکدین
🛡️ رمزگذاری توکنهایتان: من شروع به استفاده از CryptoJS برای رمزگذاری JWTها کردهام، که کار کردن با آنها را بسیار سختتر میکند.
همانطور که قبلاً در بخش تئوری مطالعه کردیم (برو دوباره از آن صرف نظر کردید؟)
JWT ها به لطف رمزنگاری ضد دستکاری هستند.
پس داداش داره اینجا اونگا بونگا میریزه…
⏳ تنظیم انقضای توکن: توکن ها را روی یک بند کوتاه با زمان انقضا سریع نگه دارید.
🔒 همیشه از HTTPS استفاده کنید: هرگز توکن ها را از طریق HTTP ساده ارسال نکنید—HTTPS تا آخر!
ChatGP-bro این را کاملاً در اینجا دریافت کرده است، به طور کلی شیوه های خوبی است.
✔️ اعتبار سنجی توکن ها را به درستی انجام دهید: فقط بررسی نکنید که آیا یک توکن وجود دارد، بلکه مطمئن شوید که در سمت سرور قانونی است.
چه کسی در اینجا rawdawgin' آنها روش تقسیم رشته و atob توابع برای دریافت JSON؟ از یک کتابخانه خوب استفاده کن برادر
اما بله، Geminbro این یکی را نیز به درستی دریافت کرد… از نظر فنی. این کار را نکن
نتیجه گیری
من یک توطئه دارم.
برادر عمداً یک پست نسبتاً ناخوشایند گذاشت … و صدای من را بشنوید …
کار کرد.
مردم در نظرات بسیار درگیر هستند، برخی از PM و HR پست او را مفید می دانند، در حالی که توسعه دهندگان در حال تصحیح او هستند.
افرادی که نظرات را اسکرول نکردند، اکنون فکر می کنند JWT ها بد هستند.
اگرچه او احتمالاً ارتباطات جدید زیادی پیدا می کند.
منظورم این است که اتصالات لینکدین به معنای **** نیست، اما با این حال، نیاز باستانی برای تأیید این قبیله در واقع unga bunga القاکننده دوپامین است.
من خودم در دام او افتادم و آنقدر تحریک شدم که تصمیم گرفتم از غارم بیرون بیایم و این پست را بنویسم.
شما می توانید با لایک کردن این پست به من تزریق دوپامین بدهید.
می خواهید در مورد چیزی بحث کنید؟ نظرات همیشه خوش آمدید!
با تشکر برای خواندن.
به عنوان بخشی از برنامه بسیار مؤثر صبحگاهی “من را هرچه سریعتر از رختخواب بیرون بیاور”، ساعت 7 صبح بود و من در لینکدین پیمایش می کردم.
و من این پست رو دیدم…
من را در زمان بی سابقه ای از رختخواب بیرون آورد، اما در تمام طول روز با احساس عصبانیت و انقباض در اطراف پرسه می زدم (یک عارضه جانبی روال، گاهی اوقات شما تحریک می شوید).
در این پست وبلاگ، من میخواهم نقطه به نقطه اشاره شده توسط برادر در پست بالا را بررسی کنم و در واقع سعی کنم نگرانیهای امنیتی، عملکرد و استفاده عمومی JWTها را توضیح دهم.
زیرا، انصافاً، برخی از ما که کمی بیش از حد عملی هستیم (از جمله خودم) معمولاً در سالهای اولیه زندگی خود وقت کافی برای بررسی رمزنگاری و اصول امنیتی نداریم.
تئوری!
اکنون که دامنه توجه بسیار کم شما را جلب کرده ام، نوبت به نظریه ای رسیده است که شما با خوشحالی از آن گذشتید!
وا..وای…صبر کن! صبر کن
برگه را نبندید! به من گوش کن…
من قول می دهم، اگر ادامه دهید، یک لحظه “آها” را از این پست حذف خواهید کرد.
بر خلاف جعلی برادر “آره من آن را احساس کردم، شگفت انگیز بود، حالا برو بخواب” “آها” این در واقع یک “آها” خواهد بود.
پر از لذت زمین لرزان.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0OTM3ZWFhMC1lMzcyLTQ2OTItOTAxMS05MTA2ODliZjU0YzIiLCJpc3MiOiJhcHBsZS5jb20iLCJleHAiOjE3MjYzNDk0NDQsImlhdCI6MTcyNjM0MjI0NH0.zP46kmVHlANxt-dPJyA5WiRK_pX-EsYJWZnG2wd-h4U
بیایید با این نشانه شروع کنیم.
چی میبینی؟ بیهوده اونگا بونگا رشته های 3 نقطه ای جدا شده.
بیرون آوردن هر کدام…
# 1 (HEADER)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
# 2 (PAYLOAD)
eyJzdWIiOiI0OTM3ZWFhMC1lMzcyLTQ2OTItOTAxMS05MTA2ODliZjU0YzIiLCJpc3MiOiJhcHBsZS5jb20iLCJleHAiOjE3MjYzNDk0NDQsImlhdCI6MTcyNjM0MjI0NH0
# 3 (SIGNATURE)
zP46kmVHlANxt-dPJyA5WiRK_pX-EsYJWZnG2wd-h4U
2 بخش اول این توکن رشته های کدگذاری شده base64 هستند.
بخش سوم ترکیبی از 2 بخش اول است که توسط یک “کلید مخفی” رمزگذاری شده است.
اگر از نماد base64 به شکل قابل خواندن توسط انسان گسترش دهید:
😯
به یاد داشته باشید دوست شما جاوا اسکریپت؟ راحت است atob
تابعی که برای تبدیل رشته های کدگذاری شده base64 به رشته های معمولی تعبیه شده است، می توانید این موضوع را در اینجا در این برگه تأیید کنید.
رمزگذاری/رمزگشایی:
تبدیل داده به/از فرمت متفاوت (به عنوان مثال کاراکتر معمولی به ascii یا بالعکس)رمزگذاری/رمزگشایی:
تبدیل داده ها به/از فرمت غیرقابل خواندن با هدف پنهان کردن اطلاعات.
برای خواندن اطلاعات پنهان از متن رمزی به یک “کلید” نیاز دارد.
بخش اول شامل الگوریتم ENCRYPTION است که در امضا و سایر ابردادههای مربوط به خود توکن استفاده میشود.
بخش دوم دادههای واقعی است که میخواهید در اینجا رمزگذاری کنید، استاندارد به شما دستور میدهد از یک قرارداد نامگذاری خاص پیروی کنید و دادههایی که کدگذاری میکنید باید یک رشته JSON معتبر باشند (به RFC7519 مراجعه کنید).
اما چرا base64؟ که پست وبلاگ خود را می خواهد پس اینجاست (نه مال من).
اجازه دهید اکنون به بخش 3 در توکن خود نگاه کنیم.
رشته به درستی کدگذاری نشده است زیرا یک رشته کدگذاری شده base64 نیست.
این یک “امضا” است، بخشی که توکن را ضد دستکاری می کند (برو امنیتی).
در اینجا یک گرافیک برای درک این قسمت وجود دارد:
HMACSHA256
یکی از بسیاری از الگوریتم های رمزگذاری مورد استفاده با JWT ها است.
ما به یک “کلید” نیاز داریم که نتیجه به هم پیوسته HEADER (#1) و PAYLOAD (#2) را رمزگذاری کند.
نتیجه ای که از این تابع رمزگذاری به دست می آید، unga bunga واقعی است، تا زمانی که کلید را در اختیار داشته باشیم.
اگر قسمتهای هدر یا محموله در یک توکن دستکاری شوند، نتیجه عملکرد رمزگذاری تغییر میکند و با امضای موجود در توکن مطابقت نمیکند.
برای این نوع عدم تطابق، کتابخانههای JWT خطاهایی ایجاد میکنند، زیرا ممکن است توکن دستکاری شده باشد.
از این رو، هرگونه دستکاری در JWT منجر به شکستن توکن می شود.
🤯
حالا، اگر شخصی به این «کلید» شما دسترسی پیدا کند، چه میشود؟ خوب… آنها می توانند از این کلید برای ایجاد نشانه هایی به میل خود برای جعل هویت هر کاربر و ایجاد امضای معتبر برای آن JWT ها استفاده کنند (panik).
برای همین برادر گفت:
🔑 کلیدهای مخفی قوی: همیشه مطمئن شوید که کلید مخفی شما به سختی شکسته می شود و ایمن ذخیره می شود.
برای کسب اطلاعات بیشتر در مورد JWT می توانید از این وب سایت استفاده کنید: jwt.io
اما، چرا JWT؟
اکنون که آناتومی اساسی یک JWT را میدانید، بیایید در مورد «چرا» پشت آن بحث کنیم.
همانطور که می دانید JWT ها عمدتا در مکانیسم های احراز هویت استفاده می شوند.
قبل از JWTs، ما در هنگام ورود به هر کاربر یک رشته unga bunga با نام مستعار جلسه ID اختصاص میدادیم.
شناسه جلسه صرفاً در سمت سرور معنی دارد.
سرور این شناسههای جلسه را در ورودهای موفق ایجاد میکند و نقشهای را به شناسه کاربر و ابردادههای لازم در برابر آنها در پایگاه دادهای مانند Redis برای دسترسی سریع ذخیره میکند.
با این حال، به دلیل نگهداری نسبتاً زیاد احراز هویت مبتنی بر جلسه، افراد شروع به استفاده بیشتر از JWT کردهاند.
نگرانی های امنیتی
اگر مشکلات مهارتی را به صورت روزانه تجربه می کنید و روی برنامه ای کار می کنید که در آن کاربران می توانند چیزی را پست کنند که سایر کاربران در وب سایت می توانند ببینند.
این احتمال وجود دارد که یک آسیب پذیری XSS در برنامه وب شما وجود داشته باشد.
این بدان معنی است که کسی می تواند یک را اضافه کند محتوای ارسال شده خود را برچسب گذاری کنید، هنگامی که افراد محتوا را مشاهده می کنند، آن را از راه دور در مرورگرهای همه اجرا کنید و همه چیز از جمله JWT کاربران را از LocalStorage، SessionStorage و کوکی های ناامن می گیرند و به سرورهای خود ارسال می کنند.
مهاجم برای مدت زمانی که انقضا را تنظیم کرده اید به تمام حساب های کاربران آسیب دیده دسترسی خواهد داشت (exp
) پارامتر در JWT.
به همین دلیل است که معمولاً توصیه می شود JWT های خود را کوتاه مدت نگه دارید زیرا … مشکلات مهارتی.
برای کاهش کامل این مشکل می توانید استفاده کنید HttpOnly
کوکیها اما مجموعهای از بردارهای حمله احتمالی خود را دارند (مثلا حملات CSRF).
در نهایت، آمدن به پست لینکدین
🛡️ رمزگذاری توکنهایتان: من شروع به استفاده از CryptoJS برای رمزگذاری JWTها کردهام، که کار کردن با آنها را بسیار سختتر میکند.
همانطور که قبلاً در بخش تئوری مطالعه کردیم (برو دوباره از آن صرف نظر کردید؟)
JWT ها به لطف رمزنگاری ضد دستکاری هستند.
پس داداش داره اینجا اونگا بونگا میریزه…
⏳ تنظیم انقضای توکن: توکن ها را روی یک بند کوتاه با زمان انقضا سریع نگه دارید.
🔒 همیشه از HTTPS استفاده کنید: هرگز توکن ها را از طریق HTTP ساده ارسال نکنید—HTTPS تا آخر!
ChatGP-bro این را کاملاً در اینجا دریافت کرده است، به طور کلی شیوه های خوبی است.
✔️ اعتبار سنجی توکن ها را به درستی انجام دهید: فقط بررسی نکنید که آیا یک توکن وجود دارد، بلکه مطمئن شوید که در سمت سرور قانونی است.
چه کسی در اینجا rawdawgin' آنها روش تقسیم رشته و atob
توابع برای دریافت JSON؟ از یک کتابخانه خوب استفاده کن برادر
اما بله، Geminbro این یکی را نیز به درستی دریافت کرد… از نظر فنی. این کار را نکن
نتیجه گیری
من یک توطئه دارم.
برادر عمداً یک پست نسبتاً ناخوشایند گذاشت … و صدای من را بشنوید …
کار کرد.
مردم در نظرات بسیار درگیر هستند، برخی از PM و HR پست او را مفید می دانند، در حالی که توسعه دهندگان در حال تصحیح او هستند.
افرادی که نظرات را اسکرول نکردند، اکنون فکر می کنند JWT ها بد هستند.
اگرچه او احتمالاً ارتباطات جدید زیادی پیدا می کند.
منظورم این است که اتصالات لینکدین به معنای **** نیست، اما با این حال، نیاز باستانی برای تأیید این قبیله در واقع unga bunga القاکننده دوپامین است.
من خودم در دام او افتادم و آنقدر تحریک شدم که تصمیم گرفتم از غارم بیرون بیایم و این پست را بنویسم.
شما می توانید با لایک کردن این پست به من تزریق دوپامین بدهید.
می خواهید در مورد چیزی بحث کنید؟ نظرات همیشه خوش آمدید!
با تشکر برای خواندن.