امنیت api-key در فرانت-اند | کلوژراسکریپت

سلام. سوال من دو بخشه. یکی مربوط به جاوااسکریپت میشه و یکی مربوط به کلوژراسکریپت.

قضیه از این قراره که من دارم یه وبسایت درست میکنم به صورت SPA و دارم از کلوژر و کلوژراسکریپت استفاده میکنم و میخوام تمام ارتباطها از طریق وب‌سوکت اتفاق بیفته.
تقریبا پارسال خواستم همچین کاری رو انجام بدم و به مشکل خوردم. مثل اینکه الآن این مساله حل شده! (البته همچنان ممکنه فایروال دلش بخواد بعد از یه مدت وب‌سوکت رو ببنده و البته الآن از jetty استفاده میکنم که یه تایم‌اوت ۵دقیقه‌ای داره)

میدونیم که نگهداری api-key توی کوکی کار خوبی نیست. دلایلش زیاده و میگن «اگه مجبورید توی کوکی نگه‌دارید، تایمش رو کم کنید که مثلا بیشتر از ۲۴ساعت قابل استفاده نباشه». من این مشکل رو حل کردم و هربار که صفحه ریفرش میشه کلید جدید میسازم و با ۵دقیقه idle یا close شدن وب‌سوکت، کلا حذفش میکنم. (کلیدم یه استرینگ رندم ۳۲ کاراکتریه)
به خاطر اینکه با هر‌بار ریفرش صفحه، کلید عوض میشه، میخوام کلید رو توی یه متغیر معمولی نگه‌دارم (در front-end)

حالا سوال:

  • درمورد جاوااسکریپت: آیا نگه‌داری کلید در یک متغیر ساده‌ی js که global هم هست، مشکلی داره؟ مثلا اگه از لایبرریهای خارجی استفاده کرده باشم یا شاید پلاگینهای بروزر بتونن متغیرها رو بخونن؟
  • درمورد کلوژراسکریپت: آیا خطرهای سوال قبلی تهدیدم میکنه اگه توی atom مربوط به re-frame نگه‌ش دارم؟ اصلا ذات این اتم چیه؟

توضیح بیشتر:
وقتی صفحه ریفرش میشه، فرانت-اند یه وب‌سوکت باز میکنه و اولین پیامی که توی وب‌سوکت میگیره، کلید ۳۲کاراکتریه که باید از این به بعد استفاده کنه. یعنی کلید توی htmlی که از طرف سرور رندر گرفته میشه قرار نمیگیره.

  • به نظر شما این روش خوبیه؟

کلا چرا اینکارو میکنم؟
معمولا (اینطور که من فهمیدم) برای اینکه بفهمن این کاربری که الآن صفحه رو باز کرده همونیه که توی یه تب دیگه، وبسایت ما رو باز کرده، یه کلید خاص به هر کاربر اختصاص میدن که همیشه از اون کلید استفاده کنه و توی دیتابیس هم با همون کلید پیداش میکنن.
به خاطر مسائل امنیتی نمیخوام از کلید ثابت استفاده کنم (سختتر کردن impersonate) برای همین به هر کانکشن وب‌سوکت، یک کلید جدید میدم و توی بک-اند، یک یا چند کلید رو به یک کاربر اختصاص میدم. (یا به هیچ کاربری اختصاص نمیدم اگه هنوز لاگین نکرده باشه)

  • اگه فکر میکنید این کارم اشتباهه دوست دارم دلیلتون رو بدونم.

در مورد وب سوکت که مشکلی که داری از پیاده سازی وب سوکت تو مرورگر های مختلف هست. در مورد توکن باید بگم اگر توکن anonymous هست باید دسترسی رو سمت سرور کنترل کنی و اصلا مشکلی نیست دیگران این توکن رو داشته باشند. اگر می خوای برای کاربر های سیستم بعد از لاگین یه توکن بدی خیلی پیشنهاد می کنم از oauth2 استفاده کنی.

در نهایت atom هم یه جایی تو مموری رو برای ذخیره مقدارش انتخاب می کنه

1 Like

خوب اینطور که معلومه (caniuse) دیگه الآن 96درصد کاربرها از بروزر درست حسابی استفاده میکنن. کسی هم که بروزر قدیمی داره ازش خواهش میکنیم آپدیت کنه. به نفع خودشه.

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

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

میخواستم بدونم به روشهای معمول میشه محتواش رو خوند؟ منظورم از طریق devtools یا همچین چیزی بود.

بله در جریان هستم اما مثلا firefox عمدا این کار رو انجام میده. منظور اینه که مشکل شما جزئی از پیاده سازی websocket هست.

چرا نیست ؟

بله میشه. ولی جای نگرانی نداره اگر کاربر شما لاگین کرده فقط به توکن خودش باید دسترسی داشته باشه.

1 Like

مثل اینکه حل شده. توی این تستها مشکلی نداشتم، سیستمی هم که چیدم، اینو در نظر داشتم که مشکلات دفعه‌ی قبل رو نداشته باشم.
یکیش همینه که چندتا کانکشن رو به صورت unique بشناسه و (نمیدونم این کلمه جاش اینجا هست یا نه) سیستم abstract باشه که من به یوزرنیم پیام بفرستم و سیستم خودش بفهمه کدوم کانکشنها برای این یوزرنیم هست. (حالا یوزرنیم یا یه id یونیک)

خوب، oauth2 برای اینه که کاربر به جای وارد کردن یوزرنیم و پسورد، از طریق فیسبوک یا گیتهاب یا… لاگین کنه.
من الآن میخوام بفهمم این کلاینتی که بهم ریکوئست میزنه کیه. کاری با لاگین بودن یا نبودنش ندارم و البته آینده امکان لاگین از طریق فیسبوک و گیتهاب اضافه میشه، ولی الآن بحثم authentication نیست، بیشتر authorization هست.


درمورد بقیه‌ی توضیحات هم متشکرم.

oauth2 برای اینکار نیست. اما از اونجایی که اونا oauth provider هستند خیلی ها دیگه خودشون اینکار رو نمی کنن. اما شما می تونی provider خودت باشی. oauth2 جواب کار شماست

1 Like

داشتم به این‌هم فکر میکردم. سرم درد میکنه واسه اینجور چیزا (اگه غیر از این بود تا حالا پروژه رلیز شده بود :sweat_smile:) دیگه فکر کنم تبدیل شده به نقطه ضعفم :grin:

Don’t thing what’s the cheapest way to do it or what’s the fastest way to do it…
Think what’s the most amazing way to do it.
— Richard Branson —

کتابخونه آماده براش زیاد هست

1 Like

فعلا چیز زیادی براش پیدا نکردم. باید بیشتر بگردم. فعلا فقط friend-oauth2 رو پیدا کردم، نمیدونم به دردم بخوره یا نه.
ولی ممنون بابت راهنمایی.

1 Like