احراز هویت و شناسایی کاربر یکی از مهمترین قسمتهای هر نرم افزار تحت وب است. در این قسمت به مقایسه روش سنتی و روش مبتنی بر توکن برای احراز هویت کاربران می پردازیم.
احراز هویت کابران بصورت سنتی
قبل اینکه در مورد سیستم های احراز هویت بر اساس Token صحبت کنیم نگاهی داریم به سیستمهای سنتی . در سیستم های سنتی احراز هویت کاربر بصورت زیر است:
- کاربر در فرم ورود، نام کاربری و کلمه عبور رو وارد می کند و روی دکمه ورود کلیک میکند .
- درخواست به سرور فرستاده شده، در سرور با استفاده از query گرفتن از بانک اطلاعاتی، هویت کاربر تصدیق شده. و اگر اطلاعات درست بود یه session با استفاده از اطلاعات گرفته شده از بانک اطلاعاتی ساخته میشود، و اطلاعات session در هدر قرار گرفته و به کلاینت فرستاده می شود، session_id هم در مرورگر ذخیره می شود.
- با اطلاعات session مرورگر، درخواست ها برای ورود به قسمت های مدیریتی و حفاظت شده که نیاز به لاگین دارند، پاسخ داده می شود.
- در همه درخواست های بعدی از سرور وجود سشن بررسی شده و اجازه دسترسی داده می شود.
تا این نقطه همه چیز به خوبی پیش می رود و کاربران می توانند پس از ورود به سیستم به قسمت های ممنوعه سایت دسترسی پیدا کنند. مشکل زمانی پیدا میشود که میخواهیم از کلاینت هایی مثل اپلیکیشن اندروید یا اپلیکیشن دسکتاپ به سیستم متصل شوید.
اینجا دو اشکال برای احراز هویت کاربر با روش سنتی وجود دارد:
- session و cookie ها برای کلاینتهای موبایل هیچ مفهومی نداشته و شما نمی توانید session یا cookie رو با اپلکیشن موبایل به اشتراک بگذارید و استفاده کنید.
- در این سیستم جوابی که از طرف سرور می آید یک صفحه html هست و شما نیاز به JSON یا XML دارید تا اپلیکشن موبایل بتواند آنرا پردازش کند. در این حالت شما یک سیستم مستقل از کلاینت نیاز دارید.
سیستم احراز هویت بر اساس Token
در سیستم احراز هویت بر اساس توکن شما نمیتونید از session و cookie استفاده کنید. حالا سناریوی سیستم قبلی را برای Token دوباره طراحی می کنیم، روش Token از الگوریتم زیر استفاده میکند :
- کاربر نام کاربری و کلمه عبور رو وارد کرده و روی دکمه ورود کلیک میکند.
- بعد اینکه درخواست فرستاده شد، در سمت back-end با استفاده از query گرفتن از بانک اطلاعاتی، هویت کاربر تصدیق شده و اگر اطلاعات درست بود یک toekn با استفاده از اطلاعات گرفته شده از دیتابیس ساخته میشود و در بانک اطلاعاتی ذخیره می شود. و شما هم میتوانید این token در سمت کلاینت ذخیره کنید.
- هر بار همراه هر درخواست باید این token را به سرور بفرستید.
- اگر token فرستاده شده صحیح باشد اجازه دسترسی به آن قسمت اپلیکشین دارید .
در این حالت session یا cookie لازم نیست استفاده شوند و پاسخ سرور هم بصورت HTML نیست، یعنی اینکه شما میتوانید از این ساختار برای هر اپلیکیشنی استفاده کنید. شمای ساختار را می توانید در تصویر زیر ببنید:
در تصویر بالا دو جا کلمه JWT هست، JWT با حرفهای اول Json Web Token ساخته شده و یه فرمت است که در هدرهای احراز هویت استفاده میشود. این Token به شما کمک میکند تا ارتباط بین دو سیستم را به صورت امن طراحی کنید. در این مطلب ما JWT رو “bearer token” فرض میکنیم، bearer token از سه قسمت تشکیل شده است:
- header : نوع توکن و رمزگذاری را ذخیره میکند که در مثال از رمزگذاری base-64استفاده شده است .
- payload شامل اطلاعات است. شما هر مدل دادهای از جمله اطلاعات کاربر و هر چه که میخواهید را میتوانید به صورت رمزگذاری شده base-64 در اینجا ذخیره کنید.
- امضا شامل ترکیبheader , پی لود(payload) و کلید رمز (secret key) است. کلید رمز باید روی سرور به صورت امن نگه داشته باشد.
ساختار شمای JWT و یه مثال از Token در عکس زیر قابل مشاهده هست.
نیاز نیست bearer token رو خودتان بسازید، بلکه با زیان های مختلف نوشته شده و می توانید در جدول زیر لیست چند نمونه از آنها را ببینید:
NodeJS : github.com/auth0/node-jsonwebtoken
PHP : github.com/firebase/php-jwt
Java : github.com/auth0/java-jwt
Ruby : github.com/progrium/ruby-jwt
.NET : github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet
Python : github.com/progrium/pyjwt/