Wann ist es angebracht, Berechnungen im Frontend durchzuführen?

21

Mein Team entwickelt eine WEB-basierte Finanzanwendung und es gab ein paar Auseinandersetzungen mit einem Kollegen, wo die Berechnungen aufbewahrt werden sollten - rein im Back-End oder auch im Front-End?

Kurze Erklärung: Wir verwenden Java (ZK, Spring) für das Front-End und Progress 4gl für das Back-End. Berechnungen, die einige Hardcore-Mathematik- und -Daten aus der Datenbank beinhalten, werden im Back-End aufbewahrt, sodass ich nicht über sie spreche. Ich spreche von der Situation, in der der Benutzer den Wert X eingibt, dieser dann zum Wert Y addiert (auf dem Bildschirm angezeigt) und das Ergebnis im Feld Z angezeigt wird. Reine und einfache jQuery-ish-Operationen, meine ich.

Was wäre hier die beste Vorgehensweise:

1) Fügen Sie mit JavaScript Werte hinzu, die vom Wechseln zum Back-End und zurück gespeichert werden, und validieren Sie sie dann am Back-End "beim Speichern"?

2) Bewahren Sie die gesamte Geschäftslogik an derselben Stelle auf. Stellen Sie daher die Werte in das Back-End und führen Sie die Berechnungen dort durch.

3) Führen Sie die Berechnungen im Frontend durch; Daten dann an das Backend senden, dort validieren, die Berechnungen erneut durchführen und dem Benutzer nur dann anzeigen, wenn die Ergebnisse gültig und gleich sind?

4) Noch etwas?

Hinweis: Wir führen einige grundlegende Überprüfungen in Java durch, die meisten befinden sich jedoch wie alle anderen Geschäftslogiken im Back-End.

Die Zunahme der Daten, die durch Neuberechnung aller Daten in einem Back-End gesendet würden, wäre kein Problem (geringe XML-Größe; Server und Bandbreite würden dem erhöhten Arbeitsaufwand der Benutzer standhalten).

IgnasK
quelle
1
Faustregel: Wenn eine stark typisierte Sprache verwendet wird.
Den
1
Automatisierte Unit- Tests werden einfacher, wenn sich die gesamte Logik im Back-End befindet. Wenn 90% das Back-End sein müssen und 10% das Back-End sein können, würde ich 100% in das Back-End stecken.
Ian
3
@Ian: Sie können auch automatisierte Unit-Tests für Front-End-Codes durchführen, wenn Sie Ihren Code gut strukturieren.
Lie Ryan
1
Faustregel: Wann immer Sie damit durchkommen können.
Goldlöckchen
3
Faustregel: Angenommen, der Benutzer hackt Ihr JavaScript und führt seine eigenen Berechnungen durch. Aus Sicherheitsgründen müssen die Berechnungen im Backend durchgeführt werden. Sie können auch beides tun: JS kann schnelleres Feedback geben, aber die Berechnungen, die tatsächlich zählen, werden auf dem Server durchgeführt.

Antworten:

36

Wie immer beinhalten solche Entscheidungen einen Kompromiss zwischen verschiedenen Zielen, von denen einige miteinander in Konflikt stehen.

  • Die Effizienz lässt darauf schließen, dass Sie Berechnungen im Front-End durchführen - sowohl, weil der Computer des Benutzers mehr Strom verbraucht und Ihr Server weniger, als auch, weil der Benutzer ein schnelleres Feedback sieht, was die Benutzererfahrung verbessert.

  • Die Sicherheit erfordert, dass Vorgänge, bei denen sich der Status ändert, nicht darauf beruhen können, dass Daten auf dem Clientcomputer überprüft oder berechnet werden, da der Clientcomputer möglicherweise von einem böswilligen Angreifer kontrolliert wird. Daher Sie müssen etwas validieren , die von nicht vertrauenswürdigen Quellen - Server-Seite kommt.

  • Die Effizienz und Wartbarkeit der Programmierung legt nahe, dass Sie aufgrund des verschwendeten Aufwands nicht zweimal dieselbe Berechnung durchführen sollten.

Oberflächlich klingt dies so, als ob alles serverseitig erledigt werden muss, aber das ist nicht immer der Fall. Wenn Sie den duplizierten Code problemlos verwalten können (z. B. indem Sie einen JavaScript-Validator automatisch aus Ihrem serverseitigen Java-Validator generieren), ist es eine gute Lösung, die Berechnung zu wiederholen. Wenn alle betroffenen Daten unwichtig sind, z. B. wenn der Benutzer nur sich selbst betrügen kann und Sie nicht, wenn er Werte manipuliert, ist keine serverseitige Validierung erforderlich. Wenn Ihre Reaktionszeit von völlig verschiedenen Engpässe dominiert wird , so dass eine Umlaufverzögerung nicht wahrnehmbar ist, dann sind UX Überlegungen nicht entscheidend, usw. Deshalb müssen Sie überlegen , wie stark jeder dieser Druck in Ihrer Situation ist, und entsprechend entscheiden .

