پروتکل http، ارتباط بین کلاینت و سرور را برقرار میکند، همچنین این پروتکل وضعیت کاربر فعال را درون خود حفظ نمیکند و نیاز به اعتبارسنجی مجدد دارد.
تصور کنید زمانی که ما وارد اکانت فیسبوک خود میشویم و صفحه تنظیمات را انتخاب میکنیم، با توجه به اینکه پروتکل http وضعیت کاربر وارد شده را حفظ نمیکند ، ما مجددا نیاز به ورود به اکانت خود داریم.
به وسیله احراز هویت با session و یا token ما قادریم که به سرور بفهمانیم که در حال حاضر داخل حساب کاربری خود هستیم و باید به صفحه تنظیمات دسترسی داشته باشیم. بنابراین session و token برای غلبه بر این مشکل در درخواستهای http استفاده میشود.
فهمیدن مکانیزم احراز هویت توسط توسعهدهندگان به سبب ایجاد یک برنامه کاربردی قابل اطمینان و همچنین نگهداری اطلاعات کاربران بصورت امن، بسیار حائز اهمیت است.
در این مقاله، ما به طور خلاصه به مفهوم احراز هویت بر اساس session و token، همچنین ساختار JsonWebToken(JWT) میپردازیم.
احراز هویت برپایه Session
زمانی که کاربر وارد حساب خود در وبسایت میشود، سرور یک Session برای او ایجاد میکند و اطلاعات آن را در حافظه خود ذخیره میکند. پس از آن سرور، Session Id حاصل شده را در یک Cookie در جستجوگر (Browser) کاربر ذخیره میکند. پس از آن، تا زمانی که کاربر توسط سرور شناسایی شود، برای هر درخواست از Cookie ذخیره شده در جستجوگر او استفاده میشود.
در این صورت سرور قادر خواهد بود که Session Id ذخیره شده در Cookie را با اطلاعات Session ذخیره شده در حافظه سرور مقایسه کند تا کاربر را بصورت دقیق شناسایی و پاسخ را ارسال کند. همچنین در زمان خروج از حساب کاربری، Session ساخته شده، از پایگاه داده حذف خواهد شد.
تعریف دقیق Cookie
کوکی اساسا فضایی برای ذخیرهسازی دادهها بصورت محلی (Local) است، که وبسایتها میتوانند به آن دسترسی پیدا کنند، همچنین وظایف متفاوتی را از به یاد آوردن کالاهای سبد خرید تا احراز هویت ارائه میدهد.
کوکیها به عنوان یک مکانیزم قابل اطمینان برای وبسایتها در راستای به یادآوردن وضعیت و اطلاعات، یا ضبط کردن فعالیتهای کاربران، طراحی شدهاند.
احراز هویت برپایه Token
زمانی که ما در مورد احراز هویت بر اساس توکن صحبت میکنیم، در واقع اشاره اصلی ما به JWT یا همان JSON Web Token میباشد که امروزه به طور گسترده در صنایع استفاده میگردد و عملا به یک استاندارد در زمینه احراز هویت تبدیل شده است.
در احراز هویت برپایه توکن، سرور یک توکن امضا (Sign) شده را ایجاد و آن را به کلاینت ارسال میکند.
توکنJWT در سمت کلاینت ذخیره میشود و به عنوان header در هر یک از درخواستها ارسال میشود. پس از آن سرور توکن JWT را رمزگشایی کرده و در صورتی که توکن معتبر باشد، درخواست را پردازش و پاسخ آن را ارسال میکند. همچنین زمانی که کاربر از حساب خود خارج میشود، توکن در سمت کلاینت بدون هیچ تعاملی با سرور از بین میرود.
توکن JWT یک استاندارد برای انتقال ایمن دادهها بین کلاینت و سرور بصورت JSON میباشد. JWT عمدتا برای اثبات اینکه دادههای ارسالی در واقع توسط یک منبع معتبر ایجاد شده، استفاده میشود که شامل سه رشته متصل شده با کد Base64url است که توسط (.) از هم جدا شدهاند که عبارتند از:
یک JWT معمولا به شکل زیر میباشد:
xxxxx.yyyyy.zzzzz
بخش Header:
قسمت اول معمولا از دو بخش نوع Token و الگوریتم رمزنگاری (برای مثال RSA یا HS256) آن تشکیل میشود.
برای مثال:
{
“alg”: “HS256”,
“typ”: “JWT”
}
بخش Payload:
این قسمت شامل مجموعهای از اطلاعات کاربر(مانند id و authorities) و زمان تولید و انقضای توکن نیز میباشد. اطلاعات به سه نوع عمومی، خصوصی و به منظور ثبت تقسیم میشوند. همچنین نام هر فیلد برای دسترسی سریعتر به اختصار نوشته شده است.
مراقب باشید تا اطلاعات حساس مانند گذرواژه را در Payload قرار ندهید چراکه به راحتی قادر به رمزگشایی میباشد.
برای مثال :
{
“sub”: “123456789”,
“name”: “Anamika Ahmed”,
“admin”: true
}
بخش Signature:
این قسمت یک هش از Header، Payload و کلید Secret است که با استفاده از یک الگوریتم استاندارد رمزنگاری شده. معمولا در این قسمت از الگوریتمهای HS,RS,PS,ES استفاده میشود.
مزایای JWT :
- بدون نیاز به مدیریت Sessionها
- قابل استفاده همزمان برروی چند دستگاه مختلف
- بدون نیاز به ذخیره کوکی
- قابلیت استفاده برای اپلیکیشنها
- دارای زمان انقضا
- بدون نیاز به Logout
- آسان برای اشکال زدایی
- غیرمتمرکز
- جلوگیری از حملات CSRF
- عملکرد خوب
- برپایه استاندارد RFC7519
منبع