Toutes les applications web qui utilisent le protocole OAuth 2.0 pour lâauthentification sont confrontĂ©es Ă de nombreuses failles de sĂ©curitĂ©. Parmis les solutions pour faire bouclier Ă ses attaques, câest le pattern Backend For Frontend (BFF).
DĂ©finition du pattern BFF
Le pattern Backend for Frontend consiste à créer des passerelles conformes aux besoins spécifiques de chaque client. Le pattern BFF est considéré aussi comme une variante du pattern API Gateway.
Pour donner un exemple, nous pouvons crĂ©er un BFF dans le cas oĂč nous avons une application web qui communique avec des services comme la solution Algolia qui utilise lâintelligence artificielle pour optimiser la recherche pour votre site ou une solution de paiement comme Stripe qui permet aux clients dâeffectuer des achats en ligne. Le Pattern BFF peut Ă©galement ĂȘtre utilisĂ© dans lâauthentification si nous communiquons par exemple avec un serveur de dĂ©lĂ©gation dâauthentification comme Auth0.
Lâimage ci-dessous reprĂ©sente lâacheminement dâune application web serverless avec des services externes sans lâutilisation dâun BFF.
Avec cette architecture, les services se comportent comme suit :Â
-
- Stripe : lâachat des articles se fait uniquement dans la partie frontend ( risque de fraude vu quâil nây a pas un serveur backend qui vĂ©rifie derriĂšre lâintĂ©gritĂ© de lâachat )
-
- Algolia : Lâalimentation de nouvelles entrĂ©es pour la recherche se fait en front ( risque de compromettre la base de donnĂ©es des mots clĂ©s )
- Auth0 : L’authentification se fait uniquement en frontend ( risque dâusurpation dâidentitĂ© )
Lâimage ci-dessous reprĂ©sente le mĂȘme schĂ©ma prĂ©cĂ©dent mais avec lâutilisation dâun BFF.
Comme lâimage ci-dessus le montre, le BFF est une API intermĂ©diaire entre une application web et le reste des services. Cela permet de faire abstraction de toute la complexitĂ© de la communication avec les services externes et laisser le frontend se concentrer pour offrir une bonne expĂ©rience utilisateur.
Par ailleurs, le fait de sortir toute la gestion de connexion avec les services en dehors du frontend, cela rĂ©duira la taille du bundle finale de lâapplication web, ce qui en rĂ©sulte Ă un chargement trĂšs rapide dans les navigateurs web.
Maintenant que le BFF est mis en place, voilĂ comment les services se comportent :Â
-
- Stripe : La validation de lâachat se fait cĂŽtĂ© BFF, ce qui permet au dĂ©veloppeur d’ajouter des couches de sĂ©curitĂ©.
- Algolia : Lâalimentation des mots clĂ©s se fait cĂŽtĂ© BFF, ce qui permet de vĂ©rifier lâidentitĂ© du client avant dâenrichir la base de donnĂ©es.
- Auth0: La gĂ©nĂ©ration du jeton dâauthentification se fait cĂŽtĂ© BFF, ce qui permet de cacher le token aux clients publiques.
Les risques de gĂ©rer lâauthentification cĂŽtĂ© frontend
Les applications basĂ©es sur les navigateurs web prĂ©sentent une surface d’attaque relativement large. Les risques de sĂ©curitĂ© proviennent non seulement du code de l’application elle-mĂȘme, qui doit ĂȘtre protĂ©gĂ© contre les scripts intersites ( cross site ), la falsification des requĂȘtes intersites et d’autres vulnĂ©rabilitĂ©s, mais aussi des frameworks, bibliothĂšques et autres paquets NPM qu’elle utilise, ainsi que de toutes leurs dĂ©pendances transitives.
En outre, les autres applications fonctionnant sur le mĂȘme site doivent Ă©galement ĂȘtre sĂ©curisĂ©es. Les rĂ©centes attaques Spectre contre les navigateurs nous rappellent que de nouvelles menaces apparaissent constamment. Compte tenu de tous ces risques, il nâest pas recommandĂ© de stocker des jetons d’accĂšs ou des jetons de rafraĂźchissement de grande valeur dans des emplacements accessibles par JavaScript.
De ce fait, en utilisant un BFF, les jetons dâauthentification ne sont accessibles que cĂŽtĂ© serveur et les sessions sont gĂ©rĂ©es Ă l’aide de cookies HTTP cryptĂ©s et signĂ©s. Cela simplifie considĂ©rablement les menaces et rĂ©duit les risques. Bien que les attaques par injection de contenu soient toujours possibles, le BFF limite la capacitĂ© de l’attaquant Ă abuser des API en limitant l’accĂšs par une interface bien dĂ©finie au backend, ce qui Ă©limine la possibilitĂ© d’appels d’API arbitraires.
GĂ©nĂ©ration de jeton đïž dâauthentification sans BFF :
GĂ©nĂ©ration de jeton đïž dâauthentification avec BFF :
Mise en place dâun BFF
Nous pouvons implĂ©menter un BFF avec nâimporte quel framework backend qui permet de mettre en place une authentification HTTP par Cookie pour protĂ©ger les endpoints ( entrĂ©es ) de lâAPI. Mais dans cet article, nous allons utiliser ASP.NET, et comme nous sommes fainĂ©ants, nous allons utiliser un framework qui va nous permettre dâaller encore plus vite s’appelant Duende – BFF Security Framework.
Ătapes de mise en place :
1. Installation du framework
> dotnet add package Duende.BFF
2. Dans le fichier program.cs ajouter lâauthentification par cookie et par openId dans les services :
3. Ajouter l’intĂ©gration du BFF dans les services
4. Ajouter les routes de la gestion du BFF dans les routes du serveur
5. Ajouter le BFF dans les middlewares ( intercepteurs )
NB: La ligne âapp.UseBff()â doit ĂȘtre entre le middle dâauthentification et d’autorisation.
6. ConsidĂ©rer que tous les contrĂŽleurs sont des entrĂ©es BFF ( donc sĂ©curisĂ©s ) Â
7. CĂŽtĂ© FrontEnd, il faut ajouter dans les entĂȘtes ( headers ) des requĂȘtes HTTP lâentĂȘte âx-csrf: 1″, La valeur de l’en-tĂȘte n’est pas importante, mais sa prĂ©sence, combinĂ©e Ă l’exigence d’un cookie, dĂ©clenche une demande de contrĂŽle prĂ©alable CORS pour les appels inter-origines. Cela permet d’isoler efficacement l’appelant Ă la mĂȘme origine que le BackEnd, ce qui offre une garantie de sĂ©curitĂ© solide.Â
DĂ©clencher lâauthentificationÂ
Pour dĂ©clencher lâauthentification, il suffit dâappeler la ressource : â/bff/loginâ du BFF, cette derniĂšre redirige le client vers la page dâauthentification.
Une fois l’utilisateur connectĂ©, un jeton est gĂ©nĂ©rĂ© signĂ© et cryptĂ© cĂŽtĂ© BFF et sera attachĂ© et rĂ©gĂ©nĂ©rĂ© Ă chaque interaction avec le BFF.
Nous pouvons avoir les informations publiques du client en appelant la ressource â/bff/userâ.
Enfin, La dĂ©connexion se fait en appelant la ressource â/bff/logoutâ avec lâurl de dĂ©connexion contenant lâID de la session rĂ©cupĂ©rĂ© des claims ( informations publiques du client ).Â
Conclusion
Lâutilisation dâun BFF nâest pas toujours utile, notamment sâil nây a pas dâauthentification ou l’inexistence des services externes. En revanche, le pattern BFF est fortement recommandĂ© pour assurer la sĂ©curitĂ© minimale au sein dâune application web.
GHEMID Mohamed
DĂ©veloppeur Full Stack Senior chez Devoteam
Créateur de contenu
Site Web · YouTube · LinkedIn