Plusy / minusy między podkreślaniem przetwarzania po stronie klienta lub po stronie serwera


20

Dlaczego miałbym pisać aplikację internetową z dużą ilością przetwarzania po stronie serwera?

Dla mnie pisanie programu po stronie klienta jest ogromną zaletą, ponieważ zabiera jak najwięcej obciążenia serwera, ponieważ musi on wysyłać dane do klienta przy minimalnym przetwarzaniu.

Niewiele widzę na temat pisania aplikacji internetowych poza pisaniem po stronie serwera i traktowaniem po stronie klienta jako widoku . Dlaczego miałbym to robić? Jedyną zaletą, jaką widzę, jest to, że mogę pisać w dowolnym języku ( http://www.paulgraham.com/avg.html ).


Całkiem dobrze jest wykonać większość przetwarzania na kliencie, pozostawiając tylko absolutną niezbędność serwerowi. Zasadniczo, dodatkowe walidacje danych (niezależne od walidacji po stronie klienta) i zabezpieczenia powinny być wdrażane po stronie serwera z powodów wymienionych w odpowiedziach.
sakisk

Jedną z rzeczy do przemyślenia jest debugowanie, które moim zdaniem jest zwykle wygodniejsze na serwerze. To samo dotyczy logowania.
Traubenfuchs

Nie zgadzam się, że pisanie aplikacji internetowych jest opisywane tylko jako strona wysyłająca widok. Spójrz na powstające frameworki, takie jak Vue, Angular itp., Aby tworzyć pełne aplikacje na kliencie i wymieniać dane tylko z serwerem.
Kwebble

Odpowiedzi:


28

Istnieją dwa główne problemy.

  1. Pierwszy jest łatwy - zwykle nie wiesz, jakie zasoby są dostępne po stronie klienta. Jeśli do przetworzenia czegoś potrzeba 1,5 GB, to czy naprawdę możesz to wypchnąć do przeglądarki nieznanego klienta (IE, Safari, Opera, Firefox itp.) Na nieznanej platformie klienta? Czy klient doceni jego dogmaty systemowe, gdy go przytłoczysz?

  2. Drugi jest bardziej architektoniczny - jakie warstwy chcesz wystawić na świat zewnętrzny? Większość zgadza się, że ujawnienie warstwy danych jest niezwykle ryzykowne. Co powiesz na swoją warstwę usług? Czy naprawdę chcesz wprowadzić tę logikę? Jeśli tak, czy narażasz także punkty wejścia na warstwę danych? Jeśli utrzymasz serwer warstwy usług, to co pozostanie? Interfejs użytkownika, prawda? Zobacz przyczynę 1, aby dowiedzieć się, ile z tego mieszka na serwerze, a ile na kliencie.


1
+1 za ukrywanie warstw. Przychodzi mi na myśl iniekcja SQL ...
jmq,

7
Nie sądzę, aby zastrzyki SQL miały coś wspólnego z przeniesieniem większości logiki na stronę klienta. Nawet jeśli przeniesiesz przetwarzanie danych na stronę klienta, nadal potrzebujesz jakiejś usługi po stronie serwera, która faktycznie uruchamiałaby zapytania SQL (chyba że chcesz podać nazwę użytkownika i hasło do bazy danych jako publiczne). Ta usługa jest odpowiedzialna za sprawdzanie poprawności i ucieczkę danych. Nie ma różnicy - MUSISZ zweryfikować i uciec od wszelkich danych wejściowych po stronie serwera ZAWSZE. Po prostu nie da się tego obejść.
Pijusn

16

Przede wszystkim bezpieczeństwo . Przekaż całą swoją logikę klientowi, a jest to uczciwa gra dla hakerów i exploitów.

Wszystko, co ma jakąkolwiek postrzeganą wartość, nie potrwa 5 minut, zwłaszcza wartość pieniężną, będzie grane, hakowane lub wykorzystywane i poważnie uszkodzą twój system. Nawet jeśli ma niewielką lub żadną wartość pieniężną, istnieje klasa ludzi, którzy włamią się do niego, aby złamać system, ponieważ są znudzeni.


1
„Nudzony” to prawdopodobnie przesada. Wielu hakerów włamuje się po prostu po to, aby coś zrobić lub oszukać głupca programisty. Rodzaj „twojego kodu jest zły i powinieneś czuć się źle”. Nie mówię, że hacki „z nudów” nigdy się nie zdarzają, ale nie sądzę, że jest to bardzo powszechne.
die maus

@Jarrod - czy możesz wyjaśnić, w jaki sposób wdrażanie logiki po stronie klienta jest złe z punktu widzenia bezpieczeństwa?
Proste rozwiązanie

@ Proste rozwiązanie, jeśli musisz zadać to pytanie ...

7

Po stronie klienta a po stronie serwera

Przetwarzanie po stronie klienta jest zgodne z bardziej popularnymi standardami REST, a także MVC, w przeciwieństwie do metod opartych na stronach i SOAP. Pojawienie się tych trendów i skupienie się na AJAX i Html-RIA, skryptach po stronie klienta rośnie i jest coraz bardziej popularne; jednak ze względu na obawy związane z bezpieczeństwem i możliwościami klienta skrypty po stronie klienta mają szczególną niszę i nie powinny być używane do wszystkiego.

Uwagi:

mobilny

Jeśli dużym segmentem docelowych odbiorców będą użytkownicy mobilni, intensywne przetwarzanie należy pozostawić serwerowi.

Spójność między przeglądarkami

Standardy sieciowe przeszły długą drogę i może to nie stanowić większego problemu, ale każdy programista wie, że IE 6,7 i 8, a czasami Safari mogą działać śmiesznie po stronie klienta - niektóre funkcje mogą nie działać z powodu ograniczenia bezpieczeństwa i inne z powodu niewdrożonych standardów. Ważne jest również, aby pamiętać, że użytkownik końcowy może skonfigurować przeglądarkę, aby mieć pewne ograniczenia, a nawet całkowicie wyłączyć przetwarzanie po stronie klienta (bez javascript!). Jeśli spójność jest wymagana dla 100% użytkowników (a zwłaszcza jeśli robisz coś niekonwencjonalnego), najważniejsza jest strona serwera.

Bezpieczeństwo

Wszelkie manipulacje danymi, które chcesz zabezpieczyć, muszą być wykonywane na serwerze. Wszelkie dane przetwarzane po stronie klienta są całkowicie otwarte na manipulacje. Na przykład, jeśli masz funkcję javascript, która przetwarza niektóre informacje, które następnie są przesyłane z powrotem do systemu - bardzo łatwo byłoby zmanipulować wynik tuż przed jego wysłaniem, nawet jeśli masz przykładowe zabezpieczenia zaplecza

UI / UX

Przetwarzanie po stronie klienta jest pozostawione interfejsowi użytkownika i tworzeniu bogatych aplikacji internetowych (RIA). Służy do tworzenia animacji, efektów, interakcji użytkownika, a także dynamicznego ładowania treści za pośrednictwem wywołań AJAX zamiast ponownego ładowania całej strony.


6

Przede wszystkim będzie to powielanie wysiłku. Najprawdopodobniej wszelkie dane od klienta zostaną ponownie sprawdzone i przetworzone na poziomie serwera.

Serwer nie może założyć, że Twój bogaty / solidny klient wysłał dane, więc przy wysyłaniu jakichkolwiek danych serwer musi je zweryfikować i przetworzyć. Dlatego warto to tam umieścić.

Uważam jednak, że można uzyskać logikę na poziomie klienta, aby uzyskać lepszą obsługę interfejsu użytkownika.

Masz rację, po co wysyłać dane do serwera, jeśli nie są kompletne lub nieprawidłowe. Łatwo jest sprawdzić wymagane pola lub poprawnie sformatowane telefony lub adresy e-mail. Nigdy nie podobało mi się przesyłanie formularza, a następnie czekanie 5 sekund, aby powiedzieć mi, że zapomniałem wpisać pole. Tego rodzaju przetwarzanie, oczywiście, zrób to na kliencie i upewnij się, że jest poprawne, i używając logiki po stronie klienta do szybkiej reakcji na użytkownika. Jak już zauważyłeś, dodatkowym efektem ubocznym byłoby to, że Twój serwer musiałby radzić sobie z mniejszymi złymi żądaniami danych. ALE, serwer nadal musi również sprawdzać poprawność, więc kopiujesz logikę. Ale Twoi użytkownicy będą szczęśliwsi.

Jest tu cienka linia. Prosta logika walidacji OK, podstawowa logika biznesowa nie jest OK.


4
  1. Przede wszystkim musisz zrozumieć architekturę aplikacji internetowych, większość, jeśli nie wszystkie, to 3-warstwowe:

    a) Klient / prezentacja - HTML i JavaScript, mogą zawierać ActiveX / Flash / Java Applets / Silverlight. Wyjdę na całość i dodam natywne aplikacje mobilne, które komunikują się z serwerem zaplecza. Zasadniczo rolą tej warstwy jest zapewnienie interfejsu dla użytkownika systemu do interakcji z nią.

    b) Logika biznesowa - PHP / RoR / Java, w której dane od klienta są gromadzone, przetwarzane i przechowywane, a żądania klientów dotyczące danych są przetwarzane i wysyłane z powrotem do klienta

    c) Magazyn danych zaplecza - zapewnia trwałe przechowywanie informacji o systemie

  2. Więc gdzie robisz sprawdzanie poprawności we wszystkich warstwach. Dlaczego?

    a) Po stronie klienta - upewnij się, że użytkownik wprowadza poprawne dane, wymagane pola itp

    b) Logika biznesowa - filtruj, odkażaj i weryfikuj dane klienta. Uruchom bardziej złożone reguły biznesowe, aby upewnić się, że dane są dobrze uformowane do przechowywania. Część sprawdzania poprawności wykonanego w interfejsie użytkownika powtarza się tutaj, ponieważ mogą istnieć różni klienci, na przykład w przeglądarkach JavaScript można wyłączyć. Może również akceptować dane z różnych źródeł, na przykład za pośrednictwem interfejsów API, więc wszystko musi zostać zweryfikowane.

    c) Magazyn danych zaplecza - ograniczenia zapewniają, że dane są dobrze uformowane do przechowywania i późniejszego wyszukiwania.

