Code Module | کد ماژول
1.92K subscribers
357 photos
42 videos
6 files
356 links
Hello World 🌎

<> Earth is programmable if you code it </>

Group 👇🏻
@CodeModuleGap

Contact Us 👇🏻
@MrShahiin
@neoMahan
Download Telegram
احراز هویت با jwt 🗝🔒

در واقع JSON Web Token یا JWT یک استاندارد وب هست که روشی فشرده و خود شمول (self-contained) رو جهت انتقال امن اطلاعات بین مقصد های مختلف رو توسط یک شی JSON تعریف می‌کنه. این اطلاعات قابل تصدیق و اطمینان هستن، از این‌ رو که به صورت دیجیتال امضا می‌شن. JWT ها توسط یک کلید خصوصی (با استفاده از الگوریتم HMAC) و یا یک جفت  private key یا public key (توسط الگوریتم RSA) قابل امضا شدن هستن.


دو روش کلی و پرکاربرد اعتبارسنجی سمت سرور، برای برنامه‌های سمت کاربر وب وجود داره⬇️


روش اول Cookie-Based:

برای Authentication جزو پرکاربردترین روش ها هست و تو این حالت به ازای هر درخواست، یک کوکی برای اعتبارسنجی کاربر به سمت سرور ارسال میشه (و برعکس).

روش دوم Token-Based:

برای Authentication که بر مبنای ارسال یک توکن امضا شده به سرور، به ازای هر درخواسته.


مزیت‌های استفاده‌ی از روش مبتنی بر توکن چیه؟

🔵وابستگی به domain صدورش نداره و اصالتش بر اساس روش‌های رمزنگاری تصدیق می‌شه

🔵در حین کار با توکن‌ها، نیازی به ذخیره‌ اطلاعات داخل session سمت سرور نیست چون توکن، خود شمول (self-contained) هست.

🔵امروزه همینقدر که استاندارد JSON Web Token رو پیاده سازی کرده باشید، امکان کار با انواع و اقسام پلتفرم‌ها و کتابخانه‌ها رو هم دارید.

🔵حین استفاده از روش مبتنی بر توکن، امکان توزیع تمام فایل‌های برنامه (جاوا اسکریپت، تصاویر و غیره) توسط CDN وجود داره.


پ.ن: خود شمول به معنای اینه که payload توکن، شامل تمام اطلاعات مورد نیاز جهت اعتبارسنجی یک کاربره تا دیگه نیازی به کوئری گرفتن هر باره‌ از دیتابیس نباشه ( تو این روش مرسومه که فقط یکبار از دیتابیس کوئری گرفته بشه و اطلاعات مرتبط با کاربر رو امضای دیجیتال، و بعد ارسال می‌کنه )


#jwt #web #token #json
@CodeModule
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👌42
چه الگوریتمی برای ساخت توکن jwt انتخاب کنم؟ 🔒

هنگام پیاده سازی jwt برای اپلیکیشن های خودمون، یکی از تصمیمات کلیدی که باید بگیریم انتخاب الگوریتم امضای مناسب هست. JWT از الگوریتم های مختلفی پشتیبانی میکنه که رایج ترین اون ها HS256 و RS256 هست.

الگوریتم HS256 چیست؟

‏HS256 یک الگوریتم امضای متقارن هست. در رمزنگاری متقارن، هم برای امضا و هم برای تأیید توکن از یک کلید استفاده میشه. این کار اون رو ساده و کارآمد میکنه.

چه زمانی از HS256 استفاده کنیم؟

اگر عملکرد یک نگرانی کلیدی هست و شما در یک محیط قابل اعتماد کار می کنید (جایی که هر دو طرف امضا و تأیید یک راز رو به اشتراک میذارن)، HS256 میتونه انتخاب خوبی باشه. با این حال، از اونجا که امضا و تأیید هر دو به یک کلید متکی هستن، راز باید به طور ایمن محافظت بشه.


الگوریتم ‏RS256 چیست؟

‏RS256، یک الگوریتم امضای نامتقارن هست. برخلاف HS256، از یک جفت کلید استفاده میکنه: یک کلید خصوصی برای امضای توکن و یک کلید عمومی مربوطه برای تأیید اون. این امر RS256 را برای سناریوهایی که طرف‌های امضا و تأیید موجودیت‌های متفاوتی هستن، مانند سیستم‌های توزیع‌شده یا زمانی که توکن‌ها در سرویس‌های مختلف به اشتراک گذاشته میشه، ایمن‌تر میکنه.

چه زمانی از RS256 استفاده کنیم؟

اگر نگرانی اصلی شما امنیت هست، به ویژه در مواردی که چندین سرویس درگیر هستن و اعتبار سنجی توکن در محیط های مختلف اتفاق میوفته، RS256 به شدت توصیه میشه. با RS256، تنها نهادی که کلید خصوصی رو در اختیار داره میتونه توکن‌های معتبر صادر کنه، در حالی که هر کسی که به کلید عمومی دسترسی داره میتونه اون ها رو تأیید کنه.


اما رمزنگاری متقارن و نامتقارن چی هستن؟

رمزنگاری متقارن (به عنوان مثال، HS256) : در الگوریتم های متقارن، کلید مخفی یکسانی هم برای امضا و هم برای تأیید استفاده میشه. این رویکرد ساده و کارآمد هست، اما با خطره به خطر افتادن کلید همراه هست، زیرا هر دو طرف باید به طور ایمن یک کلید را به اشتراک بگذارند و مدیریت کنن.

رمزنگاری نامتقارن (به عنوان مثال، RS256) : در الگوریتم های نامتقارن، از دو کلید مختلف استفاده میشه: یک کلید خصوصی برای امضا و یک کلید عمومی برای تأیید. کلید خصوصی باید امن نگه داشته بشه، در حالی که کلید عمومی می تواند آزادانه توزیع بشه. این روش سطح بالاتری از امنیت رو ارائه میده.


به عنوان مثال من در پروژه خودم از RS256 استفاده کردم و به این صورت میتونید جفت کلید (private,public) رو بسازیم(با استفاده از openssl):

openssl genrsa -out token.prv.key 2048
openssl rsa -in token.prv.key -pubout -out token.pub.key

‏- token.prv.key: کلید خصوصی مورد استفاده برای امضای JWT.
‏- token.pub.key: کلید عمومی مورد استفاده برای تأیید JWT.

برای امضا و تایید این کلید ها میتونیم اینکار انجام بدیم:
// sign token with private key
jwt.sign(payload, prvkey, {
expiresIn: exp,
algorithm: 'RS256',
});

// verify token with public key
jwt.verify(token, pubkey, { algorithms: ['RS256'] })


برخی از best Practices برای ساخت کلید ها :

1. کلید خصوصی خودتون رو پابلیک نکنید: کلید خصوصی شما باید همیشه محرمانه بمونه.

2. استفاده از کلیدهای قوی: هنگام تولید کلیدهای RSA، اندازه کلید حداقل 2048 بیت برای RS256 توصیه میشه.

3. انقضای توکن: همیشه یک زمان انقضا معقول برای توکن‌های خود («exp») تعیین کنین تا خطر استفاده طولانی‌مدت از توکن‌های دزدیده شده رو کاهش بده.

انتخاب بین HS256 و RS256 بستگی به نیازهای خاص پروژه شما داره. اگر برای کارایی و سادگی ارزش قائل هستید و روی امضا و تأیید کنترل دارید، HS256 انتخاب خوبی هست. از طرف دیگه اگر امنیت اولویت بیشتری داره. RS256 گزینه امن‌تری هست.

#jwt
@CodeModule
👌12🔥52😁1