Sobes.tech
Junior

Qu'est-ce que JWT (JSON Web Token) ?

sobes.tech IA

Réponse de l'IA

JSON Web Token (JWT) est une méthode compacte et sécurisée pour transmettre des données entre parties au format JSON.

Principes de fonctionnement :

  • Le token se compose de trois parties, séparées par des points (.) : header.payload.signature.

  • Header (En-tête) : Contient des métadonnées sur le token, telles que le type de token (JWT) et l'algorithme de signature utilisé (par exemple, HS256, RS256).

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Payload (Charge utile) : Contient des "claims" - affirmations ou informations que nous voulons transmettre. Il en existe plusieurs types :

    • Claims enregistrés : Claims réservés mais optionnels, tels que iss (émetteur), exp (date d'expiration), sub (sujet).
    • Claims publics : Définis pour un usage public, doivent être enregistrés dans le registre JSON Web Token de l'IANA ou être des URI contenant un espace de noms protégé contre les collisions.
    • Claims privés : Affirmations arbitraires convenues entre les parties.
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • Signature (Signature) : Créée en combinant l'en-tête et la charge utile encodés avec un secret et l'algorithme spécifié dans l'en-tête. Cela garantit l'intégrité du token ; si quelqu'un modifie l'en-tête ou la charge utile, la signature sera invalide.

    # Exemple de création de signature avec HS256
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(En-tête)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Charge utile)
    secret = 'your_secret_key'
    
    # Signature = HMACSHA256(Base64Url(En-tête) + "." + Base64Url(Charge utile), secret)
    signature = hmac.new(
        secret.encode('utf-8'),
        (header_str + '.' + payload_str).encode('utf-8'),
        hashlib.sha256
    ).digest()
    
    # Encodage de la signature en Base64Url
    import base64
    signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii')
    
    # Token final : header_str + '.' + payload_str + '.' + signature_b64url
    

Applications :

  • Authentification : Le serveur émet le token à l'utilisateur après une authentification réussie. L'utilisateur envoie ce token avec chaque requête. Le serveur vérifie la validité du token et autorise l'accès aux ressources.
  • Échange d'informations : Transmission sécurisée de petits volumes de données entre différents services.

Avantages :

  • Compact : Moins de données à transmettre par rapport à XML.
  • Autonome : Le token contient déjà les informations nécessaires sur l'utilisateur, ce qui réduit la nécessité de consulter la base de données à chaque requête.
  • Sans état : Le serveur n'a pas besoin de stocker des informations de session de son côté.
  • Signature cryptographique : Assure l'intégrité des données.

Inconvénients :

  • Impossible de révoquer le token : Une fois émis, le token reste valable jusqu'à son expiration, sauf si un mécanisme de listes noires est mis en place.
  • Stockage du secret : La clé secrète doit être stockée en toute sécurité.
  • Taille : Avec l'augmentation de la quantité de données dans payload, la taille du token augmente également.