Więc na czym koncentrujesz swoje wysiłki związane z weryfikacją, użyj każdej warstwy, aby przeprowadzić walidację, która najbardziej jej odpowiada, i pozostaw bardziej złożone reguły dla warstwy, która może to obsłużyć


3

Dużą rolę odgrywa utrzymywanie przetwarzania blisko twoich danych. Jeśli masz setki GB danych, to oczywiście nie wyślesz ich do klienta. Wraz ze wzrostem prędkości dostępu do danych staje się to coraz mniejszym problemem, ale jeśli masz witrynę Big Data, nadal chcesz wykonać tak dużo filtrowania i zawężania na serwerze, jak to możliwe, zanim ją wyślesz.


1

Gdy stworzysz swoje zachowanie całkowicie po stronie klienta (powiedzmy za pomocą Javascript), SEO może stać się problemem.

Rozwiązania internetowe, które dużo przechowują po stronie serwera, łatwiej są w stanie przechowywać określone treści pod określonym adresem URL (zazwyczaj RESTful), w sposób widoczny dla wyszukiwarek.

Oznacza to również, że użytkownik może utworzyć zakładkę do określonej strony. Czy próbowałeś tego na Facebooku?

Te rzeczy można rozwiązać, ale zwykle są wbudowane w aplikacje, które dużo robią na serwerze (RAILS, WordPress itp.), Podczas gdy jeśli budujesz powiedzmy REACT, będziesz musiał skakać przez obręcze.


