title: “Security & Compliance” description: “Sistem keamanan komprehensif Quinn of Spicy: autentikasi, otorisasi RBAC, HTML sanitization, rate limiting, audit trail append-only, input validation, sensitive data masking, multi-tenant isolation, dan cross-tab sync.”
Security & Compliance

security.js (224 baris) menyediakan utility functions untuk HTML sanitization, input validation, rate limiting, dan sensitive data masking. Audit trail bersifat append-only dengan state delta recording untuk forensic evidence.
Sistem ini melindungi dari berbagai attack vectors: XSS via HTML sanitization, directory traversal via file name sanitization, brute force via rate limiting, dan data leakage via sensitive data masking. Semua user input divalidasi sebelum diproses — email format, password strength, URL validity, phone number format, dan file type/size.
Cross-tab synchronization via BroadcastChannel memastikan permission changes dan security events propagate secara real-time ke semua browser tabs yang terbuka.
Arsitektur Keamanan
Layer Pertahanan Keamanan
Sistem keamanan Quinn of Spicy dirancang dengan pendekatan defense-in-depth — beberapa lapis pertahanan yang saling melengkapi untuk memastikan bahwa jika satu layer gagal, layer lainnya tetap melindungi sistem dan data pengguna.Autentikasi & Sesi
Mekanisme Autentikasi
Quinn of Spicy menggunakan sistem autentikasi berbasis Supabase Auth dengan password hashing menggunakan bcrypt. Setiap user terdaftar dalam entitasUser dengan field email sebagai identitas unik dan role (admin atau user) yang menentukan level akses global.
Fitur Autentikasi:
Manajemen Sesi
Setiap sesi pengguna dikelola melalui JWT token yang memiliki masa berlaku terbatas. Sistem secara otomatis melakukan refresh token sebelum expired untuk menjaga pengalaman pengguna yang mulus. Parameter Sesi:Tipe Admin & Hak Akses Global
Setiap pengguna memilikiadmin_type dan admin_tier yang menentukan hak akses di level aplikasi (berbeda dengan role di level company):
Otorisasi & RBAC (Role-Based Access Control)
Overview RBAC
Sistem RBAC Quinn of Spicy beroperasi pada dua level: level company melaluiCompanyMember dan level workspace melalui WorkspaceMember. Setiap role memiliki set permissions yang granular, dan owner selalu memiliki semua permissions tanpa perlu konfigurasi tambahan.
Role dalam Company
EntitasCompanyMember mendefinisikan 13 role yang tersedia dalam sebuah company:
Role dalam Workspace
EntitasWorkspaceMember mendefinisikan 4 role untuk workspace:
Menu Access Profile
MenuAccessProfile memungkinkan owner company untuk membuat profil akses menu yang disesuaikan untuk setiap role. Setiap profil menentukan menu-menu mana yang dapat diakses oleh role tertentu.
Dashboard Types:
Detail Permissions (CompanyMember)
SetiapCompanyMember memiliki objek permissions yang berisi 35+ boolean flags untuk mengontrol akses granular:
Location-Based Access Control (RBAC-01)
Selain permission berbasis role,CompanyMember juga mendukung assigned_locations — daftar ID lokasi gudang/outlet yang diizinkan untuk member tersebut. Ini memastikan bahwa seorang stock admin hanya dapat mengakses lokasi yang secara eksplisit ditugaskan kepadanya.
Owner Bypass
Owner company selalu memiliki semua permissions tanpa perlu konfigurasi. Logika permission check akan langsung bypass jika user adalah owner, memastikan bahwa owner tidak pernah terkunci dari fitur apapun.Segregation of Duties (SoD)
Sistem menerapkan 3 aturan segregation of duties untuk mencegah fraud:- Pembuat transaksi tidak boleh sekaligus approver — mencegah konflik kepentingan
- Stock admin yang melakukan stock opname tidak boleh sekaligus approve — memastikan verifikasi independen
- Production operator yang membuat batch tidak boleh sekaligus release QC — quality check harus independen
Grace Period Membership
Ketika membership perusahaan expired, sistem memberikan grace period 3 hari dalam mode read-only (is_readonly_mode: true). Selama periode ini, pengguna hanya dapat membaca data tetapi tidak dapat membuat atau mengedit transaksi, memberi waktu untuk perpanjangan membership.
Multi-Tenancy & Isolasi Data
Company-Based Isolation
Setiap data dalam Quinn of Spicy terisolasi berdasarkancompany_id. Row Level Security (RLS) dari Supabase memastikan bahwa query hanya mengembalikan data milik company yang sedang aktif (active_company_id).
Mekanisme Isolasi:
RLS Policy Pattern:
Semua entitas security-critical menggunakan pattern RLS yang sama:
Company Switching
User denganadmin_type: owner atau admin_tier yang sesuai dapat mengelola multiple companies dan berpindah antar company melalui active_company_id. Setiap kali berpindah company, semua query akan otomatis ter-filter ke company yang baru dipilih.
Invitation & Onboarding
Company Invitation
CompanyInvitation mengelola proses undangan bergabung ke sebuah company. Undangan dikirim via email dan memiliki masa berlaku tertentu.
Status Undangan:
Alur Undangan:
- Admin/owner company mengirim undangan ke email calon member
- Sistem membuat record
CompanyInvitationdengan statuspending - Penerima menerima email notifikasi berisi detail company dan role yang ditawarkan
- Penerima dapat accept atau reject undangan
- Jika diterima, sistem otomatis membuat record
CompanyMemberdengan role dan permissions sesuai undangan - Jika ditolak atau expired, status diupdate accordingly
security.js Utility Functions
1. HTML Sanitization
sanitizeHtml() mencegah XSS attacks dengan menghapus elemen, atribut, dan protokol berbahaya:
Blocked Elements:
Blocked Attributes:
Blocked Protocols:
Example:
2. Input Validation
Password Rules:
3. Rate Limiting
RateLimiter class menggunakan sliding window algorithm untuk mencegah abuse:
Configuration:
Algorithm:
Use Cases:
- Login attempts (prevent brute force)
- API calls (prevent abuse)
- Form submissions (prevent spam)
- Password reset (prevent email bombing)
4. Sensitive Data Masking
maskSensitiveData() masks sensitive fields dalam logs dan exports untuk mencegah accidental exposure:
Masked Fields:
Example:
5. Additional Utilities
Audit Trail System
AuditTrailViewer.jsx (388 lines)
Append-only audit log viewer dengan state delta recording untuk setiap perubahan data. Audit trail merupakan komponen kritis untuk forensic analysis dan compliance.Struktur Audit Log
EntitasAuditLog menyimpan setiap aksi yang dilakukan dalam sistem:
Action Types
Sistem audit mencatat berbagai jenis aksi yang dikategorikan per modul:State Delta Recording
Setiap kali data diubah, sistem menangkap state sebelum dan sesudah perubahan:Correlation ID
Untuk operasi yang melibatkan multiple entities, correlation ID digunakan untuk trace related operations:Cross-Tab Security Synchronization
Sistem menggunakan BroadcastChannel API untuk menyinkronkan security events antar tab browser yang terbuka secara bersamaan: Events:Subscription & Membership Security
Subscription Plans
Setiap user terdaftar memilikisubscription_plan yang menentukan fitur dan batas yang tersedia:
Membership Duration & Expiry
Subscription Entity
EntitasSubscription mengelola langganan layanan secara detail:
Backup & Recovery Security
Company Backup
EntitasCompanyBackup menyediakan mekanisme backup dan recovery dengan integritas terverifikasi:
Security Features by Layer
1. Authentication Layer
2. Authorization Layer
3. Input Validation Layer
4. Data Protection Layer
Compliance
Data Protection
Industry Standards
Security Best Practices
Untuk Admin
- Review audit logs setiap minggu untuk deteksi anomali
- Enforce SoD rules — jangan bypass kecuali ada compensating control
- Use strong passwords — minimal 8 karakter, mixed case, number
- Enable 2FA ketika tersedia untuk role sensitif
- Monitor rate limiting — adjust threshold jika ada legitimate high-volume users
- Rotate API keys secara berkala
- Test backup restore quarterly untuk pastikan recovery capability
- Review assigned_locations per member secara berkala
- Audit MenuAccessProfile — pastikan role hanya memiliki akses menu yang diperlukan
- Monitor failed login attempts melalui audit log dengan
status: failed
Untuk Developer
- Always sanitize user input sebelum render atau store
- Use parameterized queries — jangan concatenate SQL
- Validate on both client and server — client validation untuk UX, server untuk security
- Mask sensitive data di logs dan exports
- Use correlation IDs untuk trace cross-module operations
- Test rate limiting dengan load testing
- Keep dependencies updated — run
npm auditregularly - Always include company_id di RLS policy untuk multi-tenant isolation
- Log device_info dan ip_address di setiap audit entry untuk forensic readiness
Integrasi Cross-Module
Entity Relationship Diagram
Entity Schema Tables
User
Company
CompanyMember
CompanyInvitation
AuditLog
MenuAccessProfile
Subscription
WorkspaceMember
CompanyBackup
Authentication & Session Lifecycle
Sequence Diagrams
Login Flow
Invitation & Member Onboarding Flow
Session Management & Cross-Tab Sync
Password Reset Flow
Enum Reference Tables
User.role
User.subscription_plan
User.admin_type
User.admin_tier
User.membership_duration_type
CompanyMember.role
CompanyMember.status
CompanyInvitation.status
AuditLog.action
AuditLog.status
Company.industry
MenuAccessProfile.dashboard_type
Subscription.billing_cycle
Subscription.status
WorkspaceMember.role
CompanyBackup.backup_type
CompanyBackup.backup_scope
CompanyBackup.status
CompanyBackup.drive_integration_status
RBAC Permission Matrix
Tabel berikut memetakan permission default per role dalam company. Owner selalu bypass semua permission check.Catatan: Tabel di atas menunjukkan permission default untuk setiap role. Owner company dapat mengkustomisasi permissions per member secara individual melalui
CompanyMember.permissions. Role production_operator, qc_inspector, sales_marketing, dan partner_distributor memiliki permission khusus yang tidak tercakup dalam tabel umum ini.Tips
- HTML sanitization adalah lini pertahanan pertama terhadap XSS — selalu sanitize user input sebelum render
- Rate limiting menggunakan sliding window yang lebih fair daripada fixed window — adjust threshold sesuai use case
- Audit trail bersifat append-only — tidak bisa dihapus atau diubah, memastikan forensic integrity
- Correlation ID sangat berguna untuk debugging cross-module operations — selalu include saat create related entities
- Sensitive data masking mencegah accidental exposure di logs — critical untuk compliance
- Cross-tab sync via BroadcastChannel memastikan permission changes propagate instantly — user tidak perlu refresh manual
- SoD rules adalah anti-fraud control — document rationale jika perlu bypass untuk business reason
- Grace period 3 hari memberi buffer untuk membership renewal sebelum user terblokir total
assigned_locationspada CompanyMember penting untuk multi-outlet business — pastikan setiap member hanya ditugaskan ke lokasi yang sesuai- SHA-256 checksum pada CompanyBackup memverifikasi integritas file backup — selalu verifikasi checksum sebelum restore
device_infodanip_addressdi AuditLog penting untuk forensic investigation — pastikan field ini selalu terisi- MenuAccessProfile memungkinkan kustomisasi dashboard per role tanpa perlu mengubah code — gunakan fitur ini untuk tailoring akses
