A mon sens, la sécurisation d'une API inclus mais ne se limite pas au système d'authentification. Je vais essayer brièvement ici d'expliquer un peu les principaux points de base à prendre en compte (liste non-exhaustive):
Authentification
Comme discuté plus haut dans le fil de discussion, tu peux utiliser JWT ou OAuth2. A noter ici que JWT est utilisé pour formater/crypter l'information de manière à ce que l'on puisse en vérifier l'intégrité, c'est à dire que les données inclus dans le payload du jWT (généralement les informations liés à l'utilisateur connecté) sont signés et ceci afin d'être certains que l'information échangé n'a pas été altéré. Je t'invite à aller jeter un œil un peu pour voir de quoi on parle réellement https://jwt.io/
A l'inverse, OAuth est un protocole d'autorisation, qui peut s'appuyer (ou pas) sur JWT pour générer ses tokens. Ou je bosse, c'est la solution que nous avons choisi en implémentant un serveur OAuth2 + JWT via lequel toutes nos autres API passent pour l'accès aux ressources protégées.
Dans notre cas OAuth est un choix et en aucun cas une obligation. Tu peux très bien implémenter un système d'authentification basé simplement sur JWT. La transmission du JWT se fait généralement via les en-têtes (Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ). Le client (application Angular par exemple) envoi le JWT sur chaque requête nécessitant une authentification.
Au niveau de ton API tu pourras du coup, pour chaque accès à une ressource protégé, vérifier ce token et autoriser l'accès ou non.
SSL
Lorsque l'on parle d'API REST, il faut garder à l'esprit que absolument toutes les requêtes doivent être encryptés (https). L'utilisation d'un protocole sécurisé permet de s'assurer que les données transmises n'aient pas été altérés durant le transport de la requête. Sur un protocole standard http, l'envoi par exemple de données sensibles comme un couple login/mot de passe est transmis en clair au serveur. Une attaque très connu appelé Man-in-the-middle (l'homme du milieu) permet de prendre avantage du protocole http en sniffant les communications entre 2 points et éventuellement les altérer ou simplement les récupérer.
Concernant la mise en place, je préconise 2 solutions:
- Pour les serveurs de test/recette: Implémentation du SSL avec Let's Encrypt (gratuit)
- Pour la production, implémentation du SSL via un tier de confiance (Autorité de certification) permettant de jouer un rôle d'authentification et assurer aux utilisateurs que le site sur lequel ils sont est bien celui qu'il prétend être (phishing).
CORS
Chaque navigateur implémente en son cœur une politique dite de same-origin (même origine) afin d'empêcher du code Javascript d'utiliser des ressources présentent sur une origine différente (par exemple, un domaine différent) de celle à partir de laquelle ces ressources ont été dé-servis.
CORS ou Cross-Origin Resource Sharing est une technique permettant d'autoriser du Javascript sur une page web à consommer les ressources d'une API REST dé-servis depuis une origine différente.
Pour faire simple, chaque requête contient dans ses en-têtes une Origin spécifiant l'origine du client depuis lequel la requête a été initiée. Le serveur considérera l'origine de la requête et autorisera ou refusera la demande. Si le serveur autorise la requête, il répondra avec la ressource demandée et inclura dans ses en-têtes l'entrée Access-Control-Allow-Origin. Cet en-tête indique au client quelles origines sont autorisées à accéder à la ressource. Si l'en-tête Access-Control-Allow-Origin correspond à Origin, le navigateur autorisera la requête.
A contrario, si Access-Control-Allow-Origin n'existe pas dans la réponse ou s'il ne correspond pas à Origin, le navigateur annulera la requête.
IMPORTANT: tu trouveras beaucoup d'exemple sur internet ou Access-Control-Allow-Origin a la valeur * (Access-Control-Allow-Origin: *). Ce n'est pas recommandé et dangeureux dans la mesure ou toutes origines sera du coup en mesure d'accèder aux ressources de ton serveur (néanmoins, si une ressource nécessite une authentification utilisateur, elle restera protégée)
Il y a d'autres points à prendre en compte et ça ne me dérange pas d'en discuter ici ou en privé, mais les 3 cités plus haut sont déjà un bon début.