Der Organisationskontext dieses Artikels lautet wie folgt
Cookie 和 Sitzung
Das HTTP-Protokoll ist ein Typ 无状态协议
, dh jedes Mal, wenn der Server eine Clientanforderung empfängt, handelt es sich um eine brandneue Anforderung, und der Server kennt den historischen Anforderungsdatensatz des Clients nicht. Der Hauptzweck von Sitzung und Cookie besteht darin, dies auszugleichen die staatenlose Natur von HTTP.
Was ist Sitzung?
Der Client fordert den Server an, und der Server öffnet einen Block für diese Anforderung 内存空间
. Dieses Objekt ist das Sitzungsobjekt und die Speicherstruktur ConcurrentHashMap
. Die Sitzung gleicht den zustandslosen Charakter von HTTP aus. Der Server kann mithilfe der Sitzung einige Operationsdatensätze des Clients während derselben Sitzung speichern.
So stellen Sie fest, ob es sich bei der Sitzung um dieselbe Sitzung handelt
Wenn der Server die Anforderung zum ersten Mal empfängt, öffnet er einen Sitzungsbereich (erstellt ein Sitzungsobjekt), generiert gleichzeitig eine Sitzungs-ID und sendet über das Set-Cookie: JSESSIONID eine Antwort, in der die Cookie-Einstellung angefordert wird, an den Client = XXXXXXX-Befehl im Antwortheader; Nachdem der Client die Antwort erhalten hat, setzt er auf dem lokalen Client ein Cookie mit JSESSIONID = XXXXXXX. Die Ablaufzeit des Cookies ist das Ende der Browsersitzung.
Als nächstes enthält der Anforderungsheader jedes Mal, wenn der Client eine Anforderung an dieselbe Website sendet, die Cookie-Informationen (einschließlich der Sitzungs-ID). Anschließend liest der Server die Cookie-Informationen im Anforderungsheader und erhält den Wert JSESSIONID, um den Wert von abzurufen JSESSIONID. Die angeforderte Sitzungs-ID.
Nachteile der Sitzung
Der Sitzungsmechanismus weist ein Manko auf. Beispielsweise speichert Server A die Sitzung. Wenn nach dem Lastausgleich das Zugriffsvolumen von A über einen bestimmten Zeitraum stark ansteigt, wird es zum Zugriff an B weitergeleitet, während Server B keine A speichert Sitzung, die zum Ausfall der Sitzung führt.
Was sind Cookies?
Das Cookie-HTTP-Protokoll umfasst Web Cookie
und 浏览器 Cookie
, der Server sendet es an den Webbrowser eines kleinen Datenblocks. Das vom Server an den Browser gesendete Cookie wird vom Browser gespeichert und zusammen mit der nächsten Anforderung an den Server gesendet. Normalerweise wird es verwendet, um festzustellen, ob zwei Anforderungen von demselben Browser stammen, z. B. bleibt der Benutzer angemeldet.
Der HTTP-Cookie-Mechanismus ist eine Ergänzung und Verbesserung des zustandslosen HTTP-Protokolls
Cookies werden hauptsächlich für die folgenden drei Zwecke verwendet
-
会话管理
Login, Warenkorb, Spielstand oder andere Dinge, an die sich der Server erinnern sollte
-
个性化
Benutzereinstellungen, Themen oder andere Einstellungen
-
追踪
Benutzerverhalten aufzeichnen und analysieren
Cookies wurden früher für die allgemeine Speicherung von Clients verwendet. Obwohl dies legal ist, da dies die einzige Möglichkeit ist, Daten auf dem Client zu speichern, wird jetzt empfohlen, moderne Speicher-APIs zu verwenden. Cookies werden bei jeder Anfrage gesendet, sodass sie die Leistung beeinträchtigen können (insbesondere bei mobilen Datenverbindungen).
Cookie erstellen
Wenn eine HTTP-Anfrage von einem Client empfangen wird, kann der Server einen Set-Cookie
Header mit einer Antwort senden . Das Cookie wird normalerweise vom Browser gespeichert, und dann werden das Cookie und der HTTP-Header kombiniert, um eine Anfrage an den Server zu senden.
Set-Cookie und Cookie-Header
Set-Cookie
Der HTTP-Antwortheader sendet das Cookie vom Server an den Benutzeragenten. Das folgende Beispiel zeigt das Senden von Cookies
Dieser Header weist den Client an, Cookies zu speichern
Bei jeder neuen Anforderung an den Server verwendet der Browser nun den Cookie-Header, um alle zuvor gespeicherten Cookies an den Server zurückzusenden.
Es gibt zwei Arten von Cookies: Sitzungscookies und dauerhafte Cookies. Wenn das Cookie kein Ablaufdatum enthält, wird es als Sitzungscookie betrachtet. Das Sitzungscookie wird im Speicher gespeichert und niemals auf die Festplatte geschrieben. Wenn der Browser geschlossen wird, geht das Cookie danach dauerhaft verloren. Wenn das Cookie enthält 有效期
, wird es als dauerhaftes Cookie behandelt. Am angegebenen Ablaufdatum wird das Cookie von der Festplatte gelöscht.
Es gibt noch eine andere Cookie的 Secure 和 HttpOnly 标记
, die wir unten einzeln vorstellen
Sitzungscookies
Im obigen Beispiel wird ein Sitzungscookie erstellt. Das Sitzungscookie verfügt über eine Funktion. Das Cookie wird gelöscht, wenn der Client geschlossen wird, da es keine Bezeichnung Expires
oder Max-Age
Anweisung hat.
Webbrowser verwenden jedoch möglicherweise die Sitzungswiederherstellung, wodurch die meisten Sitzungscookies dauerhaft sind, als ob der Browser nie geschlossen worden wäre.
Dauerhafte Cookies
Permanente Cookies verfallen nicht, wenn der Client geschlossen wird, sondern verfallen nach 特定日期(Expires)
oder 特定时间长度(Max-Age)
außerhalb. Z.B
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
Cookie's Secure- und HttpOnly-Tags
Das sichere Cookie muss verschlüsselt über das HTTPS-Protokoll an den Server gesendet werden. Selbst wenn es sicher ist, sollten vertrauliche Informationen nicht in Cookies gespeichert werden, da sie von Natur aus unsicher sind und dieses Flag keinen wirklichen Schutz bietet.
Die Rolle von HttpOnly
-
Das Fehlen des HttpOnly-Attributs im Sitzungscookie führt dazu, dass ein Angreifer die Cookie-Informationen des Benutzers über Programme (JS-Skript, Applet usw.) abruft, wodurch die Cookie-Informationen des Benutzers verloren gehen und die Bedrohung des Angreifers durch Cross-Site-Scripting zunimmt Anschläge.
-
HttpOnly ist die Erweiterung von Microsoft zu Cookie. Dieser Wert gibt an, ob auf das Cookie über clientseitige Skripts zugegriffen werden kann.
-
Wenn das HttpOnly-Attribut im Cookie nicht auf true gesetzt ist, wird das Cookie möglicherweise gestohlen. Gestohlene Cookies können vertrauliche Informationen enthalten, die Site-Benutzer identifizieren, z. B. ASP.NET-Sitzungs-IDs oder Forms-Authentifizierungstickets. Angreifer können die gestohlenen Cookies erneut abspielen, um sich als Benutzer auszugeben oder vertrauliche Informationen zu erhalten, Cross-Site-Scripting-Angriffe durchzuführen usw.
Umfang der Cookies
Domain
Das Path
Logo definiert den Umfang des Cookies: An welche URL das Cookie gesendet werden soll.
Domain
Die Kennung gibt an, welche Hosts Cookies akzeptieren können. Wenn nicht angegeben, wird standardmäßig der aktuelle Host verwendet ( ohne Subdomains ). Wenn angegeben Domain
, enthält es im Allgemeinen den Namen der Subdomain.
Wenn diese Domain=mozilla.org
Option beispielsweise festgelegt ist , ist das Cookie auch in der Subdomain enthalten (z developer.mozilla.org
. B. ).
Wenn Sie beispielsweise festlegen Path=/docs
, stimmen die folgenden Adressen überein:
-
/docs
-
/docs/Web/
-
/docs/Web/HTTP
Vergleich von JSON-Web-Token- und Sitzungscookies
JSON Web Token ,简称 JWT
, Es und beide Session
können Benutzerauthentifizierung für die Website bereitstellen, aber sie sind nicht dasselbe.
Das Folgende ist eine Studie über den Unterschied zwischen JWT und Sitzung
Ähnlichkeiten zwischen JWT und Sitzungscookies
Bevor Sie über JWT- und Sitzungscookies sprechen, müssen Sie deren Ähnlichkeiten verstehen.
Sie können zur Authentifizierung von Benutzern und zur Authentifizierung von Benutzern verwendet werden, wenn sie auf eine andere Seite klicken und sich bei einer Website oder Anwendung anmelden.
Wenn Sie diese beiden nicht haben, müssen Sie sich möglicherweise bei jedem Seitenwechsel anmelden. Weil HTTP ein zustandsloses Protokoll ist. Dies bedeutet, dass sich der Server 内存中
nicht an Ihre vorherigen Aktionen erinnert , wenn Sie eine Webseite besuchen und dann auf eine andere Seite auf derselben Site klicken .
Wenn Sie sich anmelden und eine andere Seite besuchen, auf die Sie Zugriff haben, melden Sie sich erneut an, da HTTP die gerade angemeldeten Informationen nicht aufzeichnet.
JWT- und Sitzungscookies werden verwendet, um zwischen verschiedenen Seiten zu wechseln und Benutzeranmeldeinformationen zu speichern .
Mit anderen Worten, diese beiden Technologien werden verwendet, um Ihren Anmeldestatus zu speichern und Ihnen das Durchsuchen jeder kennwortgeschützten Website zu ermöglichen. Dieses Problem wird gelöst, indem Benutzerdaten jedes Mal authentifiziert werden, wenn eine neue Anforderung gestellt wird.
Was sind die Ähnlichkeiten zwischen JWT und Sitzungscookies? Das heißt, sie können Sie dabei unterstützen, einen Mechanismus Ihres Anmeldestatus zwischen dem Senden verschiedener Anforderungen aufzuzeichnen und zu überprüfen.
Was sind Sitzungscookies?
Sitzungscookies werden auch als 会话 Cookies
Sitzungscookies bezeichnet . In Sitzungscookies wird der Anmeldestatus des Benutzers in 服务器
der 内存
Mitte gespeichert . Wenn sich der Benutzer anmeldet, wird die Sitzung sicher vom Server erstellt.
Bei jeder Anforderung liest der Server die Sitzungs-ID aus dem Sitzungscookie. Wenn die Daten auf dem Server mit der gelesenen Sitzungs-ID übereinstimmen, sendet der Server eine Antwort an den Browser, damit sich der Benutzer anmelden kann.
Was ist Json Web Tokens?
Die Abkürzung für Json Web Token lautet JWT und kann normalerweise aufgerufen werden Json 令牌
. Es ist als eine Form der Informationsübertragung RFC 7519
definiert . Die im JWT gespeicherten Informationen werden weitergegeben , sodass sie vertrauenswürdig und verständlich sind. Sie können den HMAC-Algorithmus oder den öffentlichen / privaten RSA / ECDSA-Schlüssel verwenden, um die JWT zu signieren.安全的
Json 对象
数字签名
Die Verwendung von JWT wird hauptsächlich für die folgenden zwei Punkte verwendet
-
认证(Authorization)
: Dies ist der häufigste Fall bei der Verwendung von JWT. Sobald sich der Benutzer anmeldet, enthält jede nachfolgende Anforderung die JWT, sodass der Benutzer auf die vom Token zugelassenen Routen, Dienste und Ressourcen zugreifen kann.单点登录
Es ist eine Funktion von JWT, die heute aufgrund ihres geringen Overheads weit verbreitet ist. -
信息交换(Information Exchange)
: JWT ist eine Möglichkeit, Informationen sicher zu übertragen. Das JWT wird mit dem öffentlichen / privaten Schlüssel signiert und authentifiziert. Da die Signatur verwendethead
undpayload
berechnet wird, können Sie außerdem überprüfen, ob der Inhalt manipuliert wurde.
JWT-Format
Im Folgenden werden wir die Zusammensetzung und das Format von JWT diskutieren
JWT besteht hauptsächlich aus drei Teilen, wobei jeder Teil .
in drei Teile unterteilt ist
-
Header
-
Payload
-
Signature
Daher wäre eine sehr einfache JWT-Zusammensetzung wie folgt
Dann diskutieren wir die verschiedenen Teile getrennt.
Header
Header ist der Header von JWT, er besteht normalerweise aus zwei Teilen: 令牌的类型(即 JWT)
und wird verwendet 签名算法
, z. B. HMAC SHA256 oder RSA.
Z.B
{
"alg": "HS256",
"typ": "JWT"
}
Nach Angabe des Typs und des Signaturalgorithmus wird der Json-Block Base64Url
codiert, um den ersten Teil des JWT zu bilden.
Nutzlast
Der zweite Teil des Tokens besteht darin, Payload
dass die Payload eine Anweisung enthält. Eine Anweisung ist eine Anweisung über eine Entität (normalerweise einen Benutzer) und andere Daten. Es gibt drei Arten von Erklärungen: registrierte, öffentliche und private Erklärungen.
-
registered 声明
: Enthält eine Reihe empfohlener vordefinierter Erklärungen, hauptsächlich einschließlich
-
public 声明
: Öffentliche Erklärung: Sie können alle Informationen hinzufügen, im Allgemeinen benutzerbezogene Informationen oder andere erforderliche Informationen, die vom Unternehmen benötigt werden. Es wird jedoch nicht empfohlen, vertrauliche Informationen hinzuzufügen, da dieser Teil auf dem Client entschlüsselt werden kann. -
private 声明
: Benutzerdefinierte Erklärungen, die darauf abzielen, Informationen zwischen Parteien auszutauschen, die sich bereit erklären, diese zu verwenden, sind weder Registrierungserklärungen noch öffentliche Erklärungen.
Z.B
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Dann wird der Payload-Json-Block Base64Url
codiert, um den zweiten Teil des JWT zu bilden.
Unterschrift
Der dritte Teil von JWT ist eine Visa-Information, diese Visa-Information besteht aus drei Teilen
-
Header (nach base64)
-
Nutzlast (nach base64)
-
Geheimnis
Zum Signieren benötigen wir beispielsweise den HMAC SHA256-Algorithmus zum Signieren
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
Die Signatur wird verwendet, um zu überprüfen, ob sich die Nachricht während des Vorgangs nicht geändert hat. Bei Token, die mit einem privaten Schlüssel signiert sind, kann auch die wahre Identität des Absenders der JWT überprüft werden
Zusammenstückeln
Jetzt fügen wir die oben genannten drei durch Punkte getrennten Base64-URL-Zeichenfolgenteile zusammen. Diese Zeichenfolge kann diese Zeichenfolgen in HTML- und HTTP-Umgebungen problemlos übergeben.
Das Folgende ist ein vollständiges JWT-Beispiel, das den Header und die Nutzdaten codiert und dann die Signatur zum Signieren verwendet
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
Wenn Sie selbst testen und schreiben möchten, können Sie die offizielle JWT-Website https://jwt.io/#debugger-io besuchen
Der Unterschied zwischen JWT- und Sitzungscookies
Sowohl JWT- als auch Sitzungscookies bieten eine sichere Benutzerauthentifizierung, unterscheiden sich jedoch in den folgenden Punkten
Kryptografische Signatur
JWT hat eine kryptografische Signatur, Sitzungscookies jedoch nicht.
JSON ist staatenlos
JWT Ja 无状态
, da die Deklaration im Serverspeicher 客户端
und nicht im Serverspeicher gespeichert ist.
Die Authentifizierung kann 本地
durchgeführt werden, anstatt den Server anzufordern, muss eine Datenbank oder dergleichen in Position sein. Dies bedeutet, dass der Benutzer mehrmals authentifiziert werden kann, ohne mit der Datenbank der Site oder Anwendung kommunizieren zu müssen und ohne dabei viele Ressourcen zu verbrauchen.
Skalierbarkeit
Sitzungscookies werden im Serverspeicher gespeichert. Wenn die Website oder Anwendung groß ist, verbraucht sie viele Ressourcen. Da JWTs zustandslos sind, können sie in vielen Fällen Serverressourcen sparen. Daher ist JWT stärker als Sitzungscookies 可扩展性
.
JWT unterstützt die domänenübergreifende Authentifizierung
Sitzungscookies können nur darin verwendet werden 单个节点的域
oder sind darin 子域
gültig. Wenn sie versuchen, über den dritten Knoten zuzugreifen, werden sie gesperrt. Dies ist ein Problem, wenn Ihre Website eine sichere Verbindung mit anderen Websites herstellen soll.
Die Verwendung von JWT kann dieses Problem lösen. Die Verwendung von JWT kann die 多个节点
Benutzerauthentifizierung bestehen, was wir oft sagen 跨域认证
.
Auswahl von JWT- und Sitzungscookies
Wir haben den Unterschied zwischen JWT und Cookies oben besprochen. Ich glaube, Sie werden grob gesagt auch ein tieferes Verständnis für die Auswahl haben
Für kleine und mittlere Websites, die sich nur anmelden und auf einige in der Site-Datenbank gespeicherte Informationen zugreifen müssen, sind Sitzungscookies normalerweise ausreichend.
Wenn Sie Websites, Anwendungen oder Standorte in der Nähe auf Unternehmensebene haben und eine große Anzahl von Anforderungen bearbeiten müssen, insbesondere von Drittanbietern oder vielen Drittanbietern (einschließlich APIs in verschiedenen Domänen), ist JWT offensichtlich besser geeignet.
Nachtrag
Ich habe diese Frage vor zwei Tagen während des Interviews gestellt, also habe ich einen Artikel geschrieben, um sie zusammenzufassen, und ich habe auch eine Interviewfrage gestellt, in der Cookies deaktiviert wurden, wie man Session verwendet . Ich habe es auf Baidu überprüft und festgestellt, dass dies eine PHP-Interviewfrage ist, em .....
Nach dem Deaktivieren von Cookies möchte ich jedoch immer noch verstehen, wie die Sitzung verwendet wird
-
Wenn Cookies deaktiviert sind, sendet der Server die Sitzungs-ID weiterhin in Form eines Cookies an den Browser, der Browser speichert dieses Cookie jedoch nicht mehr (dh die Sitzungs-ID).
-
Wenn Sie die Sitzung weiterhin verwenden möchten, müssen Sie
URL 重写
die Methode verwenden, um dies zu erreichen. Weitere Informationen finden Sie unter https://www.cnblogs.com/Renyi-Fan/p/11012086.html
Verwandte Referenzen:
https://www.cnblogs.com/Renyi-Fan/p/11012086.html
https://blog.csdn.net/qq_28296925/article/details/80921585
https://www.cnblogs.com/-ROCKS/p/6108556.html
https://www.allaboutcookies.org/manage-cookies/
https://www.jianshu.com/p/4a124a10fcaf
https://tools.ietf.org/html/rfc7519
https://jwt.io/introduction/
https://wp-rocket.me/blog/browser-cache-vs-cookies-difference/
https://wp-rocket.me/blog/difference-json-web-tokens-vs-session-cookies/