0

Powodem jest stabilność .

Po stronie serwera mogę wybrać stabilne komponenty. Zwykle oznacza to, że wybieram Javę i kilka bardzo starannie wybranych bibliotek, takich jak FreeMarker. Nie trzeba dodawać, że każda biblioteka poza standardowymi bibliotekami Javy jest traktowana jako jednorazowa, więc uzyskuję dostęp do bibliotek zewnętrznych przez samodzielnie wykonane opakowanie. Oznacza to, że mogę łatwo przejść z jednej biblioteki do drugiej, jeśli pojawi się taki wymóg.

Ilekroć aktualizuję Javę do nowej wersji, zwykle działa ona dobrze, ponieważ Java jest niezwykle stabilnym komponentem nawet w przypadku dużych aktualizacji wersji. Ponadto na każdym serwerze, na którym mam, działa ta sama wersja Java. Nie każdy klient korzysta z tej samej implementacji JavaScript.

Po stronie klienta nie mogę wybrać stabilnych komponentów. Twórcy przeglądarki zmuszą mnie do wybrania JavaScript, języka, który szczególnie mi się nie podoba, ale którego jestem zmuszony używać. (I nie mów mi o językach skompilowanych do JavaScript, są okropne!) Implementacja JavaScript w każdej przeglądarce jest inna. Oznacza to, że testowanie mojego produktu z każdą obsługiwaną wersją przeglądarki to piekło.

Moje rozwiązanie? Po stronie serwera wykonuję jak najwięcej przetwarzania, a po stronie klienta jest to tylko lekkie opakowanie, które wysyła dane do serwera i odbiera dane z serwera w postaci fragmentów JSON i HTML. Unikaj XML; zamiast tego użyj JSON.

Nie wykonuję szablonów po stronie klienta; Renderuję zawartość na serwerze do fragmentu HTML, który następnie przypisuję za pomocą.innerHTML atrybutu do różnych elementów zastępczych po stronie klienta. Dzięki temu stos technologii jest tak prosty, jak to możliwe, ponieważ nie potrzebuję dwóch silników szablonów (Java i JavaScript).

Wadą jest oczywiście opóźnienie prędkości światła; pół sekundy opóźnienia nie jest niczym niezwykłym między kontynentami.

Pamiętaj, że Twoi klienci mogą być smartfonami. Smartfony mają ograniczoną żywotność baterii, więc jeśli wykonujesz ciężkie obliczenia, lepiej rozładuj je na swoje serwery. Jednak proste rzeczy mogą być bardziej energooszczędne, gdy są wykonywane po stronie klienta, ponieważ wtedy można uniknąć dostępu radiowego. Ale główny argument, stabilność, może oznaczać, że może mieć sens odciążenie nawet prostego obliczenia na serwerze.

Jako uzupełnienie, jak już zauważono w niektórych odpowiedziach, zyskujesz także bezpieczeństwo . Jeśli logika aplikacji jest całkowicie po stronie klienta, ktoś może np. Ustalić cenę za wszystko, co zamierza kupić w sklepie internetowym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.