> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/web/jwt.md).

# JWT

https\://jwt.io/

### JSON Web Token

Les JWT servent à gérer les autorisations/permissions des utilisateurs pour accéder aux ressources d'une application web. Après s'être connecté, l'utilisateur reçoit un jeton (token) du serveur qu'il renvoie à chaque requête (en général dans l'en-tête HTTP `Authorization: Bearer <token>`).

{% hint style="info" %}
Ils peuvent aussi être envoyés dans les cookies.
{% endhint %}

Un token est composé de 3 parties:

* en-tête (header)
* contenu (payload)
* signature

La signature est optionnelle est sert à empêcher un attaquant de modifier le token.

{% hint style="success" %}
La signature valide est embarquée dans le token. Si un attaquant modifie celui-ci, la signature ne correspond plus au nouveau token. Des attaques sur l'authentification permettent de modifier un token sans le rendre invalide.
{% endhint %}

Chacune est encodée en base64 puis elles sont concaténées et séparées par des points.

<table><thead><tr><th width="243" align="center">header</th><th width="191" align="center">payload</th><th align="center">signature</th><th data-hidden align="center"></th></tr></thead><tbody><tr><td align="center"><mark style="color:red;">eyJhbGciOi[...]5c6IkpXVCJ</mark></td><td align="center"><mark style="color:purple;">eyJuYW[...]U2FtIn0</mark></td><td align="center"><mark style="color:blue;">eEgyRiHx0IKl[...]f0vzjplhs</mark></td><td align="center">.</td></tr></tbody></table>

La signature est générée avec l'algorithme spécifié dans le header. Il faut ensuite un secret pour la construire :&#x20;

```
signature = alg( base64(header) + "." + base64(payload) + <secret> )
```

Le secret peut être encodé en base64 optionnellement.

{% hint style="success" %}
Exemple de JWT:

```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiU2FtIn0.eEgyRijWPnrmFnkvy1HSxHx0IKlDr28TEtf0vzjplhs
```

* Header

```
{
  "alg": "HS256",
  "typ": "JWT"
}

=> base64(header) = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
```

* Payload

```
{
  "name": "Sam"
}

=> base64(payload) = eyJuYW1lIjoiU2FtIn0
```

* Signature (ici le secret est "secret")

```
=> HMACSHA256( base64(header) + "." + base64(payload) + "secret" )
```

{% endhint %}

{% hint style="danger" %}

* Les tokens ne sont pas forcément chiffrés donc il ne faut pas mettre d'informations sensibles dedans
* Ils doivent avoir une date d'expiration
  {% endhint %}
