banner
Maison / Blog / Jetons Web JSON (JWT) : les clés pour les utiliser en toute sécurité
Blog

Jetons Web JSON (JWT) : les clés pour les utiliser en toute sécurité

Jul 19, 2023Jul 19, 2023

Il y a quelques semaines, certains collègues développeurs nous faisaient part de leur inquiétude concernant la génération de JSON Web Tokens (JWT) qu'ils effectuaient dans le cadre de l'intégration d'un nouvel outil. Ils avaient entendu parler de « un certain nombre » de problèmes de sécurité et souhaitaient que nous les aidions à valider si les jetons émis étaient corrects et répondaient à certaines exigences de sécurité de base.

Nous travaillons actuellement sur un projet qui aide à automatiser les tests de sécurité, APICheck, que nous avons récemment publié en « open source ». APICheck se compose d'un ensemble de petits outils qui peuvent être interconnectés via des tuyaux pour pouvoir enchaîner l'exécution de différents tests sur les requêtes aux API, nous avons donc commencé à travailler avec la génération d'un outil qui permettrait de valider les jetons qu'ils ont émis, jwt -checker, dans lequel nous avons implémenté la possibilité de passer les validations que nous commenterons sur les tokens. Plus tard, je montrerai un exemple de test utilisant l'outil.

JWT (JSON Web Token) est un standard ouvert (publié dans la RFC 7519) qui définit une méthode compacte et autonome pour encapsuler et partager en toute sécurité des revendications sur un sujet entre différentes parties à l'aide d'objets JSON. Le contenu du jeton peut être fiable et vérifié lorsqu'il est signé numériquement (JWS, RFC 7515). La signature peut être générée à l'aide de clés symétriques (HMAC) ou asymétriques (RSA ou ECDSA). De plus, les JWT peuvent également contenir des données chiffrées (JWE, RFC 7516) pour protéger les données sensibles, bien que ce type de jetons ne fasse pas l'objet de cette étude.

Il est important de noter que, par défaut, les jetons ne sont pas chiffrés et que la chaîne que nous voyons est simplement une sérialisation utilisant le codage base64url, qui peut être facilement décodée pour voir le contenu JSON du jeton en clair.

La réponse à la question initiale est donc « ça dépend... ». Comme pour de nombreuses autres technologies, JWT dépend fortement de la configuration utilisée lors de la génération ainsi que de la bonne utilisation et validation des jetons lors de la consommation.

JWT (JSON Web Token) est un standard ouvert qui définit une méthode compacte et autonome pour encapsuler et partager en toute sécurité des assertions concernant une entité entre différentes parties à l'aide d'objets JSON.

Nous commencerons par voir quels sont les principaux types de tokens et les principaux cas d’usage :

JWT permet un échange de données sécurisé entre les parties plus efficacement que les autres normes (SAML) en raison de sa taille réduite, ce qui le rend idéal pour les cas d'utilisation suivants :

Chaque cas d'utilisation a un destinataire différent (application client et service API), mais dans le cas où un contrôle simultané est exercé sur les deux, un seul token peut être utilisé pour les deux cas.

Ci-dessous, nous allons lister les meilleures pratiques lorsque vous travaillez avec JWT, en nous concentrant uniquement sur leur génération et leur validation.

À quelques exceptions près (pour une utilisation côté client pour transporter des informations et des données de session afin de reconstruire l'interface utilisateur), un jeton ne doit pas être émis sans signature. La signature est une protection de base qui permet aux consommateurs du token de lui faire confiance et de s'assurer qu'il n'a pas été falsifié.

Lors du choix de l'algorithme de signature, gardez à l'esprit que les algorithmes à clé symétrique sont vulnérables aux attaques par force brute si la clé utilisée n'est pas assez forte (les noms d'animaux et les dates de naissance ne sont pas non plus valables pour cela ;- ), une complexité suffisante doit donc être fournie si des algorithmes à clé symétrique sont choisis. En revanche, les algorithmes de clé asymétrique simplifient la garde de la clé, puisqu'elle n'est nécessaire que dans la partie serveur qui génère le token.

Un token, une fois signé, est valable pour toujours s'il n'y a pas de date d'expiration (claim exp). Dans le cas des « jetons d'accès », si quelqu'un en capture un, il pourra avoir accès à l'opération autorisée pour toujours. L'attribution d'identifiants (claim jti) aux jetons permet leur révocation ; en cas de compromission du jeton, il est hautement souhaitable d'avoir la possibilité de le révoquer.