Придерживаться моего оружия REST или сломать безгражданство? Нужен совет - PullRequest
5 голосов
/ 25 июня 2010

Я написал сервлет RESTful, и разработчик пользовательского интерфейса хочет сохранить состояние входа в систему на сервере.

Он сделал это странное утверждение: «Я не сталкивался с производственной реализацией REST, которая является чистым REST. У тех, кого я видел, все серверы поддерживали сеанс».

Мне трудно это принять. Во-первых, есть много технических простых HTTP-страниц, все чисто RESTful. Во-вторых, да, есть реализации без RESTful, помеченные RESTful, точно так же, как есть медь с пометкой «золото». В-третьих, то, что все остальные прыгают с моста, не означает, что я должен.

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

Таким образом, разработчик хочет использовать cookie или сеанс JSP. Эбби, правда ли, что в конце каждая реализация REST поддерживает состояние приложения на сервере? Или я могу решить эту проблему и сохранить чистоту RESTful?

Ответы [ 4 ]

3 голосов
/ 25 июня 2010

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

Что действительно важно, так это то, насколько он отделен от приложения. Например, HTTP Digest сохраняет некоторую форму состояния на сервере, но это явно абстрагируется как часть обычного согласования заголовка WWW-Authenticate и Authorization. Поскольку большинство браузеров поддерживают его изначально, это ортогонально приложению и, как таковое, не нарушает принцип безгражданства REST.

В настоящее время, поскольку у пользователей есть некоторые эстетические ожидания, что базовая / дайджест-проверка подлинности HTTP не встречается в браузерах, веб-сайты, как правило, используют проверку подлинности на основе форм и впоследствии файлы cookie. Чтобы быть справедливым, это больше, чем просто внешний вид, это также вопрос удобства использования (например, информация «забыли свой пароль», хотя это может быть частью ответа 401) и безопасности. Браузеры не позволяют вам легко выйти из базовой / дайджест-аутентификации / проверки подлинности сертификатов, если только это не сделано полностью в Ajax на одной странице, как вы упомянули, и это может помочь CSRF.

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

Вы можете прочитать некоторые комментарии Роя Филдинга на тему :

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

РЕДАКТИРОВАТЬ (дополнительные комментарии по вопросам безопасности):

Я понимаю, что комментарии Роя Филдинга в цитируемом мною сообщении направлены против файлов cookie по соображениям безопасности. Он, конечно, прав. Однако, по моему мнению, защищать от CSRF с помощью Basic / Digest / Cert (который на самом деле не был в радаре в 2003 году, дата того сообщения) труднее, чем от кражи cookie. Это зависит от реализации, конечно. Идеального решения не существует, но если вы используете куки-файлы, используйте безопасные куки-файлы через HTTPS.

2 голосов
/ 25 июня 2010

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

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

0 голосов
/ 25 июня 2010

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

0 голосов
/ 25 июня 2010
  • По умолчанию браузеры больше не запрашивают учетные данные при обновлении страницы. Возможно, вы захотите разобраться в этом, потому что, если вы исправите это, ваша проблема будет решена.
  • Вы можете поддерживать службу REST по большей части, за исключением того, что пользователь может аутентифицироваться либо с помощью HTTP, либо с помощью cookie. То есть служба также работает, если у вас нет cookie.

С уважением,

Abby.

...