Heim > Backend-Entwicklung > Python-Tutorial > Authentifizierung und Autorisierung – der richtige Weg!

Authentifizierung und Autorisierung – der richtige Weg!

Mary-Kate Olsen
Freigeben: 2024-10-09 06:14:29
Original
814 Leute haben es durchsucht

Authentication and Authorization - the correct way!

Stellen Sie sich vor, Sie erstellen eine Web- oder Mobilanwendung, die Benutzer verifizieren muss – vielleicht für eine Social-Media-Plattform, eine E-Commerce-Site oder auch nur ein einfaches Dashboard. Irgendwann werden Sie sich fragen: „Wie halte ich die Anmeldung meiner Benutzer sicher?“

Hier kommt die Authentifizierung ins Spiel. Da jedoch so viele verschiedene Methoden zur Auswahl stehen – wie Sitzungsverwaltung, Authentifizierungstoken und das immer beliebter werdende JWT (JSON Web Token) – kann es schwierig sein, herauszufinden, welche für Ihre App die richtige ist. Wie entscheiden Sie sich?

Wenn Sie schon viel über JWT gehört haben und sich fragen, ob es den Hype wert ist, sind Sie hier richtig. In diesem Blogbeitrag werden wir erläutern, was JWT ist, wie es funktioniert und wie es im Vergleich zu anderen gängigen Authentifizierungsmethoden in Django abschneidet. Am Ende werden Sie ein klares Verständnis davon haben, wann Sie JWT verwenden sollten und wie es im Vergleich zu anderen Optionen wie sitzungsbasierter Authentifizierung und Authentifizierungstokens abschneidet. Lasst uns eintauchen!

Was ist JWT (JSON Web Token)?

JWT (JSON Web Token) ist ein kompaktes, URL-sicheres Token-Format, das zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird. Es wird häufig in Authentifizierungsprozessen verwendet, bei denen ein Client Zugriff auf Ressourcen anfordert, beispielsweise in Web- oder Mobilanwendungen.

Ein JWT besteht aus drei Teilen:

Header: Enthält Metadaten zum Token, wie z. B. den Typ (JWT) und den Signaturalgorithmus (z. B. HS256).

Payload: Enthält benutzerspezifische Ansprüche, wie die Benutzer-ID, den Benutzernamen oder die Rolle.

Signatur: Stellt sicher, dass das Token nicht manipuliert wurde, indem der Header und die Nutzlast mit einem geheimen Schlüssel signiert werden.

Ein Beispiel-JWT könnte so aussehen:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImpvaG4iLCJleHAiOjE2MjEyMzY5MjZ9.GG7h8oV2C7Mcp93JK...
Nach dem Login kopieren

JWT wird häufig bei der zustandslosen Authentifizierung verwendet, was bedeutet, dass der Server keine Sitzungsdaten speichert. Stattdessen sind alle notwendigen Informationen (Ansprüche) im Token selbst eingebettet.

So funktioniert JWT: Ein Schritt-für-Schritt-Prozess

Lassen Sie uns die Funktionsweise der JWT-Authentifizierung anhand eines einfachen Szenarios erläutern:

1. Benutzer meldet sich an
Ein Benutzer übermittelt seine E-Mail-Adresse und sein Passwort über ein Anmeldeformular. Der Server validiert die Anmeldeinformationen, und wenn sie korrekt sind, generiert der Server ein JWT, das die Informationen des Benutzers enthält (wie seine ID, seinen Benutzernamen und seine Rolle).

2. Token an den Kunden gesendet
Sobald das JWT generiert ist, wird es normalerweise im Antworttext an den Client zurückgesendet. Der Client speichert dieses Token (in localStorage oder sessionStorage für einen Browser oder sicher auf einem mobilen Gerät).

3. Benutzer fordert geschützte Ressourcen
Immer wenn der Client auf eine geschützte Route zugreifen muss, sendet er das JWT im Authorization-Header der Anfrage:

Authorization: Bearer <JWT_TOKEN>

Nach dem Login kopieren

