Pro / kontra antara menekankan pemrosesan sisi klien atau sisi server


20

Mengapa saya ingin menulis aplikasi web dengan banyak pemrosesan di sisi server?

Bagi saya, menulis program sisi klien adalah keuntungan besar karena menghilangkan beban server sebanyak mungkin karena hanya mengirim data ke klien dengan pemrosesan minimal.

Saya melihat sangat sedikit tentang menulis aplikasi web selain menulisnya di sisi server dan memperlakukan sisi klien hanya sebagai tampilan . Mengapa saya ingin melakukan ini? Satu-satunya keuntungan yang saya lihat adalah saya dapat menulis dalam bahasa apa pun yang saya inginkan ( http://www.paulgraham.com/avg.html ).


Ini benar-benar baik untuk melakukan sebagian besar pemrosesan Anda ke klien dan hanya meninggalkan mutlak yang diperlukan untuk server. Terutama, validasi data tambahan (terpisah dari validasi sisi klien) dan keamanan harus diterapkan di sisi server karena alasan yang disebutkan dalam jawaban.
sakisk

Satu hal yang perlu dipikirkan adalah debugging, yang menurut saya biasanya lebih nyaman di server. Hal yang sama berlaku untuk logging.
Traubenfuchs

Saya tidak setuju bahwa menulis aplikasi web hanya digambarkan sebagai sisi server yang mengirimkan tampilan. Lihatlah peningkatan kerangka kerja seperti Vue, Angular dll. Untuk membuat aplikasi lengkap pada klien dan hanya bertukar data dengan server.
Kwebble

Jawaban:


28

Ada dua masalah utama.

  1. Yang pertama mudah - Anda biasanya tidak tahu jenis sumber daya apa yang tersedia di sisi klien. Jika membutuhkan 1,5GB untuk memproses sesuatu, dapatkah Anda benar-benar mendorongnya ke peramban klien yang tidak dikenal (IE, Safari, Opera, Firefox, dll.) Pada platform klien yang tidak dikenal? Apakah klien akan menghargai sistemnya terus menerus ketika Anda membanjiri itu?

  2. Yang kedua lebih arsitektur - lapisan apa yang ingin Anda tampilkan ke dunia luar? Sebagian besar akan setuju bahwa itu sangat berisiko untuk mengekspos lapisan data Anda. Bagaimana dengan lapisan layanan Anda? Apakah Anda benar-benar ingin memberikan logika itu di luar sana? Jika ya, apakah Anda juga mengekspos titik masuk ke lapisan data Anda? Jika Anda menjaga sisi server lapisan layanan, lalu apa yang tersisa? UI, bukan? Lihat alasan 1 tentang untuk pertimbangan berapa banyak yang hidup di server dan berapa banyak pada klien.


1
+1 untuk menyembunyikan lapisan. Injeksi SQL datang ke pikiran ...
jmq

7
Saya tidak berpikir injeksi SQL ada hubungannya dengan memindahkan sebagian besar logika Anda ke sisi klien. Bahkan jika Anda memindahkan pemrosesan data ke sisi klien, Anda masih memerlukan semacam layanan sisi server yang sebenarnya akan menjalankan query SQL (kecuali jika Anda ingin membuat nama pengguna dan kata sandi basis data Anda publik). Layanan itu bertanggung jawab untuk memvalidasi dan melarikan diri data. Tidak ada perbedaan di sana - Anda HARUS memvalidasi dan melarikan diri dari input apa pun di sisi server Anda SELALU. Tidak ada jalan lain di sekitarnya.
Pijusn

16

Pertama dan terpenting adalah Keamanan . Dorong semua logika Anda ke klien dan itu adalah permainan yang adil untuk peretas dan eksploitasi.

Apa pun dengan nilai apa pun yang dirasakan tidak akan bertahan selama 5 menit, terutama nilai uang, dan akan di-gamed atau diretas atau dieksploitasi dan merusak sistem Anda dengan cukup buruk. Bahkan jika itu memiliki sedikit atau tidak ada nilai uang, ada kelas orang yang akan meretasnya hanya untuk merusak sistem Anda karena mereka bosan.


1
"Bosan" mungkin terlalu berlebihan. Banyak peretas meretas hanya untuk membuat titik atau membodohi pengembang. Semacam "kode Anda buruk, dan Anda akan merasa buruk" -mentality. Tidak mengatakan bahwa peretasan "karena bosan" tidak pernah terjadi, tapi saya pikir itu tidak terlalu umum.
die maus

@Jarrod - dapatkah Anda menjelaskan bagaimana menerapkan logika di sisi klien buruk dari titik keamanan Anda?
Simple-Solution

@ Simple-Solution jika Anda harus mengajukan pertanyaan ini ...

7

Sisi Klien vs. Sisi Server

Pemrosesan sisi klien sejalan dengan standar REST yang lebih populer serta MVC yang bertentangan dengan pendekatan berbasis halaman dan SOAP. Munculnya tren ini dan fokus pada AJAX dan Html-RIA, skrip sisi klien meningkat dan lebih populer; namun, karena masalah keamanan dan kemampuan klien, skrip sisi klien memiliki ceruk khusus dan tidak boleh digunakan untuk semuanya.

Pertimbangan:

Mobile

Jika segmen besar audiens target Anda adalah pengguna seluler, pemrosesan berat harus diserahkan ke server.

Konsistensi lintas-browser

Standar web telah berjalan jauh dan ini mungkin tidak menjadi masalah, tetapi setiap pengembang web tahu bahwa IE 6,7, dan 8 dan kadang-kadang Safari dapat bertindak lucu di sisi klien - fungsi tertentu mungkin tidak berjalan karena pembatasan keamanan dan lainnya karena standar yang tidak diterapkan. Penting juga untuk dicatat bahwa pengguna akhir dapat mengonfigurasi browser untuk memiliki batasan tertentu atau bahkan sepenuhnya mematikan pemrosesan sisi klien (tanpa javascript!). Jika konsistensi adalah persyaratan bagi 100% pengguna (dan terutama jika Anda melakukan sesuatu yang tidak lazim), sisi server adalah yang paling penting.

Keamanan

Manipulasi data apa pun yang ingin Anda amankan harus dilakukan di server. Setiap data yang diproses pada sisi klien benar-benar terbuka untuk manipulasi. Misalnya, jika Anda memiliki fungsi javascript yang memproses beberapa informasi yang kemudian diposting kembali ke dalam sistem - akan sangat mudah untuk memanipulasi hasilnya tepat sebelum diposting kembali bahkan jika Anda memiliki keamanan back-end yang patut dicontoh.

UI / UX

Pemrosesan sisi klien dibiarkan untuk antarmuka pengguna dan membuat aplikasi internet yang kaya (RIA). Ini digunakan untuk membuat animasi, efek, interaksi pengguna, serta memuat konten secara dinamis melalui panggilan AJAX alih-alih memuat ulang seluruh halaman.


6

Terutama itu akan menjadi duplikasi usaha. Kemungkinan besar setiap data dari klien akan diperiksa dan diproses di tingkat server lagi.

Server tidak dapat berasumsi bahwa klien kaya / kuat Anda mengirim data, jadi dengan data apa pun yang dikirim, server harus memvalidasinya dan memprosesnya. Jadi masuk akal untuk meletakkannya di sana.

Namun, saya percaya beberapa logika dapat dilakukan di tingkat klien untuk pengalaman UI yang lebih baik.

Anda benar, mengapa mengirim data ke server jika tidak lengkap atau salah. Sangat mudah untuk memeriksa bidang yang diperlukan atau untuk ponsel atau alamat email yang diformat dengan benar. Saya tidak pernah suka mengirim formulir dan kemudian menunggu 5 detik untuk memberi tahu saya bahwa saya lupa memasukkan bidang. Pemrosesan semacam itu, tentu saja, lakukan pada klien dan pastikan itu benar dan menggunakan logika sisi klien untuk respons cepat kepada pengguna. Seperti yang telah Anda tunjukkan, efek samping bonus adalah server Anda harus berurusan dengan permintaan data yang kurang buruk. TETAPI, server masih harus memvalidasi juga, jadi Anda menipu logika. Tapi, pengguna Anda akan lebih bahagia.

Ada garis tipis di sini. Logika validasi sederhana OK, logika bisnis inti tidak OK.


4
  1. Pertama-tama Anda perlu memahami arsitektur aplikasi web, sebagian besar jika tidak semua adalah 3-tier:

    a) Klien / Presentasi - HTML dan Javascript, mungkin mengandung ActiveX / Flash / Java Applet / Silverlight. Saya akan mengambil risiko dan menambahkan aplikasi seluler asli yang berkomunikasi dengan server backend. Pada dasarnya peran lapisan ini adalah untuk menyediakan antarmuka bagi pengguna sistem untuk berinteraksi dengannya.

    b) Logika Bisnis - PHP / RoR / Java di mana data dari klien dikumpulkan, diproses dan disimpan dan di mana permintaan klien untuk data diproses dan dikirim kembali ke klien

    c) Penyimpanan Data Backend - menyediakan penyimpanan yang persisten untuk informasi sistem

  2. Jadi di mana Anda melakukan validasi, di semua lapisan. Mengapa?

    a) Sisi klien - memastikan pengguna memasukkan data yang benar, bidang yang diperlukan, dll

    b) Logika bisnis - memfilter, membersihkan dan memvalidasi data klien. Jalankan aturan bisnis yang lebih kompleks untuk memastikan bahwa data terbentuk dengan baik untuk penyimpanan. Beberapa validasi yang dilakukan di ujung depan diulangi di sini, karena fakta bahwa mungkin ada klien yang berbeda, ambil contoh browser Javascript dapat dinonaktifkan. Ini juga dapat menerima data dari berbagai sumber melalui API misalnya, sehingga semuanya perlu divalidasi.

    c) Penyimpanan Data Backend - kendala memastikan bahwa data terbentuk dengan baik untuk penyimpanan dan pengambilan selanjutnya.

