Чи слід використовувати файли cookie в API RESTful?


77

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

Чи сумісні файли cookie аутентифікації з філософією REST, і чому?




1
@JarrodRoberson Моє розуміння полягало в тому, що відповіді на іншому веб-сайті не можуть кваліфікувати це питання як дублікат
Tom Squires

5
@JarrodRoberson, грунтуючись на поширених питаннях кожного сайту, я можу стверджувати, що питання належить на цьому веб-сайті, а не переповнення стека. Мене цікавлять методологія / філософія дизайну та компроміси щодо цього аспекту архітектури RESTful. Переповнення стека призначене для питань впровадження, де цей сайт детальніше про методології дизайну та компроміси.
Брендон Лінтон

1
Я погоджуюся з @BrandonLinton тут, питання занадто широке для Stackoverflow, воно стосується архітектури та методології дизайну. ОП хоче найкращої практики та зразків, пропозицій та проблем - не конкретної відповіді, - отже, мова не вказана. Отже, вона тут належить.
dooburt

Відповіді:


81

Ідеальний сервіс ReSTful дозволяє клієнтам (які можуть бути не в браузері) виконувати будь-які необхідні завдання за один запит ; тому що повний стан, необхідний для цього, веде клієнт, а не сервер. Оскільки клієнт має повний контроль над державою, він може створити стан самостійно (якщо це законно), і лише поговорити з API, щоб "зробити це".

Потрібні файли cookie можуть ускладнити це. Для клієнтів, окрім браузерів, керування файлами cookie - це досить велика незручність у порівнянні з параметрами запитів, простими заголовками запитів або тілом запиту. З іншого боку, у веб-переглядачі використання файлів cookie може зробити багато речей набагато простішими.

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

Іншим прикладом може бути складний запит, який зазвичай вимагає безлічі параметрів. Неінтерактивний клієнт не матиме жодних проблем збивати всі ці дані в один запит, але інтерфейс на основі форми HTML може вважати за краще розбити запит на кілька сторінок (щось на зразок набору сторінок "майстра"), щоб користувачі не були представлені з опціями, які не застосовуються на основі попередніх виборів. Всі проміжні сторінки можуть зберігати значення у файлах cookie, так що лише сама остання сторінка, де користувач фактично подає запит, взагалі має будь-який побічний ефект сервера. API може шукати необхідні атрибути в тілі запиту та повертатися до перегляду файлів cookie, якщо потрібних параметрів не було.

Редагувати: у коментарі RE до @ Konrad нижче:

Маркери порівняно важче реалізувати, особливо тому, що ви не можете легко визнати недійсним маркер, не зберігаючи їх десь.

е ... Ви перевіряєте файли cookie на стороні сервера, правда? Тільки тому, що ви сказали браузеру відмовитись від файлу cookie через 24 години, це не означає, що це станеться. Цей файл cookie може бути збережений високотехнічним користувачем та повторно використаний довгий час, коли він "закінчився".

Якщо ви не хочете зберігати дані сеансу на стороні сервера, слід зберегти їх у маркері (cookie чи іншим способом). Автономний жетон аутентифікації іноді називають Макаруном. Як це передається між клієнтом і сервером (будь то cookie, як додаткові заголовки, або в самій суті запиту), абсолютно не залежить від самого механізму аутентифікації.


4
+1, мені точно подобається практичність використання заголовка авторизації, але "повернення" до файлів cookie залежно від того, що найкраще працює для клієнта.
Брендон Лінтон

Я не згоден з "Для клієнтів, окрім браузерів, керування файлами cookie - це досить велика незручність ...". В основному бібліотеки клієнтів HTTP підтримують файли cookie, наприклад, HttpClientв .NET ви можете використовувати файли cookie без будь-яких проблем, і вам не потрібно думати про це. Маркери порівняно важче реалізувати, особливо тому, що ви не можете легко визнати недійсним маркер, не зберігаючи їх десь.
Конрад

1
@Konrad тільки тому, що це легко у деяких клієнтів, які не переглядають браузер, не означає, що це легко у всіх. Це добре, якщо вам потрібно лише підтримати конкретного клієнта, яким ви користуєтесь, але я інтерпретував питання, що стосується API, що стикається з громадськістю. в curlабо wgetкерування файлами cookie є незручним, і вам справді доведеться думати про них купу. Я відповів на ваш інший пункт, відредагувавши мою відповідь.
SingleNegationElimination

Слідкуйте за тим, щоб просто прийняття файлів cookie відкривало вразливості в CSRF. Дивіться також security.stackexchange.com/a/166798
Michael Osl

14

Так і Ні - Залежить від того, як ви його використовуєте.

Файли cookie, якщо вони використовуються для підтримки стану клієнта у клієнта, для клієнта, клієнта та клієнта, вони знаходяться у спокої.

Якщо ви зберігаєте стан сервера у файлі cookie, ви, як правило, просто перекладаєте навантаження на клієнта - що не викликає спокою.

То які приклади є?

Відпочивали:

  • Інформація про автентифікацію або "зареєстрована" в деяких випадках
  • остання переглянута сторінка або місце в додатку тощо

Не відпочиває:

  • Зберігання інформації про сеанс

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


10
Якщо ви зберігаєте прапор "isLoggedIn" на клієнті, ви також можете взагалі не використовувати аутентифікацію.
tdammers

Це, безумовно, має сенс - зберігання стану програми на стороні клієнта не відповідало б REST, але інформація клієнта, яку він використовує для представлення, здається чудовою.
Брендон Лінтон

1
Я хотів би додати, що розміщення інформації про автентифікацію у файлах cookie залишає відкритою можливість атак на підробку між сайтом. Є ефективніші способи, я пропоную копіювання Amazon: docs.aws.amazon.com/AmazonS3/latest/API / ...
DOBES Вандермеер

@tdammers, а як бути, якщо прапор "isLoggedIn" знаходиться в JWT? Тоді це повинно бути захищено, якщо JWT видано та перевірено належним чином.
Aaron J Spetner


12

Можна використовувати файли cookie. REST дозволяє їм.

REST вимагає, щоб будь-яка інформація про сеанс зберігалася на стороні клієнта, але коли мова заходить про автентифікацію, певна інформація повинна залишатися на стороні сервера з міркувань безпеки.

З одного з моїх публікацій в блозі є загальна згода, що дані аутентифікації вважаються поза межами REST. Отже, нормально для серверів тримати деякі дані цього сеансу на своїй стороні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.