Der Server überprüft dann das Token und stellt seine Gültigkeit und Integrität sicher, bevor er Zugriff auf die Ressource gewährt.

4. Ablauf und Aktualisierung des Tokens
Da JWT-Tokens eine Ablaufzeit haben (z. B. 5 Minuten), kann der Benutzer nach Ablauf ein Aktualisierungstoken senden, um ein neues JWT zu erhalten, ohne sich erneut anmelden zu müssen.

5. Benutzer meldet sich ab
Wenn sich der Benutzer abmeldet, wird das Aktualisierungstoken normalerweise auf die schwarze Liste gesetzt (in Setups, die das Blacklisting unterstützen), um sicherzustellen, dass der Benutzer effektiv abgemeldet ist und das Token nicht mehr aktualisieren kann.

JWT vs. traditionelle Authentifizierungsmethoden in Django

JWT ist eine von vielen Möglichkeiten, die Authentifizierung in Django-Anwendungen zu implementieren. Werfen wir einen Blick darauf, wie JWT im Vergleich zu anderen gängigen Methoden wie Sitzungsverwaltung und Authentifizierungstokens abschneidet.

1. JWT-Authentifizierung vs. Sitzungsverwaltung

Sitzungsverwaltung:
Bei der sitzungsbasierten Authentifizierung erstellt der Server nach der Anmeldung eines Benutzers eine Sitzung und speichert sie in der Datenbank oder im Speicher. Anschließend wird über Cookies eine Sitzungs-ID an den Client gesendet. Der Client speichert die Sitzungs-ID und sendet sie bei jeder Anfrage. Der Server ruft dann die Sitzungsdaten aus dem Speicher ab, um den Benutzer zu identifizieren.

Reales Szenario:

E-Commerce-Website: Stellen Sie sich vor, Sie melden sich in einem Online-Shop an, legen Artikel in Ihren Warenkorb und gehen zur Kasse. Jede Aktion während dieser Sitzung, wie das Anzeigen von Produkten oder das Aktualisieren des Warenkorbs, ist mit Ihrer auf dem Server gespeicherten Sitzungs-ID verknüpft. Sobald Sie sich abmelden, wird die Sitzung zerstört.

JWT vs. Sitzungen:

- Lagerung:

  • JWT: Zustandslos, kein serverseitiger Speicher. Alle Daten sind im Token selbst enthalten.
  • Sitzungen: Zustandsbehaftet, der Server speichert Sitzungsdaten (normalerweise in einer Datenbank oder einem Speicher) und eine Sitzungs-ID wird an den Client gesendet.

- Skalierbarkeit:

  • JWT: Hoch skalierbar; Es müssen keine Benutzersitzungsinformationen gespeichert werden, was eine einfache horizontale Skalierung über mehrere Server hinweg ermöglicht.
  • Sitzungen: Weniger skalierbar; erfordert die Verwaltung und gemeinsame Nutzung von Sitzungsdaten zwischen Servern (z. B. mithilfe eines zentralen Sitzungsspeichers).

- Datenübertragung:

  • JWT: Der Token enthält alle Benutzerdaten (Ansprüche) und wird bei jeder Anfrage gesendet. Es kann groß werden, wenn zu viele Daten enthalten sind.
  • Sitzungen: Es wird nur eine Sitzungs-ID gesendet und Benutzerdaten werden vom Server abgerufen.

- Sicherheit:

  • JWT: Anfällig, wenn Token nicht sicher auf dem Client gespeichert sind (z. B. lokaler Speicher). Es ist wichtig, den Ablauf und die Aktualisierung des Tokens sicher zu handhaben.
  • Sitzungen: Verwendet normalerweise Cookies zum Speichern der Sitzungs-ID, die sicherer sind, wenn Nur-HTTP- und Secure-Flags verwendet werden. Es kann jedoch anfällig für CSRF-Angriffe sein.

