OWASP et HTML5Mtl : Une introduction à JWT (JSON Web Tokens)
Avant de commencer : Les références
Cette présentation reprend du contenu et suit plusieurs autres présentations et articles sur le Web. Vous trouverez de plus amples informations en y accédant. Elles sont toutefois en anglais :-) Les voici :
- https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
- http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/
- http://www.httpwatch.com/httpgallery/authentication/
- http://en.wikipedia.org/wiki/Claims-based_identity
- https://scotch.io/tutorials/the-anatomy-of-a-json-web-token
- http://jwt.io/
- http://docs.nodejitsu.com/articles/HTTP/servers/how-to-create-a-HTTPS-server
Qu'est que JWT ?
- Permet de s'authentifier à une API / Application Web
- Pensons à un cookie, mais sans le principe de session
- JWT transporte son état avec lui
Authentification et autorisation sur le Web - Basic Authentication
Authentification et autorisation sur le Web - Basic Authentication
Authentification et autorisation sur le Web - Cookie et sessions
Authentification et autorisation sur le Web - Cookie et sessions
Authentification et autorisation sur le Web - Bearer et JWT
Authentification et autorisation sur le Web - Bearer et JWT
- Plusieurs autres mécanismes peuvent produire un JWT
- OpenID Connect (OAuth 2.0) - autres échanges de tokens, etc.
Anatomie d'un JSON Web Token
- Trois chaînes de caractères séparées par des points
- L'en-tête, le payload et la signature
- Encodage Base64
Anatomie d'un JSON Web Token : L'en-tête / header
- L'en-tête contient deux sections :
- Le type de jeton (JWT)
- L'algorithme de hachage
Anatomie d'un JSON Web Token : Le chargement / payload
- Le payload va contenir des claims ou des revendications
Authentification par claims
- C'est l'histoire d'un gars dans un bar...
- Découpler authentification des applications
- Liste d'informations sur l'utilisateur / l'identité
- Le nom, l'age, le courriel, la liste d'amis
Anatomie d'un JSON Web Token : payload, Registered Claims
Ils sont tous facultatifs.
- iat:
- Moment où le jeton a été émis.
- iss:
- L'émetteur du jeton
- sub:
- Le sujet du jeton
- aud:
- À qui s'adresse le jeton
- exp:
- Moment où le jeton expire. La date actuelle doit être avant ce moment.
- nbf:
- Moment où le jeton devient actif. Ne doit pas être accepté avant ce moment.
- jti:
- identifiant unique pour le jeton
Anatomie d'un JSON Web Token : la signature
La signature utilise un algorithme (ex: HMAC SHA256) où l'en-tête et le payload sont encodés, puis signés à partir d'un secret connu seulement de l'émetteur du jeton (serveur d'authentification) et du consommateur (l'application Web - côté serveur)
JWT et Cross Domain / CORS
Les appels AJAX CORS ne transportent pas toujours les cookies
Un JWT est ajouté au headers dans un XMLHttpRequest 2 et peut être utilisé dans un contexte CORS
CORS : Utiliser Ajax Cross Site
- Ajout de headers dans les requêtes OPTIONS, GET, POST, etc
- Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Credentials, Access-Control-Max-Age, Access-Control-Allow-Headers
- Attention ! Ne pas mettre Access-Control-Allow-Origin à * en production !!!
- Pour IE 8,9 XDomainRequest
- Requêtes Pre-flight
La nature stateless de JWT
- L'information sur l'utilisateur est dans le jeton
- Il n'est donc pas nécessaire de garder un mapping entre le jeton et l'information utilisateur (session)
- Il est possible d'ajouter d'autres informations dans les claims privés pour garder l'état. L'état sera plutôt gardé sur l'application client.
Impact d'utiliser JWT sur la cache et la performance
- Balanceur de charge : plus besoin de session stickyness
- Cache réseau et CDN : par défaut, ne vont pas cacher lorsque le cookie est envoyé
- Un appel en plus avec OPTIONS
- Attention au poids du jeton
Impact d'utiliser JWT sur le SEO et analytics
- Traçabilité par l'information du jeton
- Découpler l'authentification du cookie peut simplifier l'indexation, mais peut la complexifier aussi.
Comment garder en mémoire le JWT ?
- Un Cookie ?
- LocalStorage et SessionStorage
- Attention aux sous-domaines
Sécurité : XSRF ou XSS ?
- XSRF
- Tromper une application en faisant rejouer une requête dans le contexte de l'utilisateur connecté
- XSS
- Injection de code exécutable par le navigateur dans une application Web
- Les jetons JWT sont potentiellement vulnérables au XSS
- Ils sont moins vulnérables aux XSRF que les cookies
Découplage de l'authentification de l'application Web / API
- Possibilité d'utiliser un fournisseur externe d'authentification (ex: OAuth2 avec Google)
- SSO entre plusieurs applications - et IAM
- Secret partagé entre application cliente et service d'authentification
Expiration du JWT
- Envoyer le jeton à une URL de rafraîchissement, le valider, puis envoyer un nouveau jeton.
Chiffrement du JWT
- Le payload n'est pas chiffré, donc ne pas mettre d'information sensible dans le payload
- Il est par contre possible de le chiffre
- JWE et JOSE
Encoding API
- Encodage et décodage de formats
- TextEncoder et TextDecoder
- Texte en UTF-8
- Bonjour le monde ééé
- Texte encodé puis décodé en ISO-8859-1
Web Crypto API
- L'API Web Crypto peut être utilisée pour :
- Authentification
- Chiffrement
- Signatures de messages
- Validation d'intégrité
- Hashage
- Plus d'information :
Web Crypto API - Exemple Hash SHA-1
JWT dans le cadre d'une application Angular.JS
Autres points à regarder
- Appels en mode streaming