Dieser Artikel vermittelt Ihnen relevantes Wissen über JWT. Er stellt hauptsächlich vor, was JWT ist. Was ist das Prinzip und die Verwendung von JWT? Für diejenigen, die interessiert sind, werfen wir einen Blick unten. Ich hoffe, es wird für alle hilfreich sein.
JSON Web Token
(abgekürzt JWT) ist derzeit die beliebteste domänenübergreifende Authentifizierungslösung. In diesem Artikel werden deren Prinzipien und Verwendung vorgestellt.
1. Probleme mit der domänenübergreifenden Authentifizierung
Internetdienste sind untrennbar mit der Benutzerauthentifizierung verbunden. Der allgemeine Prozess ist wie folgt.
1. Der Benutzer sendet den Benutzernamen und das Passwort an den Server.
2. Nach bestandener Serververifizierung werden relevante Daten, wie Benutzerrolle, Anmeldezeit usw., in der aktuellen Sitzung gespeichert.
3. Der Server gibt eine session_id an den Benutzer zurück und schreibt sie in das Cookie des Benutzers.
4. Bei jeder weiteren Anfrage des Benutzers wird die session_id über Cookie an den Server zurückgegeben.
5. Der Server empfängt die session_id, findet die zuvor gespeicherten Daten und erfährt so die Identität des Benutzers.
Das Problem bei diesem Modell ist, dass es nicht gut skaliert werden kann. Bei einem einzelnen Computer gibt es natürlich kein Problem. Wenn es sich um einen Servercluster oder eine domänenübergreifende serviceorientierte Architektur handelt, ist die gemeinsame Nutzung von Sitzungsdaten erforderlich, und jeder Server kann die Sitzung lesen.
Zum Beispiel sind Website A und Website B verwandte Dienste desselben Unternehmens. Nun ist es erforderlich, dass sich der Benutzer automatisch anmeldet, wenn er eine andere Website besucht, solange er sich auf einer der Websites anmeldet.
Eine Lösung besteht darin, Sitzungsdaten beizubehalten und sie in die Datenbank oder eine andere Persistenzschicht zu schreiben. Nach Erhalt der Anfrage fordern verschiedene Dienste Daten von der Persistenzschicht an. Der Vorteil dieser Lösung besteht darin, dass die Struktur klar ist, der Nachteil besteht jedoch darin, dass der Arbeitsaufwand relativ groß ist. Darüber hinaus handelt es sich bei einem Ausfall der Persistenzschicht um einen Single Point of Failure.
Eine andere Lösung besteht darin, dass der Server die Sitzungsdaten einfach nicht speichert. Alle Daten werden auf dem Client gespeichert und bei jeder Anfrage an den Server zurückgesendet. JWT ist ein Vertreter dieser Lösung.
2. Das Prinzip von JWT
Das Prinzip von JWT besteht darin, dass der Server nach der Authentifizierung ein JSON-Objekt generiert und es an den Benutzer zurücksendet, wie unten gezeigt.
{ "姓名": "张三", "角色": "管理员", "到期时间": "2018年7月1日0点0分" }
Wenn der Benutzer in Zukunft mit dem Server kommuniziert, wird dieses JSON-Objekt zurückgesendet. Der Server verlässt sich ausschließlich auf dieses Objekt, um den Benutzer zu identifizieren. Um zu verhindern, dass Benutzer Daten manipulieren, fügt der Server beim Generieren dieses Objekts eine Signatur hinzu (Einzelheiten siehe unten).
Der Server speichert keine Sitzungsdaten. Mit anderen Worten: Der Server wird zustandslos, was die Erweiterung erleichtert.
3. Die Datenstruktur von JWT
Das tatsächliche JWT sieht wahrscheinlich wie folgt aus.
Es ist eine sehr lange Zeichenfolge, die durch einen Punkt (.) in der Mitte in drei Teile getrennt ist. Beachten Sie, dass es innerhalb des JWT keinen Zeilenumbruch gibt. Es wird nur zur besseren Darstellung in mehrere Zeilen geschrieben.
Die drei Teile von JWT sind wie folgt.
Header (Kopf)
Payload (Nutzlast)
Signatur (Signatur)
Schreiben Sie es in einer Zeile, wie unten gezeigt.
Header.Payload.Signature
Im Folgenden werden diese drei Teile der Reihe nach vorgestellt.
3.1 Header
Der Header-Teil ist ein JSON-Objekt, das die Metadaten des JWT beschreibt, normalerweise wie folgt.
{ "alg": "HS256", "typ": "JWT" }
Im obigen Code stellt das Alg-Attribut den Signaturalgorithmus (Algorithmus) dar, und der Standardwert ist HMAC SHA256 (geschrieben als HS256); das Typ-Attribut stellt den Typ des Tokens (Token) dar, und das JWT-Token ist einheitlich geschrieben als JWT.
Zuletzt konvertieren Sie das obige JSON-Objekt mit dem Base64URL-Algorithmus in einen String (Einzelheiten siehe unten).
3.2 Payload
Der Payload-Teil ist ebenfalls ein JSON-Objekt, das zum Speichern der tatsächlichen Daten verwendet wird, die übertragen werden müssen. JWT gibt 7 offizielle Felder zur Auswahl an.
ISS (Emittent): Emittent ): Gültigkeitszeitpunkt
iat (Ausgestellt am): Ausstellungszeitpunkt
jti (JWT-ID): Nummer
Zusätzlich zu offiziellen Feldern können Sie in diesem Abschnitt auch private Felder definieren Beispiel .
{ "sub": "1234567890", "name": "John Doe", "admin": true }
Dieses JSON-Objekt muss ebenfalls mithilfe des Base64URL-Algorithmus in einen String umgewandelt werden.
Zuerst müssen Sie ein Geheimnis angeben. Dieser Schlüssel ist nur dem Server bekannt und kann nicht an Benutzer weitergegeben werden. Verwenden Sie dann den im Header angegebenen Signaturalgorithmus (der Standardwert ist HMAC SHA256), um eine Signatur gemäß der folgenden Formel zu generieren.
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
3.4 Base64URL
前面提到,Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似,但有一些小的不同。
JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。这就是 Base64URL 算法。
四、JWT 的使用方式
客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。
Authorization: Bearer <token>
另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。
五、JWT 的几个特点
(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。
(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
推荐学习:《JavaScript视频教程》
Das obige ist der detaillierte Inhalt vonEingehende Analyse der Prinzipien und Verwendung von JWT (JSON Web Token). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!