- Ablauf & Verwaltung:

  • JWT: Token haben eine Ablaufzeit. Wenn ein Aktualisierungstoken verwendet wird, kann das Zugriffstoken ohne erneute Authentifizierung erneuert werden.
  • Sitzungen: Sitzungen haben ebenfalls eine Zeitüberschreitung, können aber problemlos verlängert werden, solange der Benutzer mit der App interagiert.

- Token-Größe:

  • JWT: Da alle Daten im Token enthalten sind, können JWTs größer sein, insbesondere wenn sie viele Benutzerinformationen oder Metadaten enthalten.
  • Sitzungen: Bei jeder Anfrage wird nur die Sitzungs-ID gesendet, sodass die Datenübertragung minimal ist.

- Verwendung:

  • JWT: Bevorzugt in modernen, zustandslosen APIs, Single-Page-Anwendungen (SPAs) und mobilen Apps.
  • Sitzungen: Häufig in herkömmlichen Webanwendungen, bei denen der Server den Benutzerstatus verwaltet.

2. JWT-Authentifizierung vs. Auth-Tokens

Auth-Tokens:
Bei der tokenbasierten Authentifizierung (wie der integrierten Token-Authentifizierung von Django) generiert der Server ein eindeutiges Token, wenn sich der Benutzer anmeldet. Dieses Token wird auf dem Server gespeichert und an den Client gesendet, der es in jede Anfrage einfügt. Der Server überprüft das Token in der Datenbank, um den Benutzer zu verifizieren.

Reales Szenario:

API-Zugriff: Ein API-Anbieter (wie GitHub) generiert nach der Anmeldung ein API-Token für Benutzer. Jedes Mal, wenn Sie mit der GitHub-API interagieren, wird das Token in den Anforderungsheadern übergeben, um die Anforderung zu authentifizieren .

JWT vs. Auth-Tokens:

- Token-Speicher

JWT (JSON Web Token):

Staatenlos: JWTs sind in sich geschlossen, was bedeutet, dass alle notwendigen Informationen (Ansprüche) im Token selbst gespeichert sind. Der Server speichert das Token nicht, was es zu einem zustandslosen System macht.
Das Token wird normalerweise clientseitig gespeichert (z. B. in localStorage, sessionStorage oder Cookies) und bei jeder Anfrage im Authorization-Header gesendet.

Auth-Tokens:

Stateful: Bei der herkömmlichen tokenbasierten Authentifizierung wird das Token serverseitig generiert und gespeichert (häufig in einer Datenbank). Der Server verfolgt das Token und der Client fügt es in jede Anfrage ein (normalerweise in die Header).

- Token-Struktur

JWT:

Eigenständig: JWT-Token bestehen aus drei Teilen: Header, Nutzlast und Signatur. Die Nutzlast enthält Benutzerinformationen (wie ID, E-Mail, Rolle) und ist signiert, um die Integrität sicherzustellen.

Auth-Tokens:

Undurchsichtige Token: Authentifizierungs-Tokens sind normalerweise undurchsichtige Zeichenfolgen, was bedeutet, dass sie keine Benutzerinformationen enthalten. Sie fungieren als Referenz auf die serverseitigen Sitzungs- oder Benutzerdaten.
Der Server verwendet dieses Token, um die auf dem Server gespeicherten Sitzungs- oder Benutzerinformationen abzurufen.

- Serverspeicher und Skalierbarkeit

JWT:

Kein Serverspeicher: Da JWT-Tokens eigenständig sind, muss der Server keine Sitzungs- oder Tokendaten speichern. Dies macht es hoch skalierbar, insbesondere in verteilten Systemen oder Microservices-Architekturen, an denen mehrere Server beteiligt sein können.

Auth-Tokens:

Serverseitige Speicherung: Authentifizierungstoken werden in einer Datenbank oder einem Speicher auf dem Server gespeichert, was bedeutet, dass der Server das Token für jede Anfrage verfolgen und validieren muss. Dies kann weniger skalierbar sein, da der Server für jede Anfrage auf einen zentralen Sitzungsspeicher zugreifen muss.

- Sicherheitsaspekte

JWT:

