Действительно ли сеансы нарушают покой?


действительно ли использование сеансов в RESTful API нарушает RESTfulness? Я видел много мнений, идущих в любом направлении, но я не уверен, что сессии неугомонный. С моей точки зрения:

  • аутентификация не запрещена для RESTful (в противном случае было бы мало пользы в RESTful services)
  • аутентификация выполняется путем отправки маркера аутентификации в запросе, обычно заголовок
  • этот маркер проверки подлинности должен быть получен каким-то образом и может быть отозван, в этом случае он должен быть продлен
  • маркер аутентификации должен быть проверен сервером (иначе это не была бы аутентификация)

Так как же сеансы нарушают это?

  • на стороне клиента, сеансы реализуются с помощью cookies
  • cookies-это просто дополнительный HTTP-заголовок
  • файл cookie сеанса может быть получен и отозван в любое время
  • сессии печенье может иметь бесконечное время жизни, если это необходимо
  • идентификатор сеанса (маркер аутентификации) проверяется на стороне сервера

таким образом, для клиента файл cookie сеанса точно такой же, как и любой другой механизм аутентификации на основе заголовка HTTP, за исключением того, что он использует вместо Authorization или какой-то другой проприетарный заголовок. Если бы не было сеанса, прикрепленного к серверной стороне значения cookie, почему это имело бы значение? Сторона сервера реализация не должна касаться клиента до тех пор, пока сервер поведение спокойный. Таким образом, куки сами по себе не должны создавать API неугомонный, а сеансы-это просто куки для клиента.

мои предположения ошибочны? Что делает куки сессии неугомонный?

6 429

6 ответов:

во-первых, давайте определим некоторые термины:

  • RESTful:

    можно охарактеризовать приложения, соответствующие ограничениям REST описанный в этом разделе Как "RESTful".[15] если служба нарушает какие-либо из требуемых ограничений его нельзя считать спокойным.

    по данным Википедия.

  • ограничение без гражданства:

    затем мы добавим ограничение к взаимодействию клиент-сервер: общение должно быть без гражданства в природе, как и в стиль клиент-сервер без состояния (CSS) раздела 3.4.3 (рисунок 5-3), таким образом, что каждый запрос от клиента к серверу должен содержать все информация, необходимая для понимания запроса, и не может принять преимущество любого сохраненного контекста на сервере. Состояние сеанса поэтому держится всецело на клиенте.

    по словам Филдинг диссертация.

таким образом, сеансы на стороне сервера нарушают ограничение без сохранения состояния REST и поэтому RESTfulness.

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

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

на мой взгляд нет ничего плохого с печеньем. Технология cookie - это механизм хранения на стороне клиента, в котором сохраненные данные автоматически прикрепляются к заголовкам cookie по каждому запросу. Я не знаю ограничения на отдых что имеет проблемы с такого рода технологией. Таким образом, нет никаких проблем с самой технологией, проблема заключается в ее использовании. Филдинг написал подраздел о том, почему он думает, что HTTP cookies плохие.

с моей точки зрения:

  • аутентификация не запрещена для RESTful (в противном случае было бы мало пользы в RESTful services)
  • аутентификация выполняется путем отправки маркера аутентификации в запросе, как правило, заголовок
  • этот токен аутентификации должен быть получен каким-то образом и может быть отозван, в этом случае он должен быть обновлен
  • маркер аутентификации должен быть проверен сервером (иначе это не была бы аутентификация)

ваша точка зрения была довольно твердой. Единственная проблема заключалась в концепции создания маркера аутентификации на сервере. Тебе не нужна эта часть. Что вам нужно, это хранить имя пользователя и пароль на клиенте и отправить его с каждым запросом. Вам не нужно больше, чтобы сделать это, чем HTTP basic auth и зашифрованное соединение:

Figure 1. - Stateless authentication by trusted clients

  • Рис. 1. - Проверка подлинности без сохранения состояния доверенными клиентами

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

