Categories
Sicherheit

Sind Javascript Web Token (JWT) sinnvoll?

Um es kurz zu machen:
JA!!

gerade bei API anwendungen lässt sich damit problemlos die Last auf mehrer Systeme verteilen.

SessionID-Cookies, wie sie bei PHP eingesetzt werden, haben den Nachteil, dassbei jeder Abfrage ein Speicherzugriff auf die Festplatte (oder SSD) erfolgt. Dabei wird die SessionID-file geöffnet, und nach einem gültigen Sessionkey gesucht. Dieskann zu folge haben, dass viele Abfragen pro minute die I/O Kanäle des speichers belasten.

Datenbankbasierte Authentifizierung hat ein ähnliches problem. Für jede Abfrage muss erst der Datenbankserver kontaktiert werden, und die Datenbank nach einen gültigen User durchsuchen, ehe mit der eigentlichen Arbeit begonnen werden kann.
Dies kann, jeh nach Leistungsfähigkeit der Netzwerkverbindung und des Datenbankservers zu Verzögerungen führen. Gerade Datenbanken mit extrem vielen Nutzkonten zeigen schächen bei dieser art der Authentifizierung.

JWTs haben den Vorteil, dass sie nur entschlüsselt und überprüft werden müssen. Sind diese JWTs gültig ist auch ihr Inhalt, wie zB die User-ID vertrauenswürdig. Solange das Eigene Passwort, mit welchen die JWTs erstellt wurden sicher ist und nicht gestohlen wird, sind auch alle JWTs sicher. Sollte dieses Passwort abhanden kommen, kann man es einfach ersetzen, und automatisch werden alle JWTs ungültig, da sie keiner Prüfung mehr stand halten

Categories
Sicherheit

JWT in PHP erstellen

Hier zeigen wir, wie man einen Javascript Web Token (JWT) in PHP erstellt. Weiter unten wird erklärt, wie der Token aufgebaut ist und funktioniert.

Warum ein JWT Sinnvoll ist um die Leistung des Webservers zu steigern, erkläre ich in diesem Artikel.

JWT ist ein eine gute Möglichkeit, Daten permanent und sicher im Browser zu speichern. Gute Erfahrungen habe ich mit einer PHP-Lib namens REALLYSIMPLEJWT von https://github.com/RobDWaller/ReallySimpleJWT gemacht.

Installation mit COMPOSER:

composer require rbdwllr/reallysimplejwtin

oder in composer.json folgenden Eintrag in die requirements setzen

"require": {
    "rbdwllr/reallylsimplejwt": "^2.0"
}

JWT Token in PHP erstellen/generieren

in deinem Projekt kannst du einfach einen JWT erstellen mit:

<?php
use ReallySimpleJWT\Token;

require 'vendor/autoload.php';

$userId = 123;					// Bsp UID
$secret = 'MyShopseu123!';		// Geheimer Schlüssel
$expiration = time() + 3600;	// Ablaufdatum
$issuer = 'localhost';			// Benutzerprüfung

$token = Token::create($userId, $secret, $expiration, $issuer);

WICHTIG: $secret MUSS! mindestens12 Zeichen lang sein, mit großen und kleinenZeichen, so wie Zahlen und mindestens eines dieser Sonderzeichen beinhalten  *&!@%^#$

//Schlechtes Secret
myshops123

//Gutes Secret
MyShopseu123!

$token sieht dann in etwa so aus:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 .eyJ1c2VyX2lkIjoxMjMsImV4cCI6MTU3NDUzMDYxOSwiaXNzIjoibG9jYWxob3N0IiwiaWF0IjoxNTc0NTI3MDE5fQ .BWRUr55Uz8YImUdBxYBkoPOe8lb_RHQL6lKTANyDzCg

Entwickler können die Methode customPayload() verwenden um einen benutzerdefinierteren Token zu erstellen. Dies ermöglicht die Erstellung eines Token basierend auf einem Array von Schlüsselwertpaaren.

<?php
use ReallySimpleJWT\Token;

require 'vendor/autoload.php';

$payload = [
    'iat' => time(),
    'uid' => 123,
    'exp' => time() + 120,
    'iss' => 'localhost.local'
];

$secret = 'TestSecReT&ofMyShopsXYZ';

$token = Token::customPayload($payload, $secret);

JWT Token in PHP prüfen/validieren

use ReallySimpleJWT\Token;

require 'vendor/autoload.php';

$token = 'aaa.bbb.ccc';
$secret = 'MyShopseu123!';

$valid = Token::validate($token, $secret); //TRUE oder FALSE
$header = 	Token::getHeader($token, $secret);
$payloead = Token::getPayload($token, $secret);

Wie ein JWT Token aufgebaut ist

Ein JWT (JSON WebToken) ist in drei Teile untergliedert, und durch Punkte getrent und mit Base64 verschlüsselt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 . 							<------ HEADER
eyJ1c2VyX2lkIjoxMjMsImV4cCI6MTU3NDUzMiaWF0IjoxNTc0NTI3MDE5fQ .  <--- 	PAYLOAD
BWRUr55Uz8YImUdBxYBkoPOe8lb_RHQL6lKTANyDzCg						<------ SIGNATUR