Плюсы / минусы между упором на обработку на стороне клиента или на стороне сервера

20

Зачем мне писать веб-приложение с большой обработкой на стороне сервера?

На мой взгляд, написание клиентской части программы является огромным преимуществом, поскольку она отнимает как можно большую нагрузку на сервер, поскольку ему нужно только отправить данные клиенту с минимальной обработкой.

Я очень мало вижу в написании веб-приложений, кроме того, что пишу их на стороне сервера и воспринимаю на стороне клиента только как представление . Зачем мне это делать? Единственное преимущество, которое я вижу, это то, что я могу писать на любом языке, который хочу ( http://www.paulgraham.com/avg.html ).

JustcallmeDrago
источник
Совершенно нормально выполнять большую часть обработки клиенту и оставлять только то, что необходимо серверу. Преимущественно, дополнительная проверка данных (отдельно от проверки на стороне клиента) и безопасность должны быть реализованы на стороне сервера по причинам, указанным в ответах.
Сакиск
Нужно подумать об отладке, которая, на мой взгляд, обычно более удобна на сервере. То же самое касается регистрации.
Traubenfuchs
Я не согласен с тем, что написание веб-приложений описывается только как отправка представления на стороне сервера. Посмотрите на рост фреймворков, таких как Vue, Angular и т. Д., Чтобы создавать полноценные приложения на клиенте и обмениваться данными только с сервером.
Квеббл

Ответы:

28

Есть две основные проблемы.

  1. Первый прост - вы обычно не знаете, какие ресурсы доступны на стороне клиента. Если для обработки чего-либо требуется 1,5 ГБ, действительно ли вы можете вставить это в неизвестный клиентский браузер (IE, Safari, Opera, Firefox и т. Д.) На неизвестной клиентской платформе? Будет ли клиент ценить свою систему, когда вы сокрушаете ее?

  2. Второй - более архитектурный. Какие слои вы хотите показать внешнему миру? Большинство согласится с тем, что раскрытие слоя данных невероятно рискованно. Как насчет вашего уровня обслуживания? Вы действительно хотите донести эту логику? Если вы это сделаете, вы также выставляете точки входа на свой слой данных? Если вы оставите серверную часть сервисного уровня, то что останется? Пользовательский интерфейс, верно? См. Причину 1 о соображениях относительно того, сколько из этого живет на сервере и сколько на клиенте.

Мэтью Флинн
источник
1
+1 за сокрытие слоев. SQL-инъекция приходит на ум ...
JMQ
7
Я не думаю, что SQL-инъекции имеют какое-либо отношение к переносу большей части вашей логики на клиентскую сторону. Даже если вы перенесете обработку данных на клиентскую сторону, вам все равно понадобится какой-то серверный сервис, который на самом деле будет выполнять запросы SQL (если только вы не захотите сделать имя пользователя и пароль своей базы данных общедоступными). Эта служба отвечает за проверку и удаление данных. Там нет никакой разницы - вы ДОЛЖНЫ проверять и избегать любого ввода на вашей стороне сервера ВСЕГДА. Обойти это просто невозможно.
Пиюсн
16

Прежде всего это безопасность . Выдвиньте всю свою логику на клиента, и это честная игра для хакеров и эксплойтов.

Все, что имеет какую-либо воспринимаемую ценность, не будет длиться 5 минут, особенно денежную, и будет подвергнуто риску взлома или эксплуатации, что очень сильно сломает вашу систему. Даже если это не имеет почти никакой денежной ценности, есть класс людей, которые взломают его, просто чтобы сломать вашу систему, потому что им скучно.


источник
1
«Скучно», вероятно, преувеличение. Многие хакеры взламывают, чтобы просто заявить о себе или одурачить разработчика. Что-то вроде «твой код плохой, и ты должен чувствовать себя плохо». Не сказать, что хаки "от скуки" никогда не случаются, но я не думаю, что это очень распространено.
умереть
@Jarrod - можете ли вы рассказать о том, как плохо реализовать логику на стороне клиента с вашей точки зрения?
Простое решение
@ Simple-Solution, если вам нужно задать этот вопрос ...
7

Сторона клиента и сторона сервера

Обработка на стороне клиента соответствует более популярным стандартам REST, а также MVC, в отличие от подходов на основе страниц и SOAP. Появление этих тенденций и ориентация на AJAX и Html-RIA, скриптинг на стороне клиента становится все более популярным; однако из-за проблем безопасности и возможностей клиента сценарии на стороне клиента имеют особую нишу и не должны использоваться для всего.

Соображения:

мобильный

Если большой сегмент вашей целевой аудитории будет мобильным пользователем, интенсивная обработка должна быть оставлена ​​на сервер.

Кросс-браузерная согласованность

Веб-стандарты прошли долгий путь, и это, возможно, не так сильно беспокоит, но каждый веб-разработчик знает, что IE 6,7, 8 и иногда Safari могут показаться забавными на стороне клиента - некоторые функции могут не работать из-за ограничения безопасности и другие из-за нереализованных стандартов. Также важно отметить, что конечный пользователь может настроить браузер на определенные ограничения или даже полностью отключить обработку на стороне клиента (без JavaScript!). Если согласованность является требованием для 100% пользователей (и особенно, если вы делаете что-то неортодоксальное), серверная сторона является наиболее важной.

Безопасность

Любые манипуляции с данными, которые вы хотите обезопасить, должны выполняться на сервере. Любые данные, которые обрабатываются на стороне клиента, абсолютно открыты для манипуляций. Например, если у вас есть функция javascript, которая обрабатывает некоторую информацию, которая затем отправляется обратно в систему, было бы очень легко манипулировать результатом непосредственно перед его публикацией, даже если у вас есть примерная внутренняя безопасность

UI / UX

Обработка на стороне клиента оставлена ​​для пользовательского интерфейса и создания многофункциональных интернет-приложений (RIA). Он используется для создания анимации, эффектов, взаимодействия с пользователем, а также для динамической загрузки контента с помощью вызовов AJAX вместо повторной загрузки всей страницы.

dardawk
источник
6

В первую очередь это будет дублирование усилий. Скорее всего, любые данные от клиента снова будут проверены и обработаны на уровне сервера.

Сервер не может предположить, что ваш расширенный / надежный клиент отправил данные, поэтому при отправке любых данных сервер должен проверить их и обработать. Так что имеет смысл поместить это туда.

Тем не менее, я полагаю, что некоторая логика может быть реализована на уровне клиента для лучшего пользовательского интерфейса.

Вы правы, зачем отправлять данные на сервер, если они не полны или неверны. Это легко проверить для обязательных полей или для правильно отформатированных телефонов или адресов электронной почты. Мне никогда не нравилось отправлять форму, а затем ждать 5 секунд, чтобы сказать мне, что я забыл ввести поле. Такая обработка, конечно же, выполняется на клиенте и должна быть корректной и использовать логику на стороне клиента для быстрого ответа пользователю. Как вы указали, дополнительным побочным эффектом будет то, что вашему серверу придется иметь дело с менее некорректными запросами данных. НО, сервер все еще должен проверять, поэтому вы дублируете логику. Но ваши пользователи будут счастливее.

Здесь есть тонкая грань. Простая логика проверки в порядке, основная бизнес-логика не в порядке.

Джон Рейнор
источник
4
  1. Прежде всего вам необходимо понять архитектуру веб-приложений, большинство, если не все, являются 3-уровневыми:

    а) Клиент / Презентация - HTML и Javascript, могут содержать ActiveX / Flash / Java Applets / Silverlight. Я выйду на ветку и добавлю нативные мобильные приложения, которые взаимодействуют с бэкэнд-сервером. По сути, роль этого уровня заключается в предоставлении интерфейса для взаимодействия пользователя системы.

    b) Бизнес-логика - PHP / RoR / Java, где данные от клиента собираются, обрабатываются и хранятся, и где клиентские запросы на данные обрабатываются и отправляются обратно клиенту

    c) Backend Data Store - обеспечивает постоянное хранение системной информации

  2. Итак, где вы делаете проверку, во всех слоях. Почему?

    а) Клиентская сторона - убедитесь, что пользователь вводит правильные данные, обязательные поля и т. д.

    б) Бизнес-логика - фильтровать, очищать и проверять данные клиента. Запустите более сложные бизнес-правила, чтобы гарантировать, что данные правильно сформированы для хранения. Некоторая часть проверки, выполненной во внешнем интерфейсе, повторяется здесь, в связи с тем, что могут быть разные клиенты, например, для браузеров Javascript можно отключить. Он также может принимать данные из разных источников через API, например, поэтому все это должно быть проверено.

    c) Бэкэнд Хранилище данных - ограничения гарантируют, что данные хорошо сформированы для хранения и последующего извлечения.

