J'ai lu tout ce que j'ai pu sur ce sujet au cours des deux derniers jours et je ne peux pas décider quelle serait la meilleure approche.
Les deux seules exigences sont:
J'ai besoin de connaître les utilisateurs connectés et chaque session dont ils disposent, afin que l'utilisateur puisse voir une liste avec ces informations et pouvoir fermer la session de son choix.
Les deux applications doivent utiliser les mêmes points de terminaison d'une API de repos.
Au début, j'utilisais des cookies de session et j'appelais l'API avec setCredentials = true, mais j'ai constaté que les applications mobiles gèrent les cookies différemment et que je n'ai aucun contrôle sur cela (par exemple, elles sont supprimées pour diverses raisons avant expiration). J'ai pensé à enregistrer le cookie dans le stockage natif et à l'ajouter à chaque demande, mais je ne peux en aucun cas accéder au cookie car httpOnly est défini sur true. La solution serait de définir httpOnly sur false, mais de cette façon, j'expose le cookie et je ne suis pas sûr des mesures de sécurité à mettre en place pour protéger le cookie contre le vol ou la falsification.
L'autre solution serait d'utiliser JWT et de le stocker dans un stockage web/natif. Je voudrais également stocker dans une table chaque jeton encore valide (haché avec un algorithme de mot de passe) pour obtenir la liste des utilisateurs connectés et leurs sessions, et une autre table pour les jetons invalides lorsque l'utilisateur choisit de mettre fin à une session particulière/change de mot de passe/etc. Mais encore une fois, je ne suis pas sûr des mesures de sécurité que je devrais nous avec cette approche. Dois-je également chiffrer le jeton? Je pensais y ajouter des données sur l'appareil qui demande le jeton pour toujours vérifier que l'appareil qui a demandé le jeton est bien celui qui l'utilise. Quelles autres choses dois-je faire pour protéger ce jeton?
Si j'implémente correctement l'une de ces options, laquelle serait la plus sécurisée pour le Web et le mobile?
Avant d'entrer dans les détails, je dirai que les cookies de session et les JWT fonctionnent pour votre cas et que les deux sont sécurisés s'ils sont correctement mis en œuvre . Personnellement, j'irais avec les JWT, ne serait-ce que parce qu'il est plus facile d'obtenir des informations à jour ou des solutions prêtes à l'emploi.
Les JWT ont été vraiment conçus pour l'autorisation sans état, mais vous pouvez toujours les utiliser pour les sessions. Vous souhaiterez en particulier utiliser un modèle de jeton d'accès/d'actualisation dans lequel vous gardez une trace des jetons d'actualisation actifs dans votre base de données.
En ce qui concerne le cryptage, il existe deux principales implémentations de la norme JWT, à savoir JWS (un token signé) et JWE (token signé puis crypté). Ce que vous voulez garder à l'esprit, c'est que la signature d'un jeton signé garantit déjà l'intégrité du jeton. Vous ne mettriez en œuvre JWE que si vous transmettez également des informations sensibles dans le jeton que vous souhaitez masquer du client . Cependant, JWT en lui-même ne résout pas les problèmes avec les attaques man-in-the-middle, vous devez donc vous rappeler d'utiliser SSL lors de la transmission du jeton.
Le stockage du jeton diffère entre votre application Web et l'application native mobile. Pour les applications mobiles, vous devez les stocker dans le trousseau/magasin de clés du système d'exploitation (très probablement via un wrapper) qui est conçu à cette fin. D'un autre côté, où stocker les JWT sur un navigateur reste un sujet assez controversé car le stockage dans le stockage Web (sessionStorage/localStorage) est vulnérable aux attaques XSS tandis que le stockage dans un cookie est vulnérable au CSRF.
D'après ce que je peux comprendre, la tendance générale est d'éviter le stockage Web en raison de sa plus grande surface d'attaque, mais pour être honnête, j'ai vu des exemples des deux méthodes. Pour les applications d'une seule page, vous pouvez également envisager de conserver le jeton en mémoire sans stockage persistant.
Sans connaître les détails de votre application mobile, il est difficile de dire, mais d'après mon expérience, si vous utilisez les mécanismes CookieManager/NSHTTPCookieStorage fournis par Google/iOS, il ne devrait pas y avoir de problème de cookies supprimés que vous décrivez.
Le stockage des cookies sur le navigateur vous obligera à le sécuriser contre CSRF. Pour quelle protection vous devez utiliser, cela dépendra grandement de l'implémentation et des restrictions spécifiques de votre serveur et je pense que vous devriez vérifier les ressources sur OWASP ou demander plus de détails question.