Memahami Aturan Keamanan Firebase Realtime Database

Aturan Keamanan Firebase Realtime Database menentukan siapa yang memiliki akses baca dan tulis ke database Anda, bagaimana strukturisasi data dilakukan, dan indeks apa yang ada. Aturan ini berada di server Firebase dan diberlakukan secara otomatis sepanjang waktu. Setiap permintaan baca dan tulis hanya akan dijalankan jika aturan mengizinkannya. Secara default, aturan Anda tidak mengizinkan siapa pun mengakses database Anda. Hal ini dimaksudkan untuk melindungi database dari penyalahgunaan hingga Anda sempat menyesuaikan aturan atau menyiapkan autentikasi.

Aturan Keamanan Realtime Database memiliki sintaksis yang menyerupai JavaScript dan tersedia dalam empat jenis:

Jenis Aturan
.read Menjelaskan apakah dan kapan data boleh dibaca oleh pengguna.
.write Menjelaskan apakah dan kapan data boleh ditulis.
.validate Menentukan tampilan nilai yang diformat dengan benar, apakah nilai memiliki atribut turunan, dan tipe data.
.indexOn Menetapkan turunan ke indeks untuk mendukung pengurutan dan pembuatan kueri.

Ringkasan keamanan Realtime Database

Firebase Realtime Database menyediakan serangkaian alat lengkap untuk mengelola keamanan aplikasi. Alat ini memudahkan Anda dalam mengautentikasi pengguna, memberlakukan izin pengguna, dan memvalidasi input.

Aplikasi yang didukung Firebase menjalankan lebih banyak kode sisi klien daripada technology stack lainnya. Karena itu, cara kami menyikapi keamanan mungkin sedikit berbeda dibandingkan dengan yang biasanya Anda jumpai.

Autentikasi

Langkah pertama yang umum dalam mengamankan aplikasi Anda adalah mengidentifikasi pengguna Anda. Proses ini disebut autentikasi. Anda dapat menggunakan Firebase Authentication agar pengguna dapat login ke aplikasi Anda. Firebase Authentication mencakup dukungan drop-in untuk metode autentikasi umum seperti Google dan Facebook, serta login email dan sandi, login anonim, dan lainnya.

Identitas pengguna adalah konsep keamanan yang penting. Setiap pengguna memiliki data yang berbeda dan terkadang mereka memiliki kemampuan berbeda pula. Misalnya, pada aplikasi chat, setiap pesan dikaitkan dengan pengguna yang membuatnya. Pengguna juga bisa menghapus pesannya sendiri, tetapi bukan pesan yang diposting pengguna lain.

Otorisasi

Mengidentifikasi pengguna hanyalah sebagian dari keamanan. Setelah mengetahui identitas pengguna, Anda memerlukan cara untuk mengontrol akses mereka ke data di database. Dengan Aturan Keamanan Realtime Database, Anda dapat mengontrol akses untuk setiap pengguna. Misalnya, berikut adalah sekumpulan aturan keamanan yang mengizinkan siapa saja membaca jalur /foo/, tetapi tidak mengizinkan siapa pun menulis ke jalur tersebut:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

Aturan .read dan .write berjenjang, sehingga kumpulan aturan ini memberikan akses baca ke setiap data di jalur /foo/ dan juga jalur yang lebih dalam, seperti /foo/bar/baz. Perlu diperhatikan bahwa aturan .read dan .write yang lebih dangkal pada database akan menggantikan aturan yang lebih dalam, sehingga pada contoh ini akses baca ke /foo/bar/baz akan tetap diberikan sekalipun aturan pada jalur /foo/bar/baz disetel ke 'false'.

Aturan Keamanan Realtime Database mencakup variabel bawaan dan fungsi yang memungkinkan Anda merujuk ke jalur lain, stempel waktu sisi server, informasi autentikasi, dan lainnya. Berikut adalah contoh aturan yang memberikan akses tulis ke /users/<uid>/ kepada pengguna terauntetikasi, dengan <uid> berupa ID pengguna yang diperoleh melalui Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Validasi data

Firebase Realtime Database tidak memiliki skema. Hal ini memudahkan Anda dalam mengubah data selama pengembangan aplikasi. Namun, begitu aplikasi siap didistribusikan, data harus selalu konsisten. Bahasa aturan ini mencakup aturan .validate, sehingga Anda dapat menerapkan logika validasi menggunakan ekspresi yang sama seperti pada aturan .read dan .write. Satu-satunya perbedaan adalah aturan validasi tidak berjenjang, sehingga semua aturan validasi yang relevan harus dievaluasi ke 'true' agar penulisan diizinkan.

Aturan ini menetapkan bahwa data yang dituliskan ke /foo/ haruslah berupa string dengan panjang kurang dari 100 karakter:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Aturan validasi memiliki akses ke semua fungsi dan variabel bawaan yang sama seperti aturan .read dan .write. Anda dapat menggunakan fungsi dan variabel bawaan ini untuk membuat aturan validasi yang mengetahui data di tempat lain dalam database, identitas pengguna Anda, waktu server, dan banyak lagi.

Menetapkan indeks database

Firebase Realtime Database memungkinkan pengurutan dan kueri data. Untuk ukuran data kecil, database mendukung kueri ad hoc, sehingga biasanya indeks tidak diperlukan selama pengembangan. Namun, sebelum meluncurkan aplikasi, sebaiknya tentukan indeks untuk setiap kueri yang Anda miliki untuk memastikan bahwa indeks tersebut terus berfungsi saat aplikasi Anda berkembang.

Indeks ditentukan menggunakan aturan .indexOn. Berikut adalah contoh deklarasi indeks yang akan mengindeks kolom tinggi dan panjang untuk sekumpulan dinosaurus:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Langkah berikutnya