J'ai une API dans Node JS avec principalement GET
points de terminaison et une application de page unique côté client.
L'application est censée être ouverte sans avoir besoin de s'authentifier, c'est-à-dire comme booking.com où vous pouvez parcourir les hôtels sans avoir besoin de vous connecter ou de vous inscrire.
Tout le monde peut toucher mes points de terminaison et obtenir des données JSON brutes ou même créer une application qui utilise mes points de terminaison dans leur propre application.
Comment sécuriser mon terminal? Par exemple, avec un jeton ou toute autre signature pour faire confiance à mon application client uniquement.
Vous ne pouvez sécuriser aucun secret public. Si la page HTML envoyée au client possède les clés API, elles ne sont plus secrètes. Tout le monde peut lire la page et saisir la clé, et l'utiliser comme bon lui semble.
Ne pensez même pas à l'encoder, l'obscurcir ou le chiffrer côté client non plus. Les outils de développement de tout navigateur moderne permettront à l'utilisateur de voir la demande réelle, et ils saisiront simplement les clés de la demande. Même si l'application est un binaire avec chiffrement et anti-sabotage, et utilise SSL avec certificat pining, un utilisateur déterminé récupérera les clés. Cela peut prendre des secondes ou des jours, mais la clé fuira.
Pour protéger les clés, utilisez un proxy. Créez un composant côté serveur qui détient les clés et accédez au backend, et votre page HTML (ou application, ou Java, ou n'importe quelle application client) y accédera.
Et vous ne pouvez pas vraiment savoir si le client qui se connecte est votre client. Même les producteurs de jeux MMO ont du mal à gérer alternative les clients utilisés pour contourner certaines protections. Vous ne pouvez que compliquer les choses, mais encore une fois, un attaquant déterminé peut contourner vos protections.