Statefulness не обязательно плохая вещь, но вы должны понимать разницу между приложениями с состоянием и приложениями без сохранения состояния. Короче говоря, приложения с отслеживанием состояния хранят информацию о текущем сеансе, а приложения без сохранения состояния - нет. Информация, хранимая постоянно как часть учетной записи пользователя, может храниться или не сохраняться в сеансе, но хранение информации, связанной с учетной записью пользователя, само по себе не делает приложение сохраняющим состояние. Statefulness требует, чтобы сервер поддерживал информацию о сеансе текущего пользователя помимо того, что поддерживает браузер клиента. Например, клиент может пройти аутентификацию и получить cookie-файл JSESSIONID, который он затем отправляет на сервер с каждым запросом. Если сервер начинает хранить содержимое в области сеанса приложения на основе этого JSESSIONID, он становится состоящим.
безгражданство
Под сохранением состояния мы подразумеваем, что сервер и клиент не поддерживают текущую информацию о сеансе пользователя. Клиент и сервер могут использовать токен некоторой формы для обеспечения аутентификации между запросами, но другая текущая информация не сохраняется. Типичным вариантом использования такого решения может быть новостной сайт, где большинство пользователей (новых потребителей) потребляют информацию, но не производят информацию, которая возвращается на сайт. В таких случаях сайту не нужно хранить какую-либо информацию о текущем сеансе пользователя. Обратите внимание, что сайт может по-прежнему использовать куки для идентификации пользователя и хранить информацию об использовании сайта этим пользователем, но это все равно может рассматриваться как не сохраняющее состояния, поскольку все записанное может быть транзакционным, например, по той ссылке, по которой щелкнул пользователь, которая может быть записана сервер, но не поддерживается в пользовательском сеансе.
Statefulness на сервере
На сервере приложение с сохранением состояния сохраняет информацию о состоянии текущих пользователей. Этот подход обычно включает использование файлов cookie для идентификации системы пользователя, чтобы можно было поддерживать состояние на сервере между запросами. Сеансы могут или не могут быть аутентифицированы, в зависимости от контекста приложения. Серверные приложения с сохранением состояния предлагают преимущество кэширования информации о состоянии пользователя на сервере, ускорения поиска и времени отклика страницы. С другой стороны, хранение информации в области сеанса является дорогостоящим, а в масштабе это становится очень ресурсоемким. Это также создает потенциальный вектор атаки для хакеров, пытающихся перехватить идентификаторы сеансов и украсть сеансы пользователей. Серверные приложения с отслеживанием состояния также сталкиваются с проблемой защиты пользовательских сеансов от непредвиденных прерываний обслуживания, например сбоя сервера.
Statefulness на клиенте
Используя JavaScript и современные браузерные технологии, такие как sessionStorage, приложение теперь может легко сохранять информацию о состоянии сеанса пользователя на устройстве этого пользователя. В целом, приложение все еще может считаться состоящим из состояния, но работа по поддержанию состояния была перенесена на клиента. Этот подход имеет большое преимущество (для сопровождающего веб-приложения) по сравнению с поддержанием состояния на сервере в том смысле, что каждый пользователь, по сути, поддерживает свое собственное состояние, и нет никакой нагрузки на инфраструктуру сервера. В масштабах сети такой архитектурный выбор имеет огромные последствия для затрат на оборудование и электроэнергию. Поддержание состояния сервера может буквально стоить миллионы долларов в год. Переход на систему, поддерживающую состояние клиента, может сэкономить миллионы долларов в год.
Жетоны против печенья
Cookies действуют как идентификаторы для клиентских устройств / браузеров. Они могут использоваться для хранения всевозможных вещей, но обычно они хранят некоторую форму идентификатора, такую как CFID / CFTOKEN в приложениях CFML. Куки-файлы могут быть настроены на длительное использование в браузере пользователя, что позволяет выполнять такие вещи, как поддержание аутентификации в приложении между сеансами браузера. Куки-файлы также могут быть установлены только для памяти, поэтому они истекают, когда пользователь закрывает браузер.
Токены, как правило, являются своего рода идентифицирующей информацией о пользователе, которая генерируется на сервере (с использованием шифрования для шифрования информации), передается клиенту и возвращается на сервер с последующим запросом. Они могут быть переданы в заголовке запроса и ответа, что является общим шаблоном в одностраничных приложениях. В идеале каждый запрос / ответ приводит к генерации нового токена, поэтому токены не могут быть перехвачены и использованы злоумышленником позднее.
Одностраничные приложения и состояние клиента
С помощью SPA информация о состоянии загружается в браузер клиента и сохраняется там. Когда состояние изменяется, например, вы публикуете обновление для своей учетной записи в социальной сети, клиент передает эту новую транзакцию на сервер. В этом случае сервер сохраняет это обновление в постоянном хранилище данных, таком как база данных, и передает клиенту любую информацию, необходимую для синхронизации с сервером, на основе обновления (например, идентификатор для обновления).
Обратите внимание, что этот шаблон хранения состояния на клиенте предлагает преимущества для онлайн / офлайнового взаимодействия в том, что вы можете быть отключены от сервера, оставаясь при этом несколько пригодным для использования приложением. Twitter является хорошим примером этого случая, когда вы можете просмотреть все загруженные клиентские части в своем фиде Twitter, даже если вы отключены от приложения сервера Twitter. Этот шаблон также создает сложность в синхронизации между сервером и клиентом, что является отдельной темой. Сложности решения являются компромиссом для возможности поддерживать состояние на клиенте.
Statefulness на клиенте заставляет веб-приложения чувствовать и вести себя как традиционные настольные приложения. В отличие от настольных приложений, вы обычно не загружаете всю информацию своей учетной записи в сеанс клиента в браузере. Это во многих случаях было бы нецелесообразным и приводило к плохому опыту. Можете ли вы представить себе попытку загрузить весь ящик Gmail в браузер? Вместо этого клиент хранит информацию, например, какую метку / папку вы просматриваете и где в списке писем в этой папке вы просматриваете. Балансирование того, какую информацию о состоянии поддерживать и что запрашивать по мере необходимости, является еще одной инженерной задачей этого шаблона, и опять же, он представляет собой компромисс между практичностью и предоставлением хорошего пользовательского опыта.
Тележки для покупок и тому подобное
Что касается специфики, например, корзин для покупок, то это действительно зависит от решения. Корзина для покупок может храниться в базе данных на сервере, она может храниться только в объеме сеанса на сервере или даже может храниться на клиенте. Amazon имеет постоянные корзины покупок для зарегистрированных пользователей и «временные» корзины для анонимных пользователей, хотя эти корзины в некоторой степени постоянны.
Когда вы говорите о чем-то вроде Google, который на самом деле представляет собой набор различных приложений, принадлежащих одному бренду, они, вероятно, не разделяют общую архитектуру, и каждое из них построено так, чтобы наилучшим образом удовлетворить потребности своих пользователей. Если вы хотите узнать, как создается сайт, откройте инструменты разработчика в своем браузере и посмотрите на него. Проверьте наличие файлов cookie, просмотрите сетевой трафик и посмотрите, как он работает.
Извините, если этот ответ немного гремит, но полнота - сложная тема.