теперь это работает довольно хорошо доверенными клиентами, написанными вами, но как насчет сторонних клиентов? Они не могут иметь имя пользователя и пароль и все разрешения пользователей. Таким образом, вы должны хранить отдельно, какие разрешения сторонний клиент может иметь конкретным пользователем. Таким образом, разработчики клиентов могут зарегистрировать своих сторонних клиентов и получить уникальный ключ API, а пользователи могут разрешить сторонним клиентам доступ к некоторой части своих разрешений. Например, читать имя и адрес электронной почты, или перечислять своих друзей и т. д... После разрешения стороннего клиента сервер будет генерировать маркер доступа. Эти маркеры доступа могут использоваться сторонним клиентом для доступа к разрешениям, предоставленным пользователем, например:

Figure 2. - Stateless authentication by 3rd party clients

  • Рис. 2. - Аутентификация без состояния сторонними клиентами

таким образом, сторонний клиент может получить маркер доступа от доверенного клиента (или непосредственно от пользователя). После этого он может отправить действительный запрос с ключом API и токеном доступа. Это самое основное Механизм auth 3rd party. Вы можете узнать больше о деталях реализации в документации каждой сторонней системы аутентификации, например OAuth. Конечно, это может быть более сложным и более безопасным, например, вы можете подписать детали каждого отдельного запроса на стороне сервера и отправить подпись вместе с запросом и так далее... Фактическое решение зависит от потребности вашего приложения.

во-первых, отдых не является религией и не должен рассматриваться как таковой. В то время как есть преимущества для RESTful услуг, вы должны следовать только принципам отдыха, насколько они имеют смысл для вашего приложения.

тем не менее, аутентификация и состояние на стороне клиента не нарушают принципы REST. Хотя REST требует, чтобы переходы состояний были без состояния, это относится к самому серверу. В глубине души все остальное-это документы. Идея безгражданства является ли сервер без состояния, а не клиенты. Любой клиент, выдающий идентичный запрос (те же заголовки, куки, URI и т. д.), должен быть доставлен в то же место в приложении. Если веб-сайт сохранит текущее местоположение пользователя и управляемую навигацию, обновив эту переменную навигации на стороне сервера, то REST будет нарушен. Другой клиент с идентичной информацией запроса будет доставлен в другое место в зависимости от состояния на стороне сервера.

веб-сайт Google услуги являются фантастическим примером спокойной системы. Они требуют, чтобы при каждом запросе передавался заголовок аутентификации с ключом аутентификации пользователя. Это немного нарушает принципы REST, поскольку сервер отслеживает состояние ключа проверки подлинности. Состояние этого ключа должно поддерживаться, и у него есть какая-то дата/время истечения срока действия, после которого он больше не предоставляет доступ. Однако, как я уже упоминал в верхней части моего поста, жертвы должны быть сделаны, чтобы разрешить применение фактически работать. Тем не менее, маркеры аутентификации должны храниться таким образом, чтобы все возможные клиенты могли продолжать предоставлять доступ в течение их действительного времени. Если один сервер управляет состоянием ключа проверки подлинности до такой степени, что другой сервер с балансировкой нагрузки не может взять на себя выполнение запросов на основе этого ключа, вы начали действительно нарушать принципы REST. Службы Google гарантируют, что в любое время вы можете взять маркер аутентификации, который вы использовали на своем телефоне против сервера балансировки нагрузки A и нажмите сервер балансировки нагрузки B с вашего рабочего стола и по-прежнему иметь доступ к системе и быть направлены на те же ресурсы, если запросы были идентичны.

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

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

Cookies не предназначены для аутентификации. Зачем изобретать колесо? HTTP имеет хорошо продуманные механизмы аутентификации. Если мы используем куки, мы попадаем в использование HTTP только в качестве транспортного протокола, поэтому нам нужно создать наш собственные сигнальная система, например, чтобы сообщить пользователям, что они предоставили неправильную аутентификацию (использование HTTP 401 было бы неверным, поскольку мы, вероятно, не будем поставлять Www-Authenticate для клиента, как требуют спецификации HTTP:)). Следует также отметить, что Set-Cookie это только a рекомендация для клиента. Его содержимое может быть сохранено или не сохранено (например, если куки отключены), в то время как Authorization заголовок отправляется автоматически по каждому запросу.

еще один момент заключается в том, что для получения файла cookie авторизации вы, вероятно, захотите сначала предоставить свои учетные данные? Если так, то разве это не было бы беспокойно? Простой пример:

  • ты попробуй GET /a без печенья
  • вы получаете запрос на авторизацию как-то
  • вы идете и авторизуетесь как-то вроде POST /auth
  • вы получаете Set-Cookie
  • ты попробуй GET /aС печенье. Но делает GET /a вести себя идемпотентно в этом случае?

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

