Je construis une application Web et mon serveur Web est sécurisé, ce qui signifie qu’il utilise un certificat SSL avec l’interface frontale pour chiffrer la connexion.
Lorsqu'un utilisateur se connecte, un objet JSON semblable à celui-ci est créé et envoyé au serveur.
{
username:"the user's username",
password:"the user's password"
}
Sur le serveur, cela est vérifié avec un algorithme de hachage utilisant un sel. Une fois la vérification effectuée, un jeton api est créé. Il est valide pendant un certain temps et est passé dans l'en-tête afin de vérifier l'utilisateur lorsque des demandes sont en cours. L'envoi du nom d'utilisateur et du mot de passe est-il conforme à cette pratique exemplaire/sécurisé, ou vaut-il mieux l'envoyer dans l'en-tête?
Permet de le diviser en plusieurs points:
1) vous utilisez un certificat SSL valide pour sécuriser la communication entre l'utilisateur et le serveur (il doit être valide)
2) L'envoi du nom d'utilisateur et du mot de passe dans le corps de la demande POST est la meilleure pratique (n'utilisez jamais GET pour envoyer des informations sensibles telles que des informations d'identification).
3) L'envoi du jeton api dans les en-têtes de demande et de réponse HTTP est la meilleure pratique (n'utilisez jamais GET pour envoyer des informations sensibles telles que des jetons de session)
Donc, sur la base des points ci-dessus, il semble qu’il n’y ait aucun risque dans cette implémentation, mais vous devez tenir compte des points suivants dans votre examen:
1) Le délai d'attente du jeton de l'API doit être court en cas d'utilisateur inactif. (5 ~ 15 min sont les moyennes basées sur la criticité de l'application)
2) La longueur du jeton de l'API doit être longue. 30 ~ 40 caractères.
3) La génération de jetons d'API doit être aléatoire et il est difficile de prévoir contre laquelle protéger (attaques de prédiction de session.)
J'espère que cela vous aidera.
Ce que vous décrivez est fondamentalement Authentification de base HTTP .
L'envoi du nom d'utilisateur et du mot de passe est-il conforme à cette pratique exemplaire/sécurisé, ou vaut-il mieux l'envoyer dans l'en-tête?
Du point de vue de la sécurité, je ne peux pas penser à une grande différence si vous envoyez les informations d'identification dans le corps ou dans l'en-tête. Fondamentalement, quiconque parvient à lire le message en texte clair peut voir les informations d'identification dans les deux composants. La pratique courante lors de l'utilisation de l'authentification de base consiste à utiliser l'en-tête HTTP si:
Authorization: Basic VGVzdFVzZXI6UGFzc3dvcmQxMjM0
où VGVzdFVzZXI6UGFzc3dvcmQxMjM0
correspond à vos informations d'identification codées en base64. La chaîne décodée dans ce cas est: TestUser:Password1234
Il est important de réaliser que dans votre cas, le protocole TLS constitue la seule protection des informations d'identification en transit. Vous devez donc identifier tous les nœuds du canal de communication susceptibles d'exposer le message en clair. Par exemple, si vous utilisez des serveurs proxy pour terminer le protocole TLS, ceux-ci sont des vecteurs potentiels pour les attaques MITM.
Si vous souhaitez augmenter la sécurité des informations d'identification en transit, vous pouvez, par exemple, implémenter un cryptage asymétrique de bout en bout afin de chiffrer les informations d'identification avec une clé publique authentifiée côté client CA) puis déchiffrez-le à la destination avec la clé privée connue uniquement de votre serveur. Dans ce cas, vous ne devriez pas trop vous inquiéter de ce qu'il advient du message en transit.