احراز هویت توسط JWT
JWT چیست؟
JWT (مخفف JSON Web Tokens) رشتهای رمزشده میباشد که در header درخواست http گذاشته میشود تا با استفاده از آن بتوان کاربران را احراز هویت کرد. به این کد توکن (token) گفته میشود. معمولا با هش کردن دادههای JSON توسط کلید رمز به این توکن می رسیم.
JWT چگونه کار میکند؟
زمانی کاربر به صورت موفقیت آمیز لاگین میکند، توکن برای آن تولید میشود. این توکن مختص به هر کاربر میباشد و یکتاست. هر زمان که کاربر درخواست دسترسی به منبعی (resource) را میدهد، به همراه درخواست، توکن خود را در header میفرستد. سرور با decode کردن توکن میتواند بفهمد که آیا کاربر اجازهی دسترسی به منبع درخواستی را دارد یا خیر.
محتویات header به صورت زیر است:
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJaZXJvVG9IZXJvIiwiaWF0IjoxNTU3NTE2OTkwLCJleHAiOjE1ODkwNTMwMjUsImF1ZCI6Inplcm90b2hlcm8uaXIiLCJzdWIiOiJuYXZpZGFnejc2QGdtYWlsLmNvbSJ9.tTsJG6oCDfAcvlFoTdptHAjpczv-4D__YoF2c_Tx2zo
Bearer نشان دهنده این است که header حامل توکن است.
برای دیدن محتویات توکن میتوانید به سایت jwt.io مراجعه کنید. برای مثال محتویات توکن بالا به صورت زیر است:
دیاگرام پروسه به صورت زیر است:
- ابتدا کاربر روشهای موجود (نام کاربری/رمز عبور، گوگل و غیره) لاگین میکند.
- کاربر احراز هویت شده و توکن برایش تولید میشود.
- کاربر با استفاده از توکن دریافتی، درخواستی را برای دسترسی به منبع میدهد.
- اگر کاربر اجازه دیدن منبع را داشته باشید، منبع برگردانده میشود.
JWT چگونه ساخته میشود؟
اطلاعات مورد نیاز را میتوان توسط دو روش رمزگذاری کرد:
- با استفاده از کلید رمز (الگوریتم HMAC)
- با استفاده کلید عمومی/خصوصی (الگوریتم RSA و یا ECDSA)
در روش اول با استفاده از کلید رمز هم میتوان رمزگذاری کرد و هم رمزگشایی ولی در روش کلید عمومی/خصوصی، با کلید خصوصی رمزگذاری و با کلید عمومی رمزگشایی میشود.
ساختار JWT به چه صورت است؟
JSON Web Tokens از سه بخش که توسط نقطه از هم جدا شدند، تشکیل میشود. سه بخش آن عبارتاند از:
- Header
- Payload
- Signature
با این تفاصیل ساختار توکن به صورت زیر است:
xxxxx.yyyyy.zzzzz
Header
header معمولا از دو بخش تشکیل میشود: نوع توکن و الگوریتم رمزنگاری شده. به طور مثال برای توکن بالا به این صورت است:
{ "alg": "HS256", "typ": "JWT" }
Payload
قسمت payload حاوی اطلاعات مورد نیاز میباشد که به آنها claim میگویند. برای مثال در توکن بالا claim های ما به صورت زیر است:
- iss: که issuer یا صادر کننده توکن است.
- iat: که issued at یا زمان صادر شده توکن است.
- exp: که expiration time یا زمان انقضای توکن است.
- aud: که audience یا حضار یا همان دریافت کنندگان توکن هستند.
- sub: که subject یا موضوع توکن است.
Signature
امضای توکن برای بررسی صحت توکن استفاده میشود. برای مثال اگر از الگوریتم HMAC SHA256 استفاده کینم، امضا به صورت زیر تولید میشود:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
این امضا این امکان را به ما میدهد که مطمئن شویم توکن در بین راه دستکاری نشده باشد.
جمع بندی
در این مقاله دیدیم که JWT چیست و چگونه کار میکند. در مقاله بعدی با پیاده سازی و ایجاد این نوع توکنها آشنا میشویم.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.