Sollten Cookies in einer RESTful-API verwendet werden?

77

Ich interessiere mich speziell dafür, wie Benutzer autorisierte / authentifizierte Vorgänge an einer Web-API ausführen.

Sind Authentifizierungs-Cookies mit der REST-Philosophie kompatibel und warum?

Brandon Linton
quelle
genaues Duplikat der
1
@ JarrodRoberson Mein Verständnis war, dass Antworten auf einer anderen Website die Frage hier nicht als Duplikat qualifizieren würden
Tom Squires
5
@JarrodRoberson Basierend auf den FAQs der einzelnen Sites würde ich behaupten, dass die Frage auf diese Site und nicht auf Stack Overflow gehört. Ich interessiere mich für Entwurfsmethodik / -philosophie und Kompromisse in Bezug auf diesen Aspekt der RESTful-Architektur. Der Stapelüberlauf ist für Implementierungsfragen gedacht, bei denen es auf dieser Website mehr um Entwurfsmethoden und Kompromisse geht.
Brandon Linton
1
Ich stimme @BrandonLinton hier zu, die Frage ist zu weit gefasst für Stackoverflow, es geht um Architektur und Entwurfsmethodik. Das OP möchte bewährte Verfahren und Muster, Vorschläge und Fallstricke - keine spezifische Antwort - daher wurde keine Sprache angegeben. Daher gehört es hierher.
Dooburt

Antworten:

81

Ein idealer ReSTful-Dienst ermöglicht es Clients (die möglicherweise nicht im Browser sind), alle erforderlichen Aufgaben in einer Anforderung auszuführen . weil der vollständige Status dafür vom Client und nicht vom Server gehalten wird. Da der Client die vollständige Kontrolle über den Status hat, kann er den Status selbst erstellen (sofern dies legitim ist) und nur mit der API kommunizieren, um "fertig" zu werden.

Das Erfordernis von Cookies kann dies erschweren. Für Kunden neben Browsern ist die Verwaltung von Cookies eine ziemlich große Schwierigkeit im Vergleich zu Abfrageparametern, einfachen Anforderungsheadern oder dem Anforderungshauptteil. Andererseits kann die Verwendung von Cookies im Browser vieles einfacher machen.

Daher sucht eine API möglicherweise zuerst in der AuthorizationKopfzeile nach den erforderlichen Authentifizierungsdaten, da dies wahrscheinlich der Ort ist, an dem Clients, die keine Browser-Clients sind, diese bevorzugen. Um jedoch browserbasierte Clients zu vereinfachen und zu rationalisieren, sucht sie möglicherweise auch nach einem Sitzungscookie für die serverseitige Anmeldung, aber nur, wenn der reguläre AuthorizationHeader fehlte.

Ein weiteres Beispiel könnte eine komplexe Anforderung sein, für die normalerweise viele Parameter festgelegt werden müssen. Ein nicht interaktiver Client würde keine Probleme haben, alle diese Daten in einer Anfrage zusammenzufassen. Eine HTML-basierte Oberfläche könnte es jedoch vorziehen, die Anfrage in mehrere Seiten aufzuteilen (so etwas wie eine Reihe von "Assistenten" -Seiten), damit Benutzer nicht angezeigt werden mit Optionen, die aufgrund der vorherigen Auswahl nicht zutreffen. Alle Zwischenseiten könnten die Werte in clientseitigen Cookies speichern, so dass nur die allerletzte Seite, auf der der Benutzer die Anfrage tatsächlich einreicht , einen serverseitigen Effekt hat. Die API könnte nach den erforderlichen Attributen im Anforderungshauptteil suchen und auf die Suche nach Cookies zurückgreifen, wenn die erforderlichen Parameter nicht vorhanden sind.

Edit: in RE zu @ Konrads Kommentar unten:

Tokens sind im Vergleich schwerer zu implementieren, insbesondere weil Sie das Token nicht einfach ungültig machen können, ohne sie irgendwo zu speichern.

äh ... Sie validieren die Cookies auf der Serverseite, richtig? Nur weil Sie den Browser angewiesen haben , ein Cookie nach 24 Stunden zu löschen, bedeutet dies nicht, dass dies der Fall ist. Dieser Cookie könnte von einem hochtechnischen Benutzer gespeichert und weiterverwendet werden, lange nachdem er "abgelaufen" ist.

Wenn Sie keine Sitzungsdaten auf dem Server speichern möchten, sollten Sie diese im Token (Cookie oder auf andere Weise) speichern. Ein in sich geschlossenes Authentifizierungstoken wird manchmal als Makrone bezeichnet. Wie dies zwischen Client und Server übertragen wird (ob per Cookie, als zusätzliche Header oder in der Anforderungsentität selbst), ist völlig unabhängig vom Authentifizierungsmechanismus selbst.

