web-dev-qa-db-fra.com

Authentification de session vs authentification de jeton

J'essaie de comprendre certains termes et mécanismes et de découvrir comment ils sont liés les uns aux autres ou comment ils se chevauchent. L'authentification d'une application Web théorique et d'une application mobile est au centre de l'attention. L'accent est mis sur la différence exacte entre l'authentification basée sur les jetons et l'authentification basée sur les cookies et si/comment ils se croisent.

http basic/digest et les systèmes complexes comme oauth/aws auth ne m'intéressent pas

J'ai quelques affirmations que j'aimerais mettre en avant et voir si elles sont correctes.

  1. Seule l'utilisation de jetons d'authentification sans session est possible dans les applications mobiles. Dans un contexte de navigateur, vous avez besoin de cookies pour conserver les jetons côté client.
  2. Vous échangez vos informations d'identification (généralement nom d'utilisateur/pw) contre un jeton dont la portée et la durée peuvent être limitées. Mais cela signifie également que le jeton et tout ce qui le concerne doivent également être conservés et gérés par le serveur.
  3. Les jetons peuvent être révoqués côté serveur. Les cookies n'ont pas cette option et expireront/devraient expirer.
  4. L'utilisation de cookies signifie que l'ID de session est lié au compte d'utilisateur et n'est en aucune façon limité.

J'espère que je ne suis pas trop loin du but et je suis reconnaissant pour toute aide!

100
Hoax
  1. Dans Authentification basée sur la session le serveur fait tout le gros du côté serveur. D'une manière générale, un client s'authentifie avec ses informations d'identification et reçoit un session_id (qui peut être stocké dans un cookie) et l'attache à chaque demande sortante ultérieure. Cela pourrait donc être considéré comme un "jeton" car c'est l'équivalent d'un ensemble d'informations d'identification. Il n'y a cependant rien d'extraordinaire à ce sujet session_id chaîne. C'est juste un identifiant et le serveur fait tout le reste. C'est avec état. Il associe l'identifiant à un compte utilisateur (par exemple en mémoire ou dans une base de données). Il peut restreindre ou limiter cette session à certaines opérations ou à une certaine période et peut l'invalider en cas de problèmes de sécurité. Plus important encore, il peut faire et changer tout cela à la volée. De plus, il peut enregistrer chaque déplacement de l'utilisateur sur le (s) site (s) Internet. Les inconvénients possibles sont une mauvaise évolutivité (en particulier sur plusieurs batteries de serveurs) et une utilisation intensive de la mémoire.

  2. Dans Authentification basée sur les jetons aucune session n'est persistante côté serveur (sans état). Les étapes initiales sont les mêmes. Les informations d'identification sont échangées contre un jeton qui est ensuite joint à chaque demande ultérieure (il peut également être stocké dans un cookie). Cependant, dans le but de réduire l'utilisation de la mémoire, une évolutivité facile et une flexibilité totale (les jetons peuvent être échangés avec un autre client), une chaîne avec toutes les informations nécessaires est émise (le jeton) qui est vérifiée après chaque demande faite par le client au serveur. Il existe plusieurs façons d'utiliser/créer des jetons:

    1. Utiliser un mécanisme de hachage, par exemple HMAC-SHA1

      token = user_id|expiry_date|HMAC(user_id|expiry_date, k)
      

      user_id et expiry_date sont envoyés en texte brut avec le hachage résultant attaché (k n'est connu que du serveur).

    2. Chiffrement symétrique du jeton, par ex. avec AES

      token = AES(user_id|expiry_date, x)
      

      x représente la clé de cryptage/décryptage.

    3. Cryptage asymétrique, par ex. avec RSA

      token = RSA(user_id|expiry_date, private key)
      

Les systèmes de production sont généralement plus complexes que ces deux archétypes. Amazon utilise par exemple les deux mécanismes sur son site Web. Des hybrides peuvent également être utilisés pour émettre des jetons comme décrit en 2 et associer également une session utilisateur à celle-ci pour le suivi des utilisateurs ou la révocation éventuelle et conserver la flexibilité client des jetons classiques. OAuth 2.0 utilise des jetons de porteur spécifiques et de courte durée et des jetons de rafraîchissement de longue durée, par exemple pour obtenir des jetons de porteur.

Sources:

114
Hoax

HTTP est sans état, et pour avoir un état authentifié, vous avez besoin d'une sorte de jeton utilisé pour référencer les informations sur l'utilisateur. Cet identifiant de session se présente généralement sous la forme d'un jeton aléatoire envoyé en tant que valeur de cookie. Un OAuth jeton d'accès est utilisé pour identifier un utilisateur et le scope des ressources auxquelles l'utilisateur a accès. Dans les applications qui utilisent OAuth authentification unique, un OAuth jeton d'accès est généralement échangé contre un identifiant de session qui peut garder une trace d'une plus grande variété d'état utilisateur).

Du point de vue d'un attaquant, le détournement d'un identifiant de session, ou OAuth Token d'accès, est aussi bon qu'un nom d'utilisateur et un mot de passe, et parfois c'est encore mieux. Les ID de session doivent avoir une sécurité propriétés qui protègent les comptes utilisateurs contre les compromis.

Du point de vue du développeur, ne réinvente jamais la roue . Utilisez le gestionnaire de sessions fourni par votre plate-forme et assurez-vous qu'il est configuré pour se conformer aux OWASP Session Management Guidelines .

7
rook

Donc, sur l'authentification basée sur la session, pour augmenter la sécurité d'accès aux ressources dont l'une est requise:

  • Il doit être utilisé en remplacement des informations d'identification d'un utilisateur
  • Il doit toujours utiliser un cookie persistant
  • Il doit identifier les utilisateurs qui reviennent sur le site Web
  • Il doit utiliser une authentification à 2 facteurs
0
Mu Mor