رفتن به محتوای اصلی

حریم خصوصی و رضایت

کنترل consent، masking پیش‌فرض Session Replay و مرز استفاده از credentialهای مرورگر و سرور.

آخرین بازبینی:

در این صفحه

آلفانا برای کنترل نحوه شروع collection و مدیریت داده‌های حساس، تنظیمات مشخصی برای رضایت کاربر، Session Replay و credentialها در اختیار SDK قرار می‌دهد.

در حالت consentMode: "auto"، اگر Widget رضایت در runtime config فعال باشد، SDK تا زمانی که کاربر تصمیم خود را مشخص نکند collection را آغاز نمی‌کند. در این وضعیت، ثبت و ارسال داده‌های رفتاری تا دریافت پاسخ کاربر متوقف می‌ماند.

در مقابل، مقدار "disabled" منطق بنر رضایت را نادیده می‌گیرد و collection را بلافاصله آغاز می‌کند. این گزینه فقط رفتار فنی SDK را مشخص می‌کند و استفاده از آن باید با سیاست حریم خصوصی، رضایت کاربران و الزامات حقوقی محصول شما هماهنگ باشد.

Session Replay

Session Replay می‌تواند بخش‌هایی از تعامل واقعی کاربر با صفحه را ثبت کند. برای کاهش احتمال ثبت ناخواسته اطلاعات حساس، SDK چند لایه کنترل برای masking و حذف بخش‌هایی از صفحه در اختیار شما قرار می‌دهد.

  • sessionReplayMaskAllInputs به‌طور پیش‌فرض روی true قرار دارد. با این تنظیم، مقدار inputها در Replay به‌صورت پیش‌فرض mask می‌شود و متن واردشده توسط کاربر در داده‌های ضبط‌شده نمایش داده نمی‌شود.
  • sessionReplayMaskTextClass به شما اجازه می‌دهد یک class مشخص را برای masking متن تعریف کنید. متن elementهایی که این class را دارند در Session Replay مخفی می‌شود، بدون اینکه لازم باشد کل آن بخش از صفحه از capture حذف شود.
  • sessionReplayBlockClass برای بخش‌هایی استفاده می‌شود که نباید در Replay ثبت شوند. subtree مربوط به elementهایی که این class را دارند به‌طور کامل از capture حذف می‌شود.
  • inline کردن stylesheetها به‌صورت پیش‌فرض غیرفعال است. این رفتار کمک می‌کند حجم payload اولیه Session Replay افزایش غیرضروری پیدا نکند و احتمال عبور نکردن درخواست از محدودیت‌های keepalive کاهش پیدا کند.

بهتر است masking را فقط به تنظیمات پیش‌فرض محدود نکنید. هر بخشی از محصول که ممکن است اطلاعات شخصی، مالی، محرمانه یا داده‌ای خارج از نیاز تحلیلی آلفانا نمایش دهد باید قبل از انتشار بررسی شود و در صورت نیاز با sessionReplayMaskTextClass یا sessionReplayBlockClass محافظت شود.

مخفی کردن بخش‌های حساس

برای مخفی کردن داده‌هایی مثل موجودی حساب، شماره موبایل یا کد ملی لازم نیست تنظیمی را تغییر دهید. کافی است یکی از دو class پیش‌فرض SDK را به element مربوط اضافه کنید:

Classرفتار در Replayمناسب برای
alphana-maskمتن element و همه elementهای داخل آن با * جایگزین می‌شود؛ چیدمان صفحه حفظ می‌شودموجودی، شماره موبایل، ایمیل، نام کاربر
alphana-blockelement و محتوای داخل آن ثبت نمی‌شود؛ در Replay یک جای خالی با همان ابعاد دیده می‌شودکارت بانکی، تصویر مدارک، جدول تراکنش‌ها
html
<p>موجودی: <span class="alphana-mask">12,450,000 ریال</span></p>
<p>موبایل: <span class="alphana-mask">0912 345 6789</span></p>

<!-- همه متن‌های داخل این بخش mask می‌شوند -->
<section class="alphana-mask">
  <h3>مشخصات کاربر</h3>
  <p>نام و نام خانوادگی</p>
</section>

<!-- این بخش اصلاً ثبت نمی‌شود -->
<div class="alphana-block">
  <img src="/uploads/national-card.jpg" alt="" />
</div>

masking در مرورگر کاربر و پیش از ارسال داده انجام می‌شود؛ بنابراین مقدار واقعی این بخش‌ها به سرورهای آلفانا نمی‌رسد. این رفتار برای محتوایی که بعد از بارگذاری صفحه اضافه یا به‌روزرسانی می‌شود هم برقرار است.

اگر نام این classها با CSS محصول شما تداخل دارد یا می‌خواهید از classهای موجود خودتان استفاده کنید، نام آن‌ها را در تنظیمات SDK تغییر دهید:

typescript
const tracker = new UserTracker({
  appId: "YOUR_APP_ID",
  secretKey: "YOUR_APP_SECRET",
  sessionReplayMaskTextClass: "pii",
  sessionReplayBlockClass: "no-replay",
});

در نصب با Script Tag همین تنظیمات با attributeهای data- مشخص می‌شوند:

html
<script
  async
  src="https://storage.alphana.ir/cdn/alphana-sdk/latest/alphana-sdk.js"
  data-app-id="YOUR_APP_ID"
  data-secret-key="YOUR_APP_SECRET"
  data-session-replay-mask-text-class="pii"
  data-session-replay-block-class="no-replay"
></script>

Credentialهای مرورگر و سرور

Credentialهایی که برای SDK مرورگر استفاده می‌شوند با کلیدهای دسترسی به Public API یکسان نیستند و نباید به‌جای یکدیگر استفاده شوند.

secretKey مربوط به App برای استفاده در SDK مرورگر طراحی شده است. با این حال، ingestion فقط بر اساس وجود این مقدار انجام نمی‌شود.

Backend هنگام دریافت داده، علاوه بر Bearer token، اطلاعاتی مثل appId و دامنه ثبت‌شده App را نیز اعتبارسنجی می‌کند تا درخواست ingestion با App و origin مورد انتظار مطابقت داشته باشد.

این تفاوت مهم است:

  • secretKey بخشی از قرارداد SDK مرورگر و ingestion است.
  • Account API Key با پیشوند alphana_api_ یک credential سطح حساب برای Public API است.
  • Account API Key باید همیشه خارج از کد سمت کاربر و در محیط امن سرور نگهداری شود.

اگر از Next.js یا Framework مشابهی استفاده می‌کنید، Account API Key را فقط در environment variableهای سمت سرور قرار دهید و از prefixهایی مثل NEXT_PUBLIC_ برای آن استفاده نکنید.

توصیه‌های اجرایی

  • قبل از فعال کردن Session Replay، فرم‌ها و بخش‌هایی که ممکن است داده حساس نمایش دهند بررسی کنید.
  • masking پیش‌فرض inputها را فقط در صورتی تغییر دهید که دقیقاً بدانید چه داده‌ای ثبت خواهد شد.
  • برای بخش‌هایی که اصولاً نباید وارد Replay شوند، از sessionReplayBlockClass استفاده کنید.
  • consentMode را بر اساس سیاست واقعی رضایت محصول انتخاب کنید، نه صرفاً برای ساده‌تر شدن نصب SDK.
  • Account API Key را فقط در backend، server function، API route یا محیط امن مشابه نگهداری کنید.
  • هیچ credential سطح حساب را داخل bundle مرورگر، HTML خروجی، GTM یا کد عمومی قرار ندهید.