SingleNegationElimination
quelle
4
+1, ich mag auf jeden Fall die Praktikabilität der Verwendung des Authorization-Headers, aber das "Zurückgreifen" auf Cookies, je nachdem, was für den Kunden am besten funktioniert.
Brandon Linton
Ich bin nicht einverstanden mit "Für Kunden außer Browsern ist das Verwalten von Cookies eine ziemlich große Unannehmlichkeit ...". In den meisten HTTP-Client-Bibliotheken werden Cookies unterstützt. HttpClientIn .NET können Sie Cookies beispielsweise problemlos verwenden, und Sie müssen nicht wirklich darüber nachdenken. Tokens sind im Vergleich schwerer zu implementieren, insbesondere weil Sie das Token nicht einfach ungültig machen können, ohne sie irgendwo zu speichern.
Konrad
1
@Konrad, nur weil es in einigen Nicht-Browser-Clients einfach ist, bedeutet nicht, dass es in allen einfach ist. Es ist in Ordnung, wenn Sie nur den bestimmten Client unterstützen müssen, den Sie gerade verwenden, aber ich habe die Frage so interpretiert, dass es sich um öffentlich zugängliche APIs handelt. In curloder wgetist das Verwalten von Cookies verdammt umständlich und man muss sich wirklich viele Gedanken darüber machen. Ich habe auf Ihren anderen Punkt geantwortet, indem ich meine Antwort bearbeitet habe.
SingleNegationElimination
Beachten Sie, dass das Akzeptieren von Cookies zu CSRF-Sicherheitslücken führt. Siehe auch security.stackexchange.com/a/166798
Michael Osl
14

Ja und Nein - Hängt davon ab, wie Sie es verwenden.

Wenn Cookies verwendet werden, um den Client-Status beim Client, für den Client, für den Client und für den Client aufrechtzuerhalten, sind sie erholsam.

Wenn Sie den Serverstatus im Cookie speichern, verlagern Sie die Last im Grunde genommen nur auf den Client - was nicht unangenehm ist.

Also, was sind einige Beispiele?

Erholsam:

  • Authentifizierungsdetails oder "ist angemeldet"
  • zuletzt betrachtete Seite oder Platz in Bewerbung etc.

Nicht erholsam:

  • Sitzungsinformationen speichern

Ruhe entsteht durch Staatenlosigkeit - des Servers. Clients können den Anwendungsstatus beibehalten und ihn an den Server senden, um zu bestimmen, wo sie sich befinden, damit der Server entscheiden kann, wohin er von dort aus gehen soll. Grundsätzlich benötigen Sitzungen / Status historische Daten und sind sozusagen von früheren Anfragen abhängig. Ruhende Anwendungen sind dies im Idealfall nicht.

PhD
quelle
10
Wenn Sie ein "isLoggedIn" -Flag auf dem Client speichern, können Sie auch überhaupt keine Authentifizierung verwenden.
Tdammers
Dies ist auf jeden Fall sinnvoll. Das Speichern des Anwendungsstatus auf der Clientseite ist nicht mit REST vereinbar, aber die Clientinformationen, die zur Darstellung verwendet werden, sind in Ordnung.
Brandon Linton
1
Ich möchte hinzufügen, dass das Einfügen von Authentifizierungsinformationen in Cookies die Möglichkeit von Angriffen auf Cross-Site-Anforderungsfälschungen eröffnet. Es gibt bessere Möglichkeiten, ich schlage vor, Amazon zu kopieren: docs.aws.amazon.com/AmazonS3/latest/API/…
Vandermeer
@tdammers was ist, wenn das "isLoggedIn" -Flag in einer JWT ist? Dann sollte dies sicher sein, vorausgesetzt, das JWT wird ordnungsgemäß ausgestellt und überprüft.
Aaron J Spetner
@AaronJSpetner: Verwenden Sie JWT nicht für Sitzungen .
tdammers
12

Man kann Cookies verwenden. REST erlaubt es ihnen.

Für REST müssen Sitzungsinformationen auf dem Client gespeichert werden. Bei der Authentifizierung müssen jedoch einige Informationen aus Sicherheitsgründen auf dem Server gespeichert werden.

In einem meiner Blog- Beiträge wurde allgemein vereinbart, dass Authentifizierungsdaten in Bezug auf REST als außerhalb des Geltungsbereichs liegend betrachtet werden. Daher ist es für Server in Ordnung, einige dieser Sitzungsdaten auf ihrer Seite zu halten.

Jérôme Verstrynge
quelle