# 08 — امنیت، حریم خصوصی کودکان و کارایی

## 1. حریم خصوصی — GDPR و کودکان (جهت‌گیری: اروپا/NL)

| اصل GDPR | پیاده‌سازی در سیستم |
|---|---|
| **حداقل‌سازی داده** | پروفایل کودک = نام مستعار + آواتار + رنگ + فقط سال تولد. بدون نام واقعی، عکس، یا ایمیل کودک |
| **رضایت والدین** | ساخت پروفایل کودک فقط از حساب احراز-شده‌ی والد با چک‌باکس تأیید صریح |
| **حق فراموشی (Art. 17)** | `DELETE /children/:id` → حذف آبشاری در یک تراکنش + تأیید ایمیلی |
| **حق دسترسی/انتقال** | خروجی JSON کامل پیشرفت از پنل والدین |
| **بدون ردیابی فرعی** | صفر third-party tracker/ads؛ آنالیز فقط از `session_events` خودمان |
| **نگهداری محدود** | رویدادهای خام > ۱۲ ماه به‌صورت تجمعی آرشیو و جزئیات حذف می‌شود |

## 2. امنیت فنی

| حوزه | کنترل |
|---|---|
| رمز والد | `argon2id` (hash + salt)؛ سیاست حداقلی اما الزام‌آور (≥ 8 کاراکتر) |
| توکن‌ها | JWT کوتاه‌عمر والد (۲۴h) + refresh؛ توکن کودک hash-شده در `child_devices` (session ۳۰ روزه، قابل ابطال) |
| Scope جداسازی | توکن کودک فقط `progress`/`events`؛ تلاش عملیات والدین → 403 `WRONG_SCOPE` |
| ورودی‌ها | اعتبارسنجی schema (zod) روی همه‌ی endpoint ها؛ `letterId`ها فقط برابر الگوی `^[a-z]{2}_[a-z_]+$` |
| حملات رایج | rate-limit (سند 04)، CORS allowlist صریح، `helmet` (CSP, HSTS)، حجم درخواست ≤ 100KB |
| دیتابیس | کوئری‌های پارامتری (ORM) — صفر string-concatenation SQL |
| رسانه‌ها | نام فایل‌ها از پک اعتبارسنجی‌شده می‌آیند؛ آپلود کاربر وجود ندارد |

## 3. کارایی — بودجه‌ی عملکرد

| سنجه | بودجه |
|---|---|
| First Meaningful Paint (شروع بازی) | < 1.5s روی 3G سریع |
| حجم JS اولیه (gz) | ≤ 150KB (GSAP core ~60KB + Bootstrap JS فقط bundle موردنیاز) |
| حجم CSS اولیه (gz) | ≤ 40KB |
| پک زبانی (fa) | ≤ 200KB JSON (~30KB gz با compression) |
| صدا پیش‌بارگذاری جلسه | ≤ 600KB |
| انیمیشن | 60fps روی گوشی میان‌رده (قواعد سند 06) |

**تکنیک‌ها:** lazy-import بازی‌ها (`import()` داینامیک هنگام ورود به `/game/:id`)، تصاویر همه SVG (برداری، سبک، رنگ‌پذیری با CSS variables)، فونت با `font-display: swap` و subset.

## 4. PWA و آفلاین

```
Service Worker (sw.js)
├── App Shell (index.html, css, js)      → cache-first + update در background
├── پک زبانی فعال                        → stale-while-revalidate
├── صداها (sfx + جلسه‌ی فعلی)             → cache-first (LRU دستی)
└── /api/**                              → فقط network (سینک خودش retry می‌کند)
```
- استراتژی آفلاین: **LocalRepo همیشه منبع خواندن**؛ SyncQueue هنگام `online` تخلیه می‌شود.
- `manifest.json`: نصب روی هوم‌اسکرین، orientation portrait، آیکون ماسکات، `display: standalone`.
- به‌روزرسانی: SW جدید با `skipWaiting` + پیام «نسخه‌ی جدید آماده است» فقط بعد از پایان جلسه (قطع نکردن بازی کودک).

## 5. قابلیت اطمینان

- `gameEngine` هر بازی را در سندباکس اجرا می‌کند؛ خطا → لاگ + بازگشت امن به نقشه با حفظ امتیاز.
- همه‌ی رویدادها قبل از emit در `session_events` کلاینت (localStorage) زنده‌ماندنی‌اند — کرش وسط جلسه پیشرفت را از بین نمی‌برد.
- Health-check سرور: `GET /healthz` (برای مانیتورینگ uptime).