Итак, на чем вы сосредоточите свои усилия по валидации, используйте каждый слой для выполнения валидации, которая подходит ему лучше всего, и оставьте более сложные правила для слоя, который может с ним справиться

Стивен Сенкомаго Мусоке
источник
3

Большая часть держит вашу обработку близко к вашим данным. Если у вас есть сотни ГБ данных, вы, очевидно, не собираетесь передавать их клиенту. С увеличением скорости доступа к данным это становится меньшей проблемой, но если у вас есть сайт Big Data, вы все равно хотите выполнить как можно больше фильтрации и сужения на сервере, прежде чем отправлять его.

TMN
источник
1

Когда вы создаете свое поведение полностью на стороне клиента (скажем, с помощью Javascript), SEO может стать проблемой.

Веб-решения, которые занимают много места на стороне сервера, легче хранить определенный контент, размещенный по определенному URL (обычно RESTful), так, чтобы это было видно поисковым системам.

Это также означает, что посетитель может добавить в закладки определенную страницу. Вы пробовали это на Facebook?

Эта штука может быть решена, но обычно она встроена в приложения, которые много делают на сервере (RAILS, WordPress и т. Д.), Тогда как, если вы встраиваете, скажем, REACT, вам придется перепрыгивать через обручи.

Катинка Хесселинк
источник
0

