Was ist der Unterschied zwischen serverseitigem Cookie und clientseitigem Cookie?

120

Was ist der Unterschied zwischen dem Erstellen von Cookies auf dem Server und auf dem Client? Werden diese als serverseitige Cookies und clientseitige Cookies bezeichnet? Gibt es eine Möglichkeit, Cookies zu erstellen, die nur auf dem Server oder auf dem Client gelesen werden können?

Rahul
quelle
15
Es gibt kein "serverseitiges Cookie" oder "clientseitiges Cookie". Es werden nur Cookies, Name / Wert-Paare in HTTP-Headern mit Anforderungen und Antworten gesendet.
Dan Grossman
1
Verweisen möglicherweise auf Sitzungsvariablen, die Daten auf dem Server enthalten. Normalerweise gibt es noch eine Sitzungskennung, die als clientseitiges Cookie gespeichert wird.
AndrewR
Höchstwahrscheinlich bezieht sich die Frage auf die verschiedenen Arten, wie Cookies auf der Serverseite (dh wie sie im Antwortheader "Cookie" und "Set-Cookie" codiert werden) und auf der Clientseite (dh auf die Art und Weise, wie sie codiert werden) codiert werden sind im Anforderungsheader 'Cookie' codiert (Variable $ Path und all dieser Jazz). Siehe RFC 2109
Ophir Radnitz

Antworten:

146

HTTP COOKIES

Cookies sind Schlüssel / Wert-Paare, die von Websites zum Speichern von Statusinformationen im Browser verwendet werden. Angenommen, Sie haben eine Website (example.com). Wenn der Browser eine Webseite anfordert, kann die Website Cookies senden, um Informationen im Browser zu speichern.

Beispiel für eine Browseranforderung:

GET /index.html HTTP/1.1
Host: www.example.com

Beispielantwort vom Server:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: foo=10
Set-Cookie: bar=20; Expires=Fri, 30 Sep 2011 11:48:00 GMT
... rest  of the response

Hier werden zwei Cookies foo = 10 und bar = 20 im Browser gespeichert. Der zweite läuft am 30. September aus. Bei jeder nachfolgenden Anfrage sendet der Browser die Cookies an den Server zurück.