Jadi di mana Anda memfokuskan upaya validasi Anda, gunakan setiap layer untuk melakukan validasi yang paling cocok, dan tinggalkan aturan yang lebih kompleks untuk layer yang dapat menanganinya


3

Sebagian besar adalah menjaga pemrosesan Anda dekat dengan data Anda. Jika Anda memiliki ratusan GB data, Anda jelas tidak akan mengirimkannya ke klien. Dengan kecepatan akses data yang meningkat ini menjadi lebih sedikit masalah, tetapi jika Anda memiliki situs Big Data Anda masih ingin melakukan sebanyak mungkin penyaringan dan penyempitan di server sebelum mengirimnya.


1

Ketika Anda membuat perilaku Anda sepenuhnya di sisi klien (katakanlah, dengan Javascript), SEO bisa menjadi masalah.

Solusi web yang menyimpan banyak hal di sisi server lebih mudah untuk menjaga konten tertentu diposting pada URL tertentu (biasanya tenang), dengan cara yang terlihat oleh mesin pencari.

Ini juga berarti pengunjung dapat menandai halaman tertentu. Sudahkah Anda mencobanya di Facebook?

Hal-hal ini dapat diselesaikan, tetapi biasanya dibangun ke dalam aplikasi yang melakukan banyak hal di server (KERETA API, WordPress dll), sedangkan jika Anda membangun mengatakan REACT, Anda harus melompat melalui lingkaran.