Причина в стабильности .

На стороне сервера я могу выбрать стабильные компоненты. Обычно это означает, что я выбираю Java и несколько очень тщательно отобранных библиотек, таких как FreeMarker. Излишне говорить, что каждая библиотека, кроме стандартных библиотек Java, рассматривается как одноразовая, поэтому я обращаюсь к внешним библиотекам через самодельную оболочку. Это означает, что я могу легко перейти из одной библиотеки в другую, если возникнет необходимость.

Всякий раз, когда я обновляю Java до новой версии, она обычно работает хорошо, потому что Java является чрезвычайно стабильным компонентом даже при обновлении основных версий. Кроме того, на каждом из моих серверов работает одна и та же версия Java. Не каждый клиент использует одну и ту же реализацию JavaScript.

На стороне клиента я не могу выбрать стабильные компоненты. Производители браузеров заставят меня выбрать JavaScript, язык, который мне особенно не нравится, но который я вынужден использовать. (И не говорите мне о языках, которые скомпилированы в JavaScript, они ужасны!) Реализация JavaScript каждого браузера отличается. Это означает, что тестировать мой продукт с каждой поддерживаемой версией браузера - это настоящий ад.

Мое решение? Я выполняю как можно больше обработки на стороне сервера, а на стороне клиента - только облегченная оболочка, которая отправляет данные на сервер и получает данные с сервера в виде фрагментов JSON и HTML. Избегайте XML; используйте вместо этого JSON.

Я не занимаюсь шаблонами на стороне клиента; Я отображаю содержимое на сервере в HTML-фрагмент, который затем назначаю с помощью .innerHTMLатрибута различным элементам-заполнителям на стороне клиента. Это позволяет максимально упростить стек технологий, поскольку мне не нужны два движка шаблонов (один на Java и один на JavaScript).

Недостатком, очевидно, является задержка скорости света; Полсекунды латентности не редкость между континентами.

Учтите, что вашими клиентами в наши дни могут быть смартфоны. Смартфоны имеют ограниченное время автономной работы, поэтому, если вы выполняете тяжелые вычисления, лучше разгрузить их на свои серверы. Однако простые вещи могут быть более энергоэффективными, если они выполняются на стороне клиента, потому что тогда вы можете избежать радиодоступа. Но главный аргумент, стабильность, может означать, что на самом деле имеет смысл перегрузить даже простые вычисления на сервер.

Как дополнение, как уже отмечалось в некоторых ответах, вы также получаете безопасность . Если логика приложения полностью на стороне клиента, кто-то может, например, установить цену на любую вещь, которую он собирается купить в вашем интернет-магазине.

juhist
источник