Discutons du tout début:
JWT est une approche très moderne, simple et sécurisée qui s'étend aux jetons Web Json. Les jetons Web Json sont une solution sans état pour l'authentification. Il n'est donc pas nécessaire de stocker un état de session sur le serveur, ce qui est bien sûr parfait pour les API reposantes. Les API reposantes doivent toujours être sans état, et l'alternative la plus largement utilisée à l'authentification avec les JWT est de simplement stocker l'état de connexion de l'utilisateur sur le serveur à l'aide de sessions. Mais alors, bien sûr, ne suit pas le principe qui dit que les API reposantes doivent être sans état et c'est pourquoi des solutions comme JWT sont devenues populaires et efficaces.
Alors maintenant, savons comment l'authentification fonctionne réellement avec les jetons Web Json. En supposant que nous avons déjà un utilisateur enregistré dans notre base de données. Ainsi, le client de l'utilisateur commence par faire une demande de publication avec le nom d'utilisateur et le mot de passe, l'application vérifie ensuite si l'utilisateur existe et si le mot de passe est correct, puis l'application générera un jeton Web Json unique pour cet utilisateur uniquement.
Le jeton est créé en utilisant une chaîne secrète qui est stockée sur un serveur . Ensuite, le serveur renvoie ensuite ce JWT au client qui le stockera dans un cookie ou dans un stockage local.
Tout comme cela, l'utilisateur est authentifié et essentiellement connecté à notre application sans laisser aucun état sur le serveur.
Donc, le serveur ne sait pas en fait quel utilisateur est réellement connecté, mais bien sûr, l'utilisateur sait qu'il est connecté parce qu'il a un jeton Web Json valide qui est un peu comme un passeport pour accéder aux parties protégées de l'application.
Encore une fois, juste pour vous assurer que vous avez eu l'idée. Un utilisateur est connecté dès qu'il récupère son jeton Web Json valide unique qui n'est enregistré nulle part sur le serveur. Et donc ce processus est donc complètement apatride.
Ensuite, chaque fois qu'un utilisateur souhaite accéder à un itinéraire protégé comme ses données de profil utilisateur, par exemple. Il envoie son Json Web Token avec une demande, c'est donc un peu comme montrer son passeport pour avoir accès à cet itinéraire.
Une fois que la demande arrive sur le serveur, notre application vérifie alors si le jeton Web Json est réellement valide et si l'utilisateur est vraiment ce qu'il dit être, eh bien, les données demandées seront envoyées au client et sinon, il y aura être une erreur indiquant à l'utilisateur qu'il n'est pas autorisé à accéder à cette ressource.
Toute cette communication doit se faire via https, donc sécurisé et crypté Http afin d'empêcher que quiconque puisse avoir accès aux mots de passe ou aux jetons Web Json. Alors seulement, nous avons un système vraiment sécurisé.
Donc, un jeton Web Json ressemble à la partie gauche de cette capture d'écran qui a été prise du débogueur JWT à jwt.io Donc, c'est essentiellement une chaîne de codage composée de trois parties. L'en-tête, la charge utile et la signature Maintenant, l'en-tête n'est que quelques métadonnées sur le jeton lui-même et la charge utile est les données que nous pouvons encoder dans le jeton, toutes les données que nous voulons vraiment. Donc, plus nous voulons coder de données ici, plus le JWT est grand. Quoi qu'il en soit, ces deux parties ne sont que du texte brut qui sera encodé, mais pas crypté.
Donc, n'importe qui pourra les décoder et les lire , nous ne pouvons pas stocker de données sensibles ici. Mais ce n'est pas du tout un problème car dans la troisième partie, donc dans la signature, c'est là que les choses deviennent vraiment intéressantes. La signature est créée à l'aide de l'en-tête, de la charge utile et du secret enregistré sur le serveur.
Et tout ce processus est alors appelé signature du jeton Web Json . L'algorithme de signature prend l'en-tête, la charge utile et le secret pour créer une signature unique. Donc, seules ces données et le secret peuvent créer cette signature, d'accord? Ensuite, avec l'en-tête et la charge utile, ces signatures forment le JWT, qui est ensuite envoyé au client.
Une fois que le serveur reçoit un JWT pour accorder l'accès à une route protégée, il doit le vérifier afin de déterminer si l'utilisateur est vraiment qui il prétend être. En d'autres termes, il vérifiera si personne n'a modifié l'en-tête et les données de charge utile du jeton. Encore une fois, cette étape de vérification vérifiera si aucun tiers n'a réellement modifié l'en-tête ou la charge utile du jeton Web Json.
Alors, comment fonctionne cette vérification? Eh bien, c'est en fait assez simple. Une fois le JWT reçu, la vérification prendra son en-tête et sa charge utile, et avec le secret qui est toujours enregistré sur le serveur, créera essentiellement une signature de test.
Mais la signature d'origine qui a été générée lors de la création du JWT est toujours dans le jeton, non? Et c'est la clé de cette vérification. Parce que maintenant, tout ce que nous avons à faire est de comparer la signature de test avec la signature d'origine. Et si la signature de test est la même que la signature d'origine, cela signifie que la charge utile et l'en-tête n'ont pas été modifiés.
Parce que s'ils avaient été modifiés, la signature de test devrait être différente. Par conséquent, dans ce cas où il n'y a pas eu de modification des données, nous pouvons alors authentifier l'utilisateur. Et bien sûr, si les deux signatures sont réellement différentes, eh bien, cela signifie que quelqu'un a falsifié les données. Habituellement, en essayant de modifier la charge utile. Mais ce tiers manipulant la charge utile n'a bien sûr pas accès au secret, il ne peut donc pas signer le JWT. La signature d'origine ne correspondra donc jamais aux données manipulées. Et par conséquent, la vérification échouera toujours dans ce cas. Et c'est la clé pour faire fonctionner l'ensemble de ce système. C'est la magie qui rend JWT si simple, mais aussi extrêmement puissant.
md5('original messaged' + secret) != md5('changed message' + secret)
donc si quelqu'un change le message, vous pouvez le détecter