Skip to main content

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 Quinn of Spicy mengimplementasikan security system yang komprehensif untuk proteksi data dan 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 entitas User 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 memiliki admin_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 melalui CompanyMember 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

Entitas CompanyMember mendefinisikan 13 role yang tersedia dalam sebuah company:

Role dalam Workspace

Entitas WorkspaceMember mendefinisikan 4 role untuk workspace: 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)

Setiap CompanyMember 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:
  1. Pembuat transaksi tidak boleh sekaligus approver — mencegah konflik kepentingan
  2. Stock admin yang melakukan stock opname tidak boleh sekaligus approve — memastikan verifikasi independen
  3. 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 berdasarkan company_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 dengan admin_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:
  1. Admin/owner company mengirim undangan ke email calon member
  2. Sistem membuat record CompanyInvitation dengan status pending
  3. Penerima menerima email notifikasi berisi detail company dan role yang ditawarkan
  4. Penerima dapat accept atau reject undangan
  5. Jika diterima, sistem otomatis membuat record CompanyMember dengan role dan permissions sesuai undangan
  6. 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

Entitas AuditLog 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 memiliki subscription_plan yang menentukan fitur dan batas yang tersedia:

Membership Duration & Expiry

Subscription Entity

Entitas Subscription mengelola langganan layanan secara detail:

Backup & Recovery Security

Company Backup

Entitas CompanyBackup 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

  1. Review audit logs setiap minggu untuk deteksi anomali
  2. Enforce SoD rules — jangan bypass kecuali ada compensating control
  3. Use strong passwords — minimal 8 karakter, mixed case, number
  4. Enable 2FA ketika tersedia untuk role sensitif
  5. Monitor rate limiting — adjust threshold jika ada legitimate high-volume users
  6. Rotate API keys secara berkala
  7. Test backup restore quarterly untuk pastikan recovery capability
  8. Review assigned_locations per member secara berkala
  9. Audit MenuAccessProfile — pastikan role hanya memiliki akses menu yang diperlukan
  10. Monitor failed login attempts melalui audit log dengan status: failed

Untuk Developer

  1. Always sanitize user input sebelum render atau store
  2. Use parameterized queries — jangan concatenate SQL
  3. Validate on both client and server — client validation untuk UX, server untuk security
  4. Mask sensitive data di logs dan exports
  5. Use correlation IDs untuk trace cross-module operations
  6. Test rate limiting dengan load testing
  7. Keep dependencies updated — run npm audit regularly
  8. Always include company_id di RLS policy untuk multi-tenant isolation
  9. 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

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

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_locations pada 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_info dan ip_address di 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