0

Alasannya adalah stabilitas .

Di sisi server, saya dapat memilih komponen yang stabil. Biasanya ini berarti saya memilih Java dan banyak perpustakaan yang dipilih dengan sangat hati-hati seperti FreeMarker. Tak perlu dikatakan, setiap perpustakaan selain dari perpustakaan standar Jawa diperlakukan sebagai sekali pakai, jadi saya mengakses perpustakaan eksternal melalui pembungkus buatan sendiri. Ini berarti saya dapat dengan mudah berubah dari satu perpustakaan ke perpustakaan lain jika persyaratan muncul.

Setiap kali saya memperbarui Java ke versi baru, biasanya berfungsi dengan baik karena Java adalah komponen yang sangat stabil bahkan di seluruh pembaruan versi utama. Dan juga, setiap server yang saya miliki menjalankan versi Java yang sama. Tidak setiap klien menjalankan implementasi JavaScript yang sama.

Di sisi klien, saya tidak bisa memilih komponen yang stabil. Pembuat browser akan memaksa saya untuk memilih JavaScript, bahasa yang saya khususnya tidak suka, tetapi saya terpaksa menggunakannya. (Dan jangan beri tahu saya tentang bahasa yang dikompilasi dengan JavaScript, mereka mengerikan!) Implementasi JavaScript dari setiap browser berbeda. Ini berarti total untuk menguji produk saya dengan setiap versi browser yang didukung.

Solusi saya? Saya melakukan pemrosesan sebanyak yang saya bisa di sisi server, dan sisi klien hanya pembungkus ringan yang mengirim data ke server dan menerima data dari server dalam bentuk fragmen JSON dan HTML. Hindari XML; gunakan JSON sebagai gantinya.

Saya tidak melakukan templating sisi klien; Saya membuat konten di server ke fragmen HTML yang kemudian saya tetapkan menggunakan .innerHTMLatribut ke berbagai elemen placeholder di sisi klien. Ini menjaga tumpukan teknologi sesederhana mungkin, karena saya tidak perlu dua mesin templat (satu Java dan satu JavaScript).

Kekurangannya jelas adalah latensi kecepatan cahaya; setengah detik dari latensi bukan tidak biasa antar benua.

Pertimbangkan bahwa klien Anda hari ini mungkin smartphone. Smartphone memiliki masa pakai baterai terbatas, jadi jika Anda melakukan perhitungan yang berat, lebih baik untuk membebani ke server Anda. Namun, hal-hal sederhana dapat lebih hemat energi ketika dilakukan di sisi klien karena Anda dapat menghindari akses radio. Tetapi argumen utama, stabilitas, mungkin berarti sebenarnya masuk akal untuk membongkar bahkan perhitungan sederhana ke server.

Sebagai tambahan, sebagaimana telah diamati dalam beberapa jawaban, Anda juga mendapatkan keamanan . Jika logika aplikasi sepenuhnya di sisi klien, seseorang dapat misalnya menetapkan harga untuk hal apa pun yang akan mereka beli dari toko web online Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.