استفاده از JWT در Spring Security

خیلی دوس داشتم زودتر یه آموزش درباره این موضوع اینجا بذارم، یکی از علت های اصلی هم نبود منابع فارسی واسه کسایی بود که تازه میخوان توی این موضوع کار کنن؛ نمیخوام بگم چیزی که من اینجا منتشر میکنم منبع خیلی خفنِ فارسی این موضوع هستش ولی خوب واسه کسایی که میخوان شروع کن میتونه خیلی کمک کنهاولش باید یه دیدگاهی از JWT داشته باشیم که اصلا چی هست و کی به درد پروژه ما میخورهبرای نوشتن توضیحات درباره JWT از این مطلب کمک گرفتم که خیلی جامع و کامل توضیحش دادهدرباره JWT امروزه مسئله امنیت توی اپلیکیشن ها چیزی نیست که به راحتی از کنارش رد شیم، میلیون ها کاربر اطلاعات مهمشون رو توی اینترنت دارن و امن نگه داشتن این اطلاعات یکی از چالش های بزرگ برنامه نویس ها بوده و هست. خوشبختانه این یه مسئله جدیدی نیست و امروزه برنامه نویس ها ابزار های زیادی برای امن نگه داشتن اطلاعات کاربر در اختیار دارن که یکی از اونها JSON Web Tokens یا همون JWT هستش.توی این چندتا مقاله میخوام JWT رو توی چارچوب Spring پیاده کنم ولی خوب قبلش باید ببینم اصلا ساختار JWT چه شکلیه و چطور کار میکنه.اگه یه سرچ ساده توی گوگل بزنید حتما به این لینک برمیخورید که خیلی کامل JWT رو شرح داده و یه تعریف خیلی ساده و جامع از JWT میده:در واقع JSON Web Token ابزاری کم حجم و ایمن برای بیان ادعاهایی (claims) است که بین دو طرف قابل انتقال است. ادعاهای موجود در JWT به عنوان یه JSON Object رمزگذاری میشوند و در قسمت payload در معماری JSON Web Signature یا JWS و یا به صورت متن ساده در معماری JSON Web Encryption یا JWE استفاده میشن که این امکان را می دهد که ادعاهای دیجیتالی یا یکپارچگی با Message Authentication Code محافظت شوند.خوب فک کنم یکم پیچیده تر از اون چیزی بود که فک میکردیم واسه همین خیلی ساده شدش رو فعلا میگم حالا توی قدم های بعدی خیلی جزئی تر دربارش صحبت میکنیمخوب قاعدتا ما توی برنامه اطلاعاتی داریم که برای یکسری کاربر خیلی مهم هستن این کاربر میتونه ادمین باشه یا یه کسی که فقط داره از سرویس های برنامه استفاده میکنه و یکسری اطلاعات شخصی توی برنامه داره برای محافظت از این اطلاعات یه برنامه نویس باید یه سازوکاری تعریف کنه که هرکسی فقط به اطلاعاتی که براش تعریف شده دسترسی داشته باشه بعد از این فرایند ما باید اطلاعاتی که کاربر ازمون درخواست کرده رو به صورتی براش بفرستیم که اگه کسی تونست اطلاعات دریافتی کاربر از برنامه رو شنود کنه نتونه اونو بخونه به عبارت ساده تر با استفاده از یه کلید که بین کاربر و برنامه توافق شده ما اطلاعات رو کد میکنیم و براش میفرستیم ، کاربر هم با استفاده از اون کلید میتونه اطلاعاتی که خواسته بود رو بخونه.اجرای داخلی JWTوقتی کاربر login میکنه برنامه ما JWT براش درست میکنه که این شکلی هستش:header.payload.signatureقسمت Headerقسمت header شامل اطلاعاتی هستش که ما با استفاده از اون به کاربر میگیم که چطور باید JWT رو بخونن یا اصطلاحا اونو تفسیر کنن.قسمت Payloadقسمت Payload شامل تمام ادعاهای کاربر ما میشه؛ اگه بخوام خیلی خلاصه بگم این ادعاها میتونه شامل اطلاعات مثل نام کاربری یا سطح دسترسی که این کاربر داره.توی ادعاها ما می تونیم سه نوع ادعا داشته باشیم:registered, public, privateادعای registered از اون دسته اطلاعاتی هستن که وجودشون اجباری نیست مثل تاریخ ایجاد TOKEN یا تاریخ انقضاء .ادعای public این اطلاعات معمولا برای کسانی هستش که میخوان از JWT استفاده کنن .ادعای private میتونیم این اطلاعات رو بدون استفاده از دو مورد بالا ذخیره کنیم.قسمت SIGNATUREدر این قسمت نام الگوریتم هایی که با استفاده از انها header ,payload رو کد کردیم و همچنین کلید نوشته شده برای قسمت اول این کافیه سعی میکنم توی قسمت های بعدی شروع به پیاده سازی کنماگه خیلی خوب نمینویسم ببخشید ;)پیاده سازی در Spring Security رو میتونید اینجا ببنید.