La plupart des applications web courantes se composent de deux parties :
- Partie Front-End : c’est la partie visible pour les utilisateurs qui contient l’interface avec laquelle se fait les interactions avec l’application.
- Partie Back-End : c’est la partie invisible pour les utilisateurs qui contient la partie métier des applications composée des serveurs Web et les bases de données.
Ces deux parties utilisent le protocole HTTP pour échanger les données entre eux.
Ces informations peuvent être privées, donc il faut une authentification pour y avoir un accès.
Il existe deux types d’authentification :
- Stateful : C’est-à-dire les données de la session sont enregistrées côté serveur d’authentification.
L'authentification Stateful est couramment utilisée dans de nombreuses applications, en particulier pour les applications qui ne nécessitent pas trop d'évolutivité.
- Stateless : C’est-à-dire les données de la session sont enregistrées dans un jeton délivré au client.
L'authentification Stateless est utilisée pour résoudre les inconvénients de l'authentification Stateful. Parmi les solutions il existe le JWT (JSON Web Token).
JWT, C’EST QUOI ?
- JWT est un Standard « RFC 7519 » décrivant une méthode d’échange d’informations d’une manière sécurisée sous la forme d’un objet structuré au format JSON (Java Script Object Notation), stocké côté client et qui supporte les implémentations multi-langages.
- JWT est couramment utilisé pour implémenter des mécanismes d’authentification Stateless pour des SPA (Single Page Application) ou pour des applications mobiles.
- Cette méthode est :
- Compacte : c’est-à-dire de petite taille, qui permet d’envoyer les JWT via URL, un paramètre POST ou dans un en-tête HTTP, et une transmission rapide ;
- Autonome : Le JWT contient toutes les informations requises sur l’utilisateur, ce qui évite d’interroger la BD à chaque fois pour vérifier l’identité d’un client authentifié.
-
STRUCTURE DE JWT :
Un JWT est composé de trois parties séparées par des points, chacune contenant des informations différentes :
- - un header,
- - un payload,
- - la signature.
-
COMMENT ÇA FONCTIONNE ?
L'authentification Stateless stocke les données de session utilisateur côté client (navigateur) sous forme d’un Token JWT généré par le serveur, en calculant une signature basée sur un secret, lors de l’authentification.
Chaque requête envoyée par le client contient une partie « Authorization » qui contient le Token et le serveur n'a que à vérifier sa validité en vérifiant la signature du JWT en utilisant le secret.
AVANTAGES :
- Réduction de la surcharge du serveur : le grand nombre de données de session ne sont pas stockées côté serveur. Nous pouvons stocker davantage de propriétés utilisateur sur les données de session côté client pour réduire le nombre d'accès à la base de données sans se soucier de la surcharge de mémoire sur le serveur.
- Evolution facile : étant donné que les données de session sont stockées côté client, tant que tous les serveurs principaux partagent la même clé privée, tous les serveurs ont la même capacité de vérifier la validité de la session, ce qui présente une bonne solution pour les architectures Micro-Services.
INCONVENIENTS :
- Le principal inconvénient des JWT est qu’ils ne peuvent pas être révoqués. En cas de compromission du Token, il faut attendre que celui-ci expire.
- Afin de limiter le risque de compromission longue, on peut :
- Utiliser un mécanisme qui se base sur 2 JWT : Le 1er avec une durée de vie faible, et un 2ème avec une durée de vie assez longue qui permet de :
- - rafraîchir le premier token une fois expiré,
- - changer le secret de son application (mais invalidera TOUS les Tokens de TOUS vos utilisateurs),
- - tenir une liste de Tokens invalidés dans un cache qui sera consulté avant d’effectuer la validation d’un Token (ou l'inverse, qui consiste à garder la liste des Tokens valides).
-
CONCLUSION :
JWT est une manière assez simple d’offrir une authentification Stateless. Néanmoins, elle souffre de quelques inconvénients pour lesquels il est possible d’apporter des solutions.