Artikel
Pelajari mengapa Finifly menggunakan sistem ID CUID2 untuk mengamankan invoice dan data klien bisnis Anda. Temukan bagaimana ID unik yang tidak bisa ditebak melindungi informasi keuangan dari akses tidak sah.
Ketika Anda membuat invoice di Finifly, Anda mungkin pernah memperhatikan bahwa setiap invoice memiliki ID unik seperti clx9k2m3n000108l5fjr4g6y2. Atau saat melihat URL detail invoice, Anda menemukan format /dashboard/invoices/clx9k2m3n000108l5fjr4g6y2. ID unik ini bukan angka berurutan seperti 1, 2, 3, dan bukan juga UUID standar. Finifly menggunakan sistem yang disebut CUID2 — sebuah generasi ID yang dirancang khusus untuk keamanan dan kemudahan dalam pengembangan aplikasi modern.
Artikel ini akan membahas secara mendalam mengapa Finifly memilih CUID2, bagaimana sistem ini bekerja, dan apa manfaatnya bagi keamanan data invoice bisnis Anda sebagai pebisnis di Indonesia.
CUID2 adalah singkatan dari Collision-resistant, Uniqueness, Identifiers version 2. Ini adalah library JavaScript yang menghasilkan string ID unik dengan panjang 25 karakter. Berbeda dengan UUID v4 yang sepenuhnya acak atau auto-increment integer yang mudah ditebak, CUID2 menawarkan keseimbangan antara keamanan, keunikan, dan kemudahan dalam pengimplementasian.
Contoh CUID2: clx9k2m3n000108l5fjr4g6y2
Contoh UUID v4: 550e8400-e29b-41d4-a716-446655440000
Contoh Auto-increment: 1, 2,
3Sebelum CUID2, pendahulunya CUID (v1) sudah digunakan secara luas di berbagai aplikasi web. Namun, CUID v1 memiliki beberapa kelemahan, terutama dalam hal keamanan karena bisa di-prediksi berdasarkan timestamp dan counter. CUID2 lahir sebagai respons terhadap kebutuhan akan sistem ID yang lebih aman, terutama untuk aplikasi yang menangani data sensitif.
Sistem auto-increment adalah pendekatan paling sederhana — setiap data baru mendapatkan ID berupa angka berikutnya: 1, 2, 3, dst. Pendekatan ini mudah diimplementasikan dan efisien dalam query database. Namun, untuk konteks keamanan aplikasi seperti Finifly, auto-increment menciptakan celah serius.
Masalah Keamanan Auto-Increment:
Bayangkan jika invoice Anda memiliki ID berupa angka berurutan. Seseorang yang mengetahui struktur URL Anda bisa dengan mudah mencoba mengakses invoice dengan ID 1, 2, 3, dan seterusnya. Teknik ini dikenal sebagai Insecure Direct Object Reference (IDOR) — serangan di mana penyerang bisa mengakses data milik pengguna lain hanya dengan menebak atau mengiterasi ID.
Untuk bisnis yang menangani invoice dan data klien sensitif, eksposur seperti ini sangat berbahaya. Siapa pun bisa melihat invoice pesaing,窃 data klien, atau bahkan memanipulasi status pembayaran.
UUID version 4 menghasilkan ID yang sepenuhnya acak dan tidak bisa diprediksi. Ini terdengar ideal untuk keamanan, tetapi ada tradeoff. UUID v4 tidak memberikan informasi temporal — tidak ada cara untuk mengetahui kapan ID tersebut dibuat hanya dari string UUID-nya.
Selain itu, UUID v4 memiliki ukuran 36 karakter dengan hyphen, yang membuat URL menjadi lebih panjang dan kurang nyaman. CUID2 dengan 25 karakter menawarkan ukuran yang lebih ringkas tanpa mengorbankan keacakan yang memadai.
CUID2 menggabungkan keunggulan berbagai pendekatan:
Collision-resistant: Probabilitas dua CUID2 identical mendekati nol, bahkan pada sistem dengan jutaan data.
Time-sortable: CUID2 mengandung informasi timestamp, sehingga bisa diurutkan berdasarkan waktu pembuatan.
Kustomisasi panjang: Bisa disesuaikan dengan kebutuhan, dari 10 hingga 32 karakter.
Web-safe: Karakter yang digunakan kompatibel dengan URL dan database tanpa perlu encoding khusus.
Kecepatan generasi: Lebih cepat dibandingkan UUID v4 karena tidak memerlukan random number generator yang kompleks.
Di Finifly, semua tabel utama menggunakan CUID2 sebagai primary key. Berikut adalah struktur yang digunakan:
typescript // Contoh dari schema database Finifly const invoices = pgTable('invoices', { id: text('id').primaryKey().$defaultFn(() => cuid()), userId: text('user_id').notNull().references(() => users.id), clientId: text('client_id').references(() => clients.id), number: text('number').notNull(), status: text('status').notNull(), // ... field lainnya createdAt: timestamp('created_at').defaultNow().notNull(), updatedAt: timestamp('updated_at').defaultNow().notNull(), })
Perhatikan penggunaan . $defaultFn(() => cuid()) — ini memastikan setiap kali record baru dibuat, sistem secara otomatis meng-generate CUID2 tanpa perlu penanganan manual.
Salah satu aspek kritis di Finifly adalah sistem multi-tenant, di mana setiap user memiliki data yang sepenuhnya terpisah. Meskipun CUID2 sudah sulit ditebak, Finifly tidak bergantung hanya pada keamanan ID. Setiap query database selalu difilter dengan userId milik pengguna yang sedang login.
typescript // Implementasi keamanan multi-layer di Finifly const invoice = await db.query.invoices.findFirst({ where: and( eq(invoices.id, id), // Cek ID invoice eq(invoices.userId, userId) // PLUS verifikasi ownership ) })
Pendekatan defense in depth ini memastikan bahwa bahkan jika seseorang berhasil menebak CUID2 invoice, mereka tetap tidak bisa mengakses data karena tidak memiliki userId yang sesuai. Ini adalah prinsip keamanan yang sangat penting untuk aplikasi keuangan.
Di Finifly, CUID2 digunakan secara konsisten di seluruh entitas:
| Entitas | Contoh ID | Fungsi |
|---|---|---|
| Users | clx9k2m3n000108l5fjr4g6y1 | Identitas akun bisnis |
| Clients | clx9k2m3n000108l5fjr4g6y3 | Data klien invoice |
| Invoices | clx9k2m3n000108l5fjr4g6y2 | Invoice utama |
| Invoice Items | clx9k2m3n000108l5fjr4g6y4 | Baris item dalam invoice |
Konsistensi ini memastikan sistem yang统一 dan aman di seluruh aplikasi.
Data klien adalah aset berharga bagi bisnis. Informasi seperti nama perusahaan, alamat email, nomor telepon, dan NPWP harus dilindungi dari akses tidak sah. Dengan CUID2, penyerang tidak bisa sekadar menebak ID untuk mengakses data klien milik pengguna lain.
Skenario Terburuk Tanpa CUID2:
Seorang kompetitor bisa dengan mudah mengiterasi URL /clients/1, /clients/2, /clients/3 dan mendapatkan daftar semua klien bisnis Anda — termasuk informasi kontak yang bisa digunakan untuk cold-calling atau bahkan penipuan.
Dengan CUID2:
URL menjadi /clients/clx9k2m3n000108l5fjr4g6y3 — tidak ada pola yang bisa ditebak, dan setiap akses tetap diverifikasi oleh sistem multi-tenant.
Invoice mengandung informasi sensitif: harga produk atau jasa yang Anda tawarkan, diskon yang diberikan, dan kondisi pembayaran. Data ini bisa digunakan oleh kompetitor untuk undercut harga atau oleh pihak tidak bertanggung jawab untuk tujuan penipuan.
Dengan CUID2, setiap invoice memiliki identifier unik yang tidak bisa diprediksi, memberikan lapisan keamanan pertama sebelum verifikasi userId.
Sistem ID yang bisa ditebak memungkinkan penyerang tidak hanya melihat, tetapi juga memanipulasi data. Bayangkan jika seseorang bisa mengubah status invoice dari "belum lunas" menjadi "lunas" hanya dengan mengubah ID di URL. CUID2 + verifikasi ownership membuat skenario seperti ini tidak mungkin.
CUID2 menggunakan text sebagai tipe data, yang secara natural terindeks dengan baik di PostgreSQL. Berbeda dengan UUID yang kadang memerlukan konversi atau plugin khusus untuk optimalisasi indeks, text index di PostgreSQL sudah teroptimasi dengan baik.
sql -- CUID2 sebagai text bisa diindeks dengan B-tree standard CREATE INDEX idx_invoices_user_id ON invoices(user_id); CREATE INDEX idx_invoices_id ON invoices(id);
Finifly berjalan di edge runtime untuk performa optimal. CUID2 memiliki footprint yang kecil dan tidak memerlukan random number generator yang berat, menjadikannya pilihan ideal untuk environment dengan resource terbatas seperti Vercel Edge Functions.
Jika di masa depan perlu migrasi ke sistem ID lain, CUID2 tidak memiliki masalah kompatibilitas karena menggunakan tipe data text standar. Tidak ada lock-in ke extension atau plugin khusus.
Meskipun CUID2 sudah cukup aman, best practice adalah tidak mengekspos ID di tempat yang tidak perlu. Finifly menggunakan CUID2 untuk:
Namun, untuk identifier yang ditampilkan ke pengguna (seperti nomor invoice), Finifly menggunakan format yang lebih user-friendly: INV-2026-001. Ini adalah business identifier, bukan system identifier, dan memang seharusnya lebih mudah dibaca.
Ingatlah bahwa CUID2 adalah lapisan keamanan pertama, bukan satu-satunya. Selalu implementasikan verifikasi ownership di level aplikasi:
typescript // Server action dengan double-check async function getInvoiceDetail(invoiceId: string) { const session = await auth() if (!session?.user?.id) { throw new Error('Unauthorized') }
const invoice = await db.query.invoices.findFirst({ where: and( eq(invoices.id, invoiceId), eq(invoices.userId, session.user.id) ) })
if (!invoice) { return null // Atau throw error yang sesuai }
return invoice }
Meskipun CUID2 dan multi-tenant verification sudah memberikan keamanan yang kuat, sebaiknya implementasikan audit log untuk mendeteksi aktivitas mencurigakan. Jika ada upaya akses yang gagal berulang kali, sistem bisa memberikan alert atau temporary lock.
| Aspek | CUID2 | UUID v4 | Auto-increment | |---|---|---|---| | Panjang | 25 karakter | 36 karakter | Variabel | | Keamanan ID | Baik | Sangat baik | Buruk | | Time-sortable | Ya | Tidak | Ya | | Kecepatan generate | Cepat | Sedang | Sangat cepat | | URL-friendly | Ya | Ya (dengan hyphen removal) | Ya | | Kustomisasi | Ya | Tidak | Terbatas | | Database compatibility | Text native | Membutuhkan extension (opsional) | Integer native |
Pemilihan CUID2 sebagai sistem ID di Finifly bukan keputusan yang sembarangan. Ini adalah bagian dari strategi keamanan berlapis yang melindungi data invoice dan klien bisnis Anda:
Lapisan pertama: CUID2 yang tidak bisa ditebak membuat attackers tidak bisa mengiterasi ID secara brute-force.
Lapisan kedua: Multi-tenant verification memastikan setiap query difilter dengan userId, sehingga即使 ada yang menebak ID, mereka tetap tidak bisa mengakses data.
Lapisan ketiga: Server actions selalu menjalankan auth() check sebelum operasi apapun, memastikan hanya user yang terautentikasi yang bisa melakukan aksi.
Untuk Anda sebagai pebisnis Indonesia yang menggunakan Finifly, keamanan ini berarti:
CUID2 mungkin terlihat seperti detail teknis yang tidak terlihat oleh pengguna, tetapi ini adalah fondasi penting yang memungkinkan Finifly memberikan pengalaman yang aman dan terpercaya untuk mengelola invoice bisnis Anda. Dengan memahami bagaimana sistem ini bekerja, Anda bisa lebih percaya diri dalam menggunakan Finifly sebagai partner manajemen invoice bisnis Anda.
Artikel Terkait:
© 2026 finifly. All rights reserved.
hello@finifly.com