Kilian Foth
quelle
4
Ich möchte hinzufügen, dass dies Programming efficiency and maintainability suggests that you shouldn't do the same computation twice because of the wasted effort.nicht korrekt ist, da [1] die Validierung im Front-End dem Benutzer eine schnelle Rückmeldung geben kann, um bei Bedarf Korrekturen vorzunehmen. [2] Die Validierung im Back-End reagiert nicht so schnell und bietet dem Benutzer daher nicht die beste Möglichkeit, Korrekturen vorzunehmen. Benutzer müsste warten und mehr Arbeit wiederholen. Daher denke ich, dass die beiden Validierungen nicht genau gleich sind.
InformedA
9
Das ist nicht das, was ich wollte , vermitteln - Wartbarkeit tut bedeuten „nicht selbst wiederholen“, und nach diesem Prinzip der Wiederholung ist sicherlich schlecht. Wenn es keine anderen Überlegungen gäbe, sollten Sie es nicht tun. Dass es trotzdem oft eine gute Idee ist, liegt daran, dass es andere Überlegungen gibt, die diesem Prinzip widersprechen, dh eine bessere Bedienbarkeit durch schnelle Abwicklung.
Kilian Foth
@randomA Sie wenden dieses Prinzip falsch an, wenn Sie meinen, dass etwas, das auf dem Server validiert werden muss, nur auf dem Server berechnet werden soll, denn wenn der "vom Server validierte Wert" (oder etwas davon abhängiges) an den Client zurückgegeben wird Irgendwann an den Server zurückgesendet, müssen Sie es trotzdem erneut validieren - unbrauchbar. Oder Sie benötigen ein sicheres Referenzsystem, das möglicherweise noch ineffizienter ist. Ich würde sagen, wenn Sie eine Berechnung auf dem Client durchführen können, tun Sie dies auf dem Client , aber vertrauen Sie auch niemals dem, was der Client Ihnen sagt .
Goldlöckchen
@goldilocks Was Sie in Fettdruck gesagt haben, ist auch das, dem ich ebenfalls zustimme. Sie müssen alles im Back-End validieren. Mein Punkt war, dass: die Validierung im Front-End reaktionsschneller ist, also nicht ganz dasselbe wie die Validierung im Back-End.
InformedA
13

Es gibt gute Gründe, Berechnungen im Backend durchzuführen

  • Geschäftslogik gehört nicht in die Präsentationsebene
  • Die Geschäftslogik in JavaScript ist eine Bedrohung
  • Sie gehen davon aus, dass es eine One-Front-End-> One-Back-End-Beziehung gibt, die nicht immer zutrifft . Bei Back-Ends sollte davon ausgegangen werden, dass sie in der Lage sind oder mehr als eine Front-End-Anwendung bedienen. Sie können also nichts davon annehmen.
  • Wenn Berechnungen eine große Datenmenge verwenden, wäre es nicht effizient, sie im Front-End zu speichern
  • Wenn die Datenbank für Berechnungen verwendet wird, können Sie sie im Front-End nicht replizieren

Meine Empfehlung

  • Lassen Sie die Datenbank so viele Geschäftsregeln wie möglich im Modell durchsetzen, einschließlich Fremdschlüssel, Primärschlüssel, Prüfbedingungen und Trigger
  • Die Business-Schicht soll Ausnahmen auslösen, wenn Geschäftsregeln nicht erfüllt sind (entweder weil die Datenbank einen Fehler zurückgegeben hat oder weil die Business-Schicht selbst die Daten validiert hat).
  • Wenn und nur wenn die Antwortzeit nicht akzeptabel ist, führen Sie Überprüfungen oder Vorverarbeitungen mit Ajax durch (die Arbeit wird nicht wirklich in JavaScript ausgeführt, sondern im Backend, ohne dass die Seite neu geladen werden muss).
  • Sie können eine einfache Validierung in JavaScript durchführen, indem Sie beispielsweise einen leeren Wert oder Werte, die zu lang sind oder außerhalb des Bereichs liegen, nicht zulassen (für letzteren möchten Sie möglicherweise die Bereiche im Back-End generieren).
Tulains Córdova
quelle
2
Das Problem bei der Durchsetzung von Geschäftsregeln durch die Datenbank besteht darin, dass Verstöße an das Front-End gemeldet werden! Wenn das Front-End Geschäftsregeln durchsetzt, kann es dem Benutzer schnell aussagekräftige Fehlermeldungen melden. Wenn das Back-End dies tut, gibt es viel klobigen Zwei-Wege-Verkehr zwischen dem Front-End und dem Back-End, da Fehler einzeln gemeldet werden.
James Anderson
@JamesAnderson Es gibt kein "Front-End" mehr. Es können mehrere Frontends zu derselben Datenbank oder mehrere Datenbanken zu mehreren Frontends vorhanden sein. Außerdem bedeutet die Durchsetzung der Geschäftsregeln durch das Back-End nicht, dass es dem Front-End untersagt ist, dies zu tun. Ich habe das im zweiten Aufzählungspunkt hervorgehoben.
Tulains Córdova