на самом деле, RESTfulness применяется только к ресурсам, как указано универсальным идентификатором ресурса. Поэтому даже говорить о таких вещах, как заголовки, куки и т. д. в отношении отдыха это не совсем уместно. REST может работать над любым протоколом, даже если это обычно делается через HTTP.

основной определитель заключается в следующем: если вы отправляете вызов REST, который является URI, то после успешного выполнения вызова на сервер этот URI возвращает тот же контент, предполагая, что нет переходы были выполнены (PUT, POST, DELETE)? Этот тест исключил бы ошибки или запросы аутентификации, возвращаемые, потому что в этом случае запрос еще не сделал его на сервер, то есть сервлет или приложение, которое вернет документ, соответствующий данному URI.

аналогично, в случае POST или PUT, вы можете отправить данный URI / полезную нагрузку, и независимо от того, сколько раз вы отправляете сообщение, оно всегда будет обновлять одни и те же данные, так что последующие Возвращает возвращает последовательный результат?

REST-это данные приложения, а не информация низкого уровня, необходимая для передачи этих данных.

в следующем блоге, Рой Филдинг дал хорошее резюме всей идеи отдыха:

http://groups.yahoo.com/neo/groups/rest-discuss/conversations/topics/5841

"спокойная система прогрессирует от одного устойчивого состояния к другому. далее, и каждый такой стационарный является оба потенциальных начального состояния и потенциальное конечное состояние. То есть, спокойная система-это неизвестная количество компонентов, подчиняющихся простому набору правил таково, что они всегда либо в покое, либо переходя от одного спокойного состояние в другое спокойное состояние. Каждое государство может быть полностью понимается представление(ы), которое оно содержит, и набор переходы, которые он предоставляет, с переходами, ограниченными a единый набор действий должен быть понятен. Система может быть сложная диаграмма состояний, но каждый агент пользователя может видеть только одно состояние за один раз (текущее устойчивое состояние) и, таким образом, каждое государство-это простые и могут быть проанализированы независимо друг от друга. Пользователь, ото, способен создавать свои собственные переходы в любое время (например, enter URL-адрес, выберите закладку, откройте редактор и т. д.)."


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

например, когда пользователь вводит данные в экран GUI, клиент отслеживает, какие поля были введены, какие нет, какие обязательные поля отсутствуют и т. д. Это все клиентский контекст, и он не должен отправляться или отслеживаться сервером. То, что отправляется на сервер, - это полный набор полей, которые необходимо изменить в идентифицированном ресурсе (по URI), таким образом, в этом ресурсе происходит переход из одного спокойного состояния в другое.

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

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

вы могли бы трик вокруг, чтобы объединить, как это: usernameRole: пароль, но это плохая практика, и это также неэффективно, потому что, когда пользователь имеет больше роли, механизм аутентификации должен был бы проверить все роли в конкатенации, и что каждый вызов снова. Это уничтожило бы одно из самых больших технических преимуществ RBAC, а именно очень быстрый тест авторизации.

Так что проблема не может быть решена с помощью обычной проверки подлинности.

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

вот что мне нравится в ответ этот отдых не должен рассматриваться как религия. В сложных бизнес-кейсов, в сфере здравоохранения, например, управление доступом на основе ролей является совершенно общим и необходимым. И было бы жаль, если бы им не разрешили использовать отдых, потому что все дизайнеры REST-инструментов будут относиться к отдыху как к религии.

для меня не так много способов поддерживать сеанс через HTTP. Можно использовать файлы cookie с идентификатором сеанса или заголовок с идентификатором сеанса.

Если у кого то есть еще идеи буду рад услышать оно.

  1. сеансы не беспокойные
  2. вы имеете в виду, что служба REST для http-использования только или я получил что-то не так? Cookie-сессии должны использоваться только для собственных (!) http-сервисы на основе! (Это может быть проблемой для работы с cookie, например с мобильного телефона/консоли/стола/и т. д.)
  3. Если вы предоставляете услугу RESTful для разработчиков 3d-партий, никогда не используйте сеанс на основе файлов cookie, вместо этого используйте токены, чтобы избежать проблем с безопасностью.