Следует ли использовать куки в RESTful API?

78

Меня особенно интересует, как пользователи выполняют авторизованные / аутентифицированные операции в веб-API.

Совместимы ли куки-файлы аутентификации с философией REST и почему?

Брэндон Линтон
источник
точная
1
@JarrodRoberson Насколько я понимаю, ответы на другом сайте не будут квалифицировать этот вопрос как дубликат здесь
Tom Squires
5
@JarrodRoberson, основываясь на часто задаваемых вопросах каждого сайта, я бы сказал, что вопрос относится к этому сайту, а не к переполнению стека. Мне интересны методология / философия дизайна и компромиссы в отношении этого аспекта архитектуры RESTful. Переполнение стека предназначено для вопросов реализации, где этот сайт больше о методологиях проектирования и компромиссах.
Брэндон Линтон
1
Я согласен с @BrandonLinton здесь, вопрос слишком широк для Stackoverflow, это вопрос архитектуры и методологии проектирования. ФП нуждается в наилучшей практике и шаблонах, предложениях и рекомендациях, а не в конкретном ответе, поэтому язык не указан. Следовательно, это принадлежит здесь.
Доубурт

Ответы:

81

Идеальный сервис ReSTful позволяет клиентам (которых может не быть в браузере) для выполнения любой необходимой задачи в одном запросе ; потому что полное состояние, необходимое для этого, удерживается клиентом, а не сервером. Так как клиент имеет полный контроль над состоянием, он может создавать состояние самостоятельно (если это законно) и общаться только с API, чтобы «выполнить».

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

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

Другим примером может быть сложный запрос, который обычно требует много установленных параметров. У неинтерактивного клиента не возникнет проблем с объединением всех этих данных в один запрос, но интерфейс на основе форм HTML может предпочесть разбить запрос на несколько страниц (что-то вроде набора страниц «мастера»), чтобы пользователи не отображались с параметрами, которые не применимы на основе предыдущих выборов. Все промежуточные страницы могут хранить значения в файлах cookie на стороне клиента, так что только самая последняя страница, на которую пользователь фактически отправляет запрос, вообще имеет какой-либо побочный эффект на сервере. API может искать необходимые атрибуты в теле запроса и возвращаться к просмотру файлов cookie, если необходимые параметры отсутствуют.

Изменить: в RE к @ Конраду комментарий ниже:

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

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

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

SingleNegationElimination
источник
4
+1, мне определенно нравится практичность использования заголовка «Авторизация», но «возврат» к файлам cookie в зависимости от того, что лучше всего подходит для клиента.
Брэндон Линтон
Я не согласен с «Для клиентов, кроме браузеров, управление файлами cookie - довольно большое неудобство…». В основном клиентские библиотеки HTTP поддерживают файлы cookie, например, HttpClientв .NET вы можете использовать файлы cookie без каких-либо проблем, и вам не нужно об этом думать. Токены для сравнения сложнее реализовать, особенно потому, что вы не можете легко аннулировать токен, не сохранив их где-либо.
Конрад
1
@ Конрад только потому, что это легко в некоторых не браузерных клиентах, не означает, что это легко во всех из них. Хорошо, если вам нужна только поддержка конкретного клиента, который вы используете, но я интерпретировал этот вопрос как об открытых API. в curlили wget, управление куки чертовски неудобно , и вы действительно должны думать о них кучу. Я ответил на ваш другой вопрос, отредактировав свой ответ.
SingleNegationElimination
Помните, что простое принятие куки открывает уязвимости CSRF. См. Также security.stackexchange.com/a/166798
Майкл Осл
14

Да и Нет - Зависит от того, как вы используете это.

Файлы cookie, если они используются для поддержания состояния клиента на клиенте, для клиента, клиента и клиента, тогда они являются спокойными.

Если вы сохраняете состояние сервера в файле cookie, тогда вы в основном просто переносите нагрузку на клиента - что не мешает работе.

Итак, каковы некоторые примеры?

Restful:

  • Детали аутентификации или "залогинен"
  • последняя просмотренная страница или место в приложении и т. д.

Не успокаивается:

  • Хранение информации о сеансе

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

кандидат наук
источник
10
Если вы храните флаг «isLoggedIn» на клиенте, вы также можете вообще не использовать аутентификацию.
tdammers
Это определенно имеет смысл - сохранение состояния приложения на стороне клиента не будет соответствовать REST, но информация о клиенте, которую он использует для представления себя, выглядит хорошо.
Брэндон Линтон
1
Я хотел бы добавить, что размещение информации об аутентификации в файлах cookie оставляет возможность атак подделки межсайтовых запросов. Есть лучшие способы, я предлагаю скопировать Amazon: docs.aws.amazon.com/AmazonS3/latest/API/…
Добес Вандермер
@tdammers, как насчет того, если флаг "isLoggedIn" находится в JWT? Тогда это должно быть безопасно, при условии, что JWT выпущен и проверен должным образом.
Аарон Дж. Спетнер
12

Можно использовать куки. Отдых позволяет им.

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

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

Жером Верстринг
источник