GET /spec.html HTTP/1.1
Host: www.example.com
Cookie: foo=10; bar=20
Accept: */*

SITZUNGEN: Serverseitige Cookies

Serverseitige Cookies werden als "Sitzungen" bezeichnet. In diesem Fall speichert die Website ein einzelnes Cookie im Browser, das eine eindeutige Sitzungskennung enthält. Statusinformationen (foo = 10 und bar = 20 oben) werden auf dem Server gespeichert und die Sitzungskennung wird verwendet, um die Anforderung mit den auf dem Server gespeicherten Daten abzugleichen.

Anwendungsbeispiele

Sie können sowohl Sitzungen als auch Cookies verwenden, um Folgendes zu speichern: Authentifizierungsdaten, Benutzereinstellungen, den Inhalt eines Diagramms auf einer E-Commerce-Website usw.

Vor-und Nachteile

Nachfolgend Vor- und Nachteile der Lösungen. Dies sind die ersten, die mir in den Sinn kommen, es gibt sicherlich andere.

Cookie-Vorteile:

  • Skalierbarkeit: Alle Daten werden im Browser gespeichert, sodass jede Anforderung über einen Load Balancer an verschiedene Webserver gesendet werden kann und Sie über alle Informationen verfügen, die zum Ausfüllen der Anforderung erforderlich sind.
  • Sie können über Javascript im Browser aufgerufen werden.
  • Wenn sie sich nicht auf dem Server befinden, überleben sie den Neustart des Servers.
  • RESTful: Anforderungen hängen nicht vom Serverstatus ab

Cookie Nachteile:

Sitzungsprofis:

  • Im Allgemeinen einfacher zu bedienen, in PHP gibt es wahrscheinlich keinen großen Unterschied.
  • unbegrenzter Speicherplatz

Sitzungskompromisse:

  • schwieriger zu skalieren
  • Beim Neustart des Webservers können je nach Implementierung alle Sitzungen verloren gehen oder nicht
  • nicht ruhend
Filippo
quelle
Session-Profis : secure?
user2167582
1
Warum Sitzungen sicherer? Wenn Sie das Sitzungscookie über http senden, kann es entführt werden. Wenn die Website https verwendet, sollte die Sicherheit dieselbe sein, solange Sie sichere Cookies verwenden (verschlüsselt, signiert usw.)
filippo
1
Cookies Nachteile: Vergrößert jede Anfrage und beeinträchtigt möglicherweise die Leistung. Ich kenne die Zahlen nicht, aber da die Leute Cookieless-Domains für Dinge verwenden, gehe ich davon aus, dass dies nicht trivial ist.
Maniexx
5
Weitgehend irreführende Antwort - Sitzungen sind keine Cookies. en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session Abhängig von der Art und Weise, wie die Sitzungsverwaltung auf dem Server implementiert ist, können Sitzungsvariablen vorhanden sein. Normalerweise haben Sie ein oder mehrere Cookies, die sich auf die Sitzungsverwaltung beziehen, indem Sie die Sitzungskennung gedrückt halten. Auch REST und RESTful haben nichts mit Cookies oder Sitzungsverwaltung zu tun - REST- und RESTful-Implementierungen können Sitzungen und Cookies enthalten.
Zlatin Zlatev
2
Siehe stackoverflow.com/questions/35054840/… Ich habe nicht gesagt, dass Sitzungen normalerweise nicht mit Cookies implementiert werden, sondern dass es andere Optionen für die Sitzungsverwaltung gibt. Daher ist es falsch, Sitzungsvariablen als serverseitige Cookies zu bezeichnen. Ich bezog mich auch auf JWT, als ich im Jahr 2017 im obigen Kommentar sagte, dass "REST- und RESTful-Implementierungen Sitzungen und Cookies haben können". Obwohl einige Puristen argumentieren, dass dies nicht der richtige Weg für die Implementierung einer REST-API ist.
Zlatin Zlatev
57

Sie meinen wahrscheinlich den Unterschied zwischen nur HTTP-Cookies und deren Gegenstück?

Http Nur auf Cookies kann in clientseitigem JavaScript nicht zugegriffen (gelesen oder geschrieben) werden, nur auf der Serverseite. Wenn das Flag "Nur HTTP" nicht gesetzt ist oder das Cookie in (clientseitigem) JavaScript erstellt wird, kann das Cookie sowohl in (clientseitigem) JavaScript als auch auf der Serverseite gelesen und in dieses geschrieben werden.

nikc.org
quelle
38

Alle Cookies sind Client und Server

Es gibt keinen Unterschied. Ein reguläres Cookie kann serverseitig oder clientseitig gesetzt werden. Das "klassische" Cookie wird bei jeder Anfrage zurückgesendet. Ein vom Server gesetztes Cookie wird in einer Antwort an den Client gesendet. Der Server sendet das Cookie nur, wenn es explizit gesetzt oder geändert wurde, während der Client das Cookie bei jeder Anforderung sendet.

Aber im Grunde ist es der gleiche Keks.

Das Verhalten kann sich jedoch ändern

Ein Cookie ist im Grunde ein name=valuePaar, aber nach dem Wert kann es sich um eine Reihe von durch Semikolon getrennten Attributen handeln , die sich auf das Verhalten des Cookies auswirken, wenn es vom Client (oder Server) so implementiert wird. Diese Attribute können sich auf die Lebensdauer, den Kontext und verschiedene Sicherheitseinstellungen beziehen.

Nur HTTP (nicht nur Server)

Eines dieser Attribute kann von einem Server festgelegt werden, um anzuzeigen, dass es sich um ein reines HTTP-Cookie handelt. Dies bedeutet, dass das Cookie weiterhin hin und her gesendet wird, jedoch nicht in JavaScript verfügbar ist. Beachten Sie jedoch, dass der Cookie noch vorhanden ist! Es ist nur ein eingebauter Schutz im Browser, aber wenn jemand einen lächerlich alten Browser wie IE5 oder einen benutzerdefinierten Client verwenden würde, kann er den Cookie tatsächlich lesen!

Es scheint also "Server-Cookies" zu geben, aber tatsächlich nicht. Diese Cookies werden weiterhin an den Kunden gesendet. Auf dem Client kann nicht verhindert werden, dass ein Cookie an den Server gesendet wird.

Alternativen, um "Nur-Sein" zu erreichen

Wenn Sie einen Wert nur auf dem Server oder nur auf dem Client speichern möchten, benötigen Sie eine andere Art von Speicher, z. B. eine Datei oder Datenbank auf dem Server oder lokalen Speicher auf dem Client.

GolezTrol
quelle
Hallo, ich bin sehr neu in diesen Konzepten und habe einige Zweifel. Es tut mir leid, meine Fragen klingen vielleicht albern, aber ich werde sie trotzdem stellen. Jede Hilfe wird sehr geschätzt - Kann ein auf der Clientseite gesetztes Cookie an eine beliebige Domain gesendet werden? Ich meine, ist das nicht eine Sicherheitsbedrohung? Wie funktioniert es auch mit Nicht-Browser-Clients wie APIs usw.?
Karan Chadha
1
Hallo @KaranChadha, wenn Sie eine Frage haben, stellen Sie diese bitte als formelle Frage über die Schaltfläche "Frage stellen" oben auf der Seite. Ein Kommentarthread zu einer 7 Jahre alten Frage wird wahrscheinlich nicht die richtige Aufmerksamkeit auf sich ziehen. Das Hinzufügen eines Links zu dieser Frage und Antwort oder sogar zu dieser Antwort ist natürlich in Ordnung. Sie können dazu die Schaltfläche "Teilen" am Ende jedes Beitrags verwenden.
GolezTrol
Ist das wahr? Vom Kunden generierte Cookies scheinen nicht übertragen zu werden. Wenn dadurch document.cookie="foo=bar"von gefolgt fetch("/foobar", {credentials: 'include'} )ist kein Cookie enthält gesendet foo=bar. Ich habe diesen Code gerade direkt auf dieser Site mit DevTools und der Konsole ausprobiert.
Oligofren
Ja, es ist wahr, sagt auch die Dokumentation , aber es gibt einige Besonderheiten, die dies verursachen können, wie das fehlende Expires-Attribut.
GolezTrol
1
@MarinosAn Ja, das kann es. Aber meine Antwort war etwas kurz, wenn es um die Attribute ging, die das Verhalten des Cookies ändern, deshalb habe ich es jetzt ein wenig erweitert.
GolezTrol
4
  1. Ja, Sie können Cookies erstellen, die nur auf der Serverseite gelesen werden können. Diese werden als "Nur HTTP" -Kokies bezeichnet, wie bereits in anderen Antworten erläutert

  2. Nein, es gibt keine Möglichkeit (ich weiß), "Cookies" zu erstellen, die nur auf der Clientseite gelesen werden können. Cookies sollen die Client-Server-Kommunikation erleichtern.

  3. ABER, wenn Sie etwas wie "Nur-Client-Cookies" möchten, gibt es eine einfache Antwort: Verwenden Sie "Lokaler Speicher".

Lokaler Speicher ist syntaktisch einfacher zu verwenden als Cookies. Eine gute einfache Zusammenfassung der Cookies im Vergleich zum lokalen Speicher finden Sie unter:

https://courses.cs.washington.edu/courses/cse154/12au/lectures/slides/lecture21-client-storage.shtml#slide8

Ein Punkt: Sie können in JavaScript erstellte Cookies verwenden, um GUI-bezogene Dinge zu speichern, die Sie nur auf der Clientseite benötigen. ABER das Cookie wird für JEDE gestellte Anfrage an den Server gesendet, es wird Teil der http-Anforderungsheader, wodurch die Anfrage mehr Daten enthält und somit langsamer zu senden ist.

Wenn Ihre Seite über 50 Ressourcen wie Bilder, CSS-Dateien und Skripte verfügt, wird das Cookie (normalerweise) bei jeder Anforderung gesendet. Mehr dazu unter Sendet jede Webanforderung die Browser-Cookies?

Der lokale Speicher hat diese datenübertragungsbedingten Nachteile nicht, er sendet keine Daten. Es ist großartig.

Panu Logic
quelle