Следует ли использовать куки в 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, в виде дополнительных заголовков или в самом объекте запроса), полностью не зависит от самого механизма аутентификации.


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. Следовательно, для серверов нормально держать некоторые данные этого сеанса на своей стороне.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.