Signaturbasiert: JWT-Tokens werden mit Algorithmen wie HS256 oder RS256 signiert, um sicherzustellen, dass das Token nicht manipuliert wurde. Dadurch wird zwar die Integrität des Tokens geschützt, die Daten werden jedoch nicht verschlüsselt. Sensible Daten sollten nicht in die Nutzlast aufgenommen werden, es sei denn, sie sind verschlüsselt.

Clientseitige Risiken: JWTs werden oft in localStorage oder sessionStorage gespeichert, was sie anfällig für XSS-Angriffe (Cross-Site Scripting) machen kann. Um dies zu mildern, können sie in reinen HTTP-Cookies gespeichert werden.

Auth-Tokens:

Serverseitige Validierung: Da Authentifizierungstoken keine Benutzerinformationen enthalten und anhand einer Sitzung auf dem Server validiert werden, gelten sie als sicherer vor Manipulationen. Sie sind jedoch anfällig für Session-Hijacking oder CSRF-Angriffe (Cross-Site Request Forgery), wenn sie nicht ordnungsgemäß gehandhabt werden.

- Ablauf und Token-Lebensdauer

JWT:

Kurzlebige Zugriffstoken: JWTs haben normalerweise eine kurze Lebensdauer (z. B. 5–15 Minuten). Nach Ablauf muss der Client ein Aktualisierungstoken verwenden, um ein neues Zugriffstoken zu erhalten. Dies ist ein wichtiger Bestandteil des Sicherheitsmodells von JWT.
Aktualisierungstoken: Langlebige Aktualisierungstoken ermöglichen es Benutzern, angemeldet zu bleiben, ohne ihre Anmeldeinformationen ständig erneut eingeben zu müssen, sie bringen jedoch auch ihre eigenen Sicherheitsherausforderungen mit sich (z. B. sollten sie sicher gespeichert und verwaltet werden).

Auth-Tokens:

Kein Token-Ablauf standardmäßig: Authentifizierungs-Tokens laufen standardmäßig nicht ab, es sei denn, dies wird ausdrücklich vom Server gehandhabt. Der Server kann Token widerrufen oder ablaufen lassen, dies erfordert jedoch zusätzliche Logik und Speicher, um den Ablauf der Token zu verfolgen.

- Tokengröße

JWT:

Größere Tokengröße: Da JWTs Benutzerinformationen (Ansprüche) und die Signatur enthalten, sind sie im Vergleich zu undurchsichtigen Authentifizierungstoken tendenziell größer. Dies kann die Bandbreitennutzung leicht erhöhen, insbesondere in Szenarien mit häufigen Anfragen.

Auth-Tokens:

Kleinere Tokengröße: Authentifizierungstoken sind normalerweise undurchsichtige Zeichenfolgen, was bedeutet, dass sie viel kleiner sind. Sie fungieren als Identifikator und übertragen keine zusätzlichen Daten, sodass sie weniger Bandbreite verbrauchen.

- Beispiel-Nutzungsszenarien

JWT:

Single Page Applications (SPAs): JWTs funktionieren gut mit SPAs (wie React oder Angular), bei denen Sie eine zustandslose Authentifizierung und keine serverseitige Sitzungsverwaltung benötigen.

Microservices und APIs: JWTs sind ideal für APIs und Microservice-Architekturen, bei denen mehrere Dienste Benutzer authentifizieren müssen, ohne den Sitzungsstatus serverübergreifend zu teilen.
Authentifizierungstoken:

Traditionelle Web-Apps: In servergerenderten Webanwendungen werden häufig Authentifizierungstoken (oder Sitzungen) verwendet, da sie serverseitig gespeichert und validiert werden, wodurch sie sich gut für Anwendungen eignen, bei denen die Aufrechterhaltung einer Sitzung einfach ist.
Kleine Anwendungen: Authentifizierungstoken eignen sich gut für Anwendungen mit weniger Benutzern, bei denen die Sitzungsverwaltung kein Skalierbarkeitsproblem darstellt.

- Staatenlosigkeit vs. Staatenhaftigkeit

JWT:

Zustandslos: Da JWTs keinen serverseitigen Speicher benötigen, machen sie Anwendungen zustandslos. Dies ist für die horizontale Skalierung über mehrere Server hinweg von Vorteil, da keine Sitzungssynchronisierung zwischen Servern erforderlich ist.
Authentifizierungstoken:

Zustandsbehaftet: Authentifizierungstoken erfordern serverseitigen Sitzungsspeicher, was bedeutet, dass der Server die Sitzungsdaten verfolgt. Dies ist für kleine Anwendungen in Ordnung, kann jedoch bei der Skalierung auf mehrere Server problematisch sein, sofern kein zentraler Sitzungsspeicher (wie Redis) verwendet wird.

- Blacklisting und Widerruf

JWT:

Schwierig zu widerrufen: Da JWTs zustandslos sind und nicht auf dem Server gespeichert werden, ist es schwierig, sie nach ihrer Ausgabe zu widerrufen, es sei denn, Sie verwenden Token-Blacklisting. Das heißt, wenn ein Token kompromittiert wird, bleibt es gültig, bis es abläuft.

Blacklisting erforderlich: Um den Token-Widerruf zu handhaben (z. B. beim Abmelden), muss auf dem Server ein Blacklist-Mechanismus implementiert werden, um ungültige Token zu verfolgen.

Auth-Tokens:

Einfach zu widerrufen: Authentifizierungs-Tokens werden auf dem Server gespeichert, sodass sie problemlos widerrufen oder ungültig gemacht werden können.

3. JWT-Authentifizierung vs. Basisauthentifizierung

Basisauthentifizierung:
Bei der Basisauthentifizierung sendet der Client bei jeder Anfrage die Anmeldeinformationen des Benutzers (Benutzername und Passwort), normalerweise in Base64 codiert. Diese Methode wird häufig in internen Systemen oder einfachen Setups verwendet.

Reales Szenario:

Internes Admin-Dashboard: Das interne Admin-Dashboard eines kleinen Unternehmens erfordert, dass sich Benutzer mit Basisauthentifizierung anmelden. Wenn Benutzer auf eine Seite zugreifen, werden ihre Anmeldeinformationen in der Anfrage gesendet.

Cas d'utilisation réel : quand utiliser JWT ?

Prenons un exemple concret : une plateforme de médias sociaux sur laquelle les utilisateurs se connectent, interagissent avec des publications et gèrent leurs profils sur plusieurs appareils.

Dans un tel système :

  1. JWT fonctionne bien car il est sans état, ce qui signifie que le serveur n'a pas besoin de stocker les sessions utilisateur.
  2. Le client peut stocker le jeton localement, ce qui permet aux utilisateurs de rester connectés sur différents onglets et appareils.
  3. Étant donné que l'application peut évoluer horizontalement sur plusieurs serveurs (par exemple, un serveur pour gérer les publications et un autre pour les profils), l'utilisation de JWT facilite la mise à l'échelle sans avoir besoin d'un magasin de session central.
  4. Les utilisateurs peuvent également actualiser périodiquement leurs jetons pour conserver l'accès sans avoir à se reconnecter.

Conclusion : quelle méthode d’authentification choisir ?

Le choix de la bonne méthode d'authentification dépend des exigences de votre application :

JWT est idéal pour les applications sans état et évolutives (telles que les SPA, les applications mobiles et les microservices).
L'authentification basée sur la session fonctionne bien pour les applications Web traditionnelles où l'évolutivité n'est pas une préoccupation majeure.
Les jetons d'authentification sont une méthode simple et sécurisée pour l'authentification API à petite échelle où le stockage des jetons côté serveur est gérable.

Chaque méthode a ses forces et ses faiblesses, mais JWT se distingue par sa capacité à gérer des systèmes modernes et distribués où l'évolutivité et la flexibilité sont essentielles.

Das obige ist der detaillierte Inhalt vonAuthentifizierung und Autorisierung – der richtige Weg!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage