Maîtriser JWT (JSON Web Tokens) : une plongée approfondie
JSON Web Token (JWT) : une solution populaire pour l'authentification inter-domaines
Cet article présente les principes et l'utilisation de JSON Web Token (JWT), la solution d'authentification inter-domaines la plus populaire actuellement.
1. Les défis de l'authentification inter-domaines
Les services Internet sont indissociables de l'authentification des utilisateurs. Le processus traditionnel est le suivant :
- L'utilisateur envoie le nom d'utilisateur et le mot de passe au serveur.
- Après une authentification réussie du serveur, le rôle de l'utilisateur, l'heure de connexion et d'autres données associées seront enregistrés dans la session en cours.
- Le serveur renvoie un session_id à l'utilisateur et l'écrit dans le cookie de l'utilisateur.
- Chaque demande ultérieure de l'utilisateur renverra le session_id au serveur via Cookie.
- Une fois que le serveur a reçu le session_id, il recherche les données pré-enregistrées pour identifier l'utilisateur.
Ce modèle a une faible évolutivité : un environnement mono-machine convient, mais un cluster de serveurs ou une architecture orientée services inter-domaines nécessite le partage des données de session, et chaque serveur peut lire la session. Par exemple, le site Web A et le site Web B sont des services liés de la même entreprise. Une fois que les utilisateurs se sont connectés à l'un des sites Web, ils peuvent se connecter automatiquement lorsqu'ils visitent l'autre site Web. Une solution consiste à conserver les données de session, à les écrire dans une base de données ou une autre couche de persistance, et à demander les données à la couche de persistance après que chaque service ait reçu la demande. Cette solution a une architecture claire, mais la charge de travail est importante et une défaillance de la couche de persistance entraînera un point de défaillance unique. Une autre option est que le serveur ne sauvegarde pas du tout les données de session, toutes les données sont enregistrées sur le client et renvoyées au serveur à chaque demande. JWT représente cette approche.
2. Principe de JWT
Le principe de JWT est que le serveur génère un objet JSON après vérification et le renvoie à l'utilisateur, par exemple :
1 |
|
Plus tard, lorsque l'utilisateur communique avec le serveur, cet objet JSON doit être renvoyé et le serveur détermine complètement l'identité de l'utilisateur en fonction de cet objet. Pour empêcher les utilisateurs de falsifier les données, le serveur ajoute une signature lors de la génération de cet objet (détails décrits plus loin). Le serveur n'enregistre plus aucune donnée de session, c'est-à-dire qu'il devient sans état et plus facile à mettre à l'échelle.
3.Structure des données JWT
Le JWT actuel ressemble à ceci :
C'est une longue chaîne séparée en trois parties par des points (.). Notez qu'il n'y a pas de sauts de ligne à l'intérieur du JWT, les sauts de ligne ici sont uniquement destinés à faciliter l'affichage. Les trois parties de JWT sont les suivantes :
- En-tête
- Charge utile
- Signature
Une ligne est exprimée comme suit : Header.Payload.Signature
Ces trois parties sont présentées ci-dessous.
3.1 En-tête
La partie Header est un objet JSON décrivant les métadonnées du JWT, généralement comme suit :
1 |
|
L'attribut alg représente l'algorithme de signature, la valeur par défaut est HMAC SHA256 (HS256) ; l'attribut typ représente le type de ce jeton et les jetons JWT sont uniformément écrits en JWT. Cet objet JSON est finalement converti en chaîne à l'aide de l'algorithme Base64URL (détails ci-dessous).
3.2 Charge utile
La partie Payload est également un objet JSON utilisé pour stocker les données réelles qui doivent être transmises. JWT définit 7 champs facultatifs officiels :
- iss (émetteur) : Émetteur
- exp (délai d'expiration) : délai d'expiration
- sub (sujet) : sujet
- aud (audience) : audience
- nbf (Pas Avant) : temps effectif
- iat (émis à):Heure d'émission
- jti (JWT ID) : numéro de série
En plus des champs officiels, les champs privés peuvent également être personnalisés. Par exemple :
1 |
|
Notez que JWT n'est pas crypté par défaut et peut être lu par n'importe qui, alors ne mettez pas d'informations secrètes dans cette section. Cet objet JSON doit également être converti en chaîne à l'aide de l'algorithme Base64URL.
3.3 Signature
La partie Signature est la signature des deux premières parties, utilisée pour empêcher la falsification des données. Tout d’abord, vous devez spécifier un secret. Ce secret n’est connu que du serveur et ne peut pas être divulgué à l’utilisateur. Utilisez ensuite l'algorithme de signature spécifié dans l'en-tête (la valeur par défaut est HMAC SHA256) pour générer une signature selon la formule suivante :
1 |
|
Une fois la signature calculée, les trois parties En-tête, Charge utile et Signature sont combinées en une chaîne, et chaque partie est séparée par un "point" (.), qui peut être renvoyé à l'utilisateur.
3.4 URL Base64
Comme mentionné précédemment, l'algorithme de sérialisation de l'en-tête et de la charge utile est Base64URL. Cet algorithme est fondamentalement similaire à l'algorithme Base64, mais présente quelques différences mineures. En tant que jeton, JWT peut parfois être placé dans une URL (telle que api.example.com/?token=xxx. Les trois caractères en Base64, / et = ont des significations particulières dans l'URL et doivent être remplacés : = est). omis et remplacé par Remplacé par -, / est remplacé par _. Il s'agit de l'algorithme Base64URL.
4. Comment utiliser JWT
Une fois que le client a reçu le JWT renvoyé par le serveur, il peut le stocker dans Cookie ou localStorage. Le client doit transporter ce JWT chaque fois qu'il communique avec le serveur. Il peut être placé dans un cookie et envoyé automatiquement, mais cela ne peut pas être effectué entre domaines. Une meilleure approche consiste à le mettre dans le champ Autorisation de l'en-tête de la requête HTTP :
Autorisation : Porteur
Une autre approche consiste à mettre le JWT dans le corps de la requête POST lors du croisement de domaines.
5. Plusieurs caractéristiques de JWT
(1) JWT n'est pas chiffré par défaut, mais peut être chiffré. Une fois le jeton d'origine généré, il peut être à nouveau chiffré avec la clé.
(2) Si JWT n'est pas chiffré, les données secrètes ne peuvent pas être écrites.
(3) JWT peut être utilisé non seulement pour la vérification d'identité, mais également pour l'échange d'informations. Une utilisation efficace de JWT peut réduire le nombre de fois où le serveur interroge la base de données.
(4) Le plus gros inconvénient de JWT est que le serveur ne sauvegarde pas l'état de la session et ne peut pas révoquer un jeton ni modifier les autorisations du jeton pendant son utilisation. Autrement dit, une fois qu'un JWT est émis, il reste valide jusqu'à son expiration, à moins que le serveur ne déploie une logique supplémentaire.
(5) Le JWT lui-même contient des informations d'authentification, et une fois divulgués, n'importe qui peut obtenir toutes les autorisations du jeton. Pour réduire le vol, la période de validité de JWT doit être relativement courte. Pour certaines autorisations plus importantes, les utilisateurs doivent s'authentifier à nouveau lorsqu'ils les utilisent.
(6) Pour réduire le vol, JWT ne doit pas être transmis en texte clair via le protocole HTTP, mais doit être transmis via le protocole HTTPS.
Leapcell : la meilleure plateforme d'hébergement Web sans serveur
Enfin, je recommande la meilleure plateforme pour déployer des services web : Leapcell
1. Prise en charge multilingue
- Développer en JavaScript, Python, Go ou Rust.
2. Déployez un nombre illimité de projets gratuitement
- Payez uniquement ce que vous utilisez – pas de demandes, pas de frais.
3. Une rentabilité inégalée
- Payez au fur et à mesure, pas de frais d'inactivité.
- Exemple : 25 $ prend en charge 6,94 millions de requêtes avec un temps de réponse moyen de 60 ms.
4. Expérience développeur simplifiée
- Interface utilisateur intuitive, facile à configurer.
- Pipeline CI/CD entièrement automatisé et intégration GitOps.
- Mesures et journalisation en temps réel pour des informations exploitables.
5. Expansion facile et hautes performances
- Extension automatique pour gérer facilement une concurrence élevée.
- Zéro frais opérationnels - concentrez-vous uniquement sur la construction.
Apprenez-en plus dans la documentation !
Twitter de Leapcell : https://www.php.cn/link/7884effb9452a6d7a7a79499ef854afd
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Explication détaillée de la méthode de remplacement de la chaîne JavaScript et de la FAQ Cet article explorera deux façons de remplacer les caractères de chaîne dans JavaScript: le code JavaScript interne et le HTML interne pour les pages Web. Remplacer la chaîne dans le code JavaScript Le moyen le plus direct consiste à utiliser la méthode Remplace (): str = str.replace ("trouver", "remplacer"); Cette méthode remplace uniquement la première correspondance. Pour remplacer toutes les correspondances, utilisez une expression régulière et ajoutez le drapeau global G: str = str.replace (/ fi

Des fonctions JavaScript simples sont utilisées pour vérifier si une date est valide. fonction isValidDate (s) { var bits = s.split ('/'); var d = new Date (bits [2] '/' bits [1] '/' bits [0]); return !! (d && (d.getMonth () 1) == bits [1] && d.getDate () == Number (bits [0])); } //test var

Cet article explique comment utiliser jQuery pour obtenir et définir les valeurs de marge et de marge intérieures des éléments DOM, en particulier les emplacements spécifiques de la marge extérieure et des marges intérieures de l'élément. Bien qu'il soit possible de définir les marges intérieures et extérieures d'un élément à l'aide de CSS, l'obtention de valeurs précises peut être délicate. // installation $ ("div.header"). CSS ("marge", "10px"); $ ("div.header"). css ("padding", "10px"); Vous pourriez penser que ce code est

Cet article explore dix onglets jQuery exceptionnels et accordéons. La principale différence entre les onglets et les accordéons réside dans la façon dont leurs panneaux de contenu sont affichés et cachés. Plongeons ces dix exemples. Articles connexes: 10 plugins de l'onglet jQuery

Découvrez dix plugins jQuery exceptionnels pour élever le dynamisme et l'attrait visuel de votre site Web! Cette collection organisée offre diverses fonctionnalités, de l'animation d'image aux galeries interactives. Explorons ces outils puissants: Related Posts: 1

HTTP-Console est un module de nœud qui vous donne une interface de ligne de commande pour exécuter les commandes HTTP. C'est idéal pour le débogage et voir exactement ce qui se passe avec vos demandes HTTP, qu'elles soient faites contre un serveur Web, Web Serv

Ce tutoriel vous montre comment intégrer une API de recherche Google personnalisée dans votre blog ou site Web, offrant une expérience de recherche plus raffinée que les fonctions de recherche de thème WordPress standard. C'est étonnamment facile! Vous pourrez restreindre les recherches à Y

L'extrait de code jQuery suivant peut être utilisé pour ajouter des barres de défilement lorsque le contenu DIV dépasse la zone de l'élément de conteneur. (Pas de démonstration, veuillez le copier directement sur Firebug) // d = document // w = fenêtre // $ = jQuery var contentArea = $ (this), wintop = contentArea.scrollTop (), docheight = $ (d) .height (), winheight = $ (w) .height (), divheight = $ ('# c
