ایزی ریت
ورود / ثبت‌نامورود

امنیت API Key در فرانت‌اند؛ چرا کلید وب‌سرویس را در جاوااسکریپت و اپ نگذارید

امنیت API Key در فرانت‌اند و موبایل: چرا کلید در مرورگر لو می‌رود، پروکسی سمت سرور، محدودیت IP و دامنه، متغیرهای محیطی، چرخش کلید و جلوگیری از انتشار در گیت.

عرفان فضلی
· کارشناس توسعه و برنامه نویسی
انتشار ۱۹ آبان ۱۴۰۵، ۱۶:۰۰ · ۳ دقیقه مطالعه
امنیت کلید API در فرانت‌اند
خلاصه در سه خط
  • هر چیزی که به مرورگر یا اپ برسد، قابل خواندن است؛ کلید API در جاوااسکریپت یا فایل APK امن نیست.
  • الگوی درست، پروکسی سمت سرور است: مرورگر از سرور شما می‌خواند و فقط سرور کلید را دارد.
  • محدودیت IP، کلید جدا برای هر پروژه، متغیر محیطی و اسکن خودکار مخزن کد، لایه‌های بعدی دفاع‌اند.

یکی از رایج‌ترین پیام‌هایی که پشتیبانی هر وب‌سرویسی دریافت می‌کند این است: سهمیه‌ام در یک روز تمام شد، در حالی که سایتم بازدید زیادی ندارد. تقریبا همیشه علت یکی است: کلید در کد سمت مرورگر بوده و کس دیگری از آن استفاده کرده است. در این مقاله امنیت API Key را در پروژه‌های فرانت‌اند و موبایل بررسی می‌کنیم.

i
API ایزی‌ریت
این راهنما با API قیمت ارز و طلای ایزی‌ریت کار می‌کند؛ مستندات کامل، نمونه‌کد و کلید رایگان در صفحهٔ API است.
★
پاسخ کوتاه
کلید API را هرگز در جاوااسکریپت صفحه، اپ موبایل یا مخزن کد قرار ندهید. یک مسیر روی سرور خودتان بسازید که با کلید از API بخواند و نتیجه را به مرورگر بدهد. کلید را در متغیر محیطی نگه دارید، محدودیت IP سرور را روی آن فعال کنید و برای هر پروژه کلید جدا بسازید.

این مقاله بخشی از آموزش API قیمت ارز و طلا است.

کلید در مرورگر چطور لو می‌رود؟

فرض کنید کد زیر را در صفحه گذاشته‌اید:

javascript
// ❌ اشتباه: کلید در کد سمت مرورگر
fetch("https://api.ezrate.me/v1/rates?symbols=usd", {
  headers: { "X-API-Key": "ezr_live_abc123…" } })

هر بازدیدکننده‌ای با فشار دادن F12 و رفتن به تب Network، همین درخواست و هدر آن را می‌بیند. حتی اگر کد را مبهم‌سازی (Obfuscate) کنید، کلید هنگام ارسال درخواست به‌صورت خوانا در هدر است. ربات‌هایی هم وجود دارند که صفحه‌های وب و مخزن‌های گیت‌هاب را برای الگوی کلیدهای شناخته‌شده اسکن می‌کنند.

در اپ موبایل هم وضع بهتر نیست. فایل APK با ابزارهای رایگان باز می‌شود و رشته‌های داخل کد خوانده می‌شود. ذخیره در فایل تنظیمات یا رمزنگاری با کلیدی که آن هم داخل اپ است، فقط کار را کمی سخت‌تر می‌کند، نه غیرممکن.

الگوی درست: پروکسی سمت سرور

مرورگر یا اپ از یک مسیر روی سرور شما می‌خواند. سرور کلید را دارد، درخواست را به API می‌فرستد، پاسخ را کش می‌کند و فقط دادهٔ لازم را برمی‌گرداند. این الگو دو مزیت دیگر هم دارد: تعداد درخواست به API به تعداد کاربران وابسته نیست و می‌توانید فقط فیلدهای لازم را به کلاینت بدهید.

نمونه با Cloudflare Workers (رایگان و بدون سرور)

javascript
// worker.js — کلید در Secrets ورکر: wrangler secret put EZRATE_KEY
export default {
  async fetch(request, env, ctx) {
    const cache = caches.default
    const key = new Request("https://cache.local/rates")
    let res = await cache.match(key)
    if (!res) {
      const api = await fetch("https://api.ezrate.me/v1/rates?symbols=usd,eur,g18,emami,usdt", {
        headers: { "X-API-Key": env.EZRATE_KEY } })
      if (!api.ok) return new Response("upstream error", { status: 502 })
      res = new Response(await api.text(), {
        headers: { "Content-Type": "application/json", "Cache-Control": "public, max-age=60",
                   "Access-Control-Allow-Origin": "https://your-site.com" } })
      ctx.waitUntil(cache.put(key, res.clone()))
    }
    return res
  },
}

نمونه همین پروکسی در Next.js (Route Handler) در تابلو قیمت طلا با React، در لاراول در دریافت نرخ ارز در PHP و در وردپرس در نمایش قیمت ارز در وردپرس آمده است.

i
نکته
اگر پروکسی شما فقط برای یک سایت است، هدر Access-Control-Allow-Origin را روی دامنهٔ همان سایت بگذارید، نه *. این‌طور سایت‌های دیگر نمی‌توانند از مرورگر کاربرانشان پروکسی شما را مصرف کنند.

لایه‌های دفاعی بعدی

لایهچه کاریدر برابر چه خطری
محدودیت IPکلید فقط از IP سرور شما پذیرفته شوداستفاده از کلید دزدیده‌شده در جای دیگر
کلید جدا برای هر پروژهسایت، اپ و اسکریپت داخلی هر کدام کلید خود را داشته باشندباطل کردن یک کلید بدون از کار افتادن بقیه
متغیر محیطیکلید در .env یا Secrets هاستانتشار کلید با کد
.gitignoreفایل .env هرگز commit نشودلو رفتن در گیت‌هاب
اسکن خودکار مخزنابزارهایی مثل gitleaks در CIcommit تصادفی کلید
چرخش دوره‌ایهر چند ماه کلید جدید و باطل کردن قبلیکلیدی که بی‌خبر لو رفته
پایش مصرفبررسی GET /usage و هشدار مصرف غیرعادیکشف زودهنگام سوءاستفاده

اگر کلید لو رفت، چه کنیم؟

  1. در پنل کاربری فورا کلید جدید بسازید و در سرور جایگزین کنید.
  2. کلید قدیمی را باطل کنید. از این لحظه درخواست‌های با آن کلید خطای 401 می‌گیرند.
  3. اگر کلید در گیت‌هاب commit شده، حذف فایل کافی نیست؛ کلید در تاریخچه گیت باقی است. باطل کردن کلید تنها راه مطمئن است.
  4. علت را پیدا کنید: کلید در کد کلاینت بود؟ در لاگ چاپ می‌شد؟ در اسکرین‌شاتی منتشر شد؟

برای نمایش ساده، اصلاً کلید لازم نیست

اگر فقط می‌خواهید قیمت را در صفحه نشان دهید، ویجت‌های قیمت بدون کلید کار می‌کنند و داده را از یک مسیر عمومی و کش‌شده می‌خوانند. خطر لو رفتن کلید وقتی پیش می‌آید که کسی برای یک نمایش ساده سراغ API می‌رود.

نسخه انگلیسی با تمرکز بر اپ‌های موبایل در Securing Financial API Keys آمده است.

امنیت API Key در جاوااسکریپت با مبهم‌سازی تأمین می‌شود؟
خیر. کلید هنگام ارسال درخواست در هدر به‌صورت خوانا دیده می‌شود. تنها راه، نگه داشتن کلید سمت سرور است.
متغیرهای NEXT_PUBLIC یا VITE_ امن‌اند؟
نه. این پیشوندها یعنی متغیر وارد کد مرورگر می‌شود. کلید باید بدون این پیشوند و فقط در کد سمت سرور خوانده شود.
اپ موبایل من سرور ندارد؛ چه کنم؟
یک تابع سرورلس (مثل Cloudflare Workers) بسازید؛ نمونهٔ آن در همین مقاله آمده و برای این حجم درخواست معمولاً رایگان است.
محدودیت IP برای هاست اشتراکی هم ممکن است؟
بله، به شرطی که IP خروجی هاست ثابت باشد. IP خروجی را از پشتیبانی هاست بپرسید و در تنظیمات کلید ثبت کنید.
عرفان فضلی
من در حوزه توسعه نرم‌افزار و برنامه‌نویسی فعالیت می‌کنم و به طراحی و پیاده‌سازی راهکارهای کاربردی و بهینه علاقه‌مندم. تمرکز من بر توسعه قابلیت‌های جدید، بهبود عملکرد سیستم‌ها و حل چالش‌های فنی با استفاده از فناوری‌های روز است. در مسیر کاری خود تلاش می‌کنم با یادگیری مستمر و به‌کارگیری روش‌های نوین برنامه‌نویسی، محصولات نرم‌افزاری کارآمد، پایدار و قابل‌اعتماد توسعه دهم.
همهٔ مطالب نویسنده ←

نظرات (۰)

نظرها پس از تأیید نمایش داده می‌شوند؛ برای ارسال، ورود به حساب لازم است.

مطالب مرتبط

API و برنامه‌نویسی
اپ قیمت ارز با فلاتر (Flutter)؛ از JSON تا رابط کاربری راست‌چین
API و برنامه‌نویسی
قیمت لحظه ای طلا در اکسل و گوگل شیت؛ اتصال به API بدون برنامه‌نویسی پیچیده
API و برنامه‌نویسی
مدیریت خطا در API مالی و Rate Limit: الگوهایی که سیستم را سرپا نگه می‌دارد