226 votes

Pourquoi les jetons d'accès expirent-ils ?

Je commence tout juste à travailler avec Google API et OAuth2. Lorsque le client autorise mon application, on me donne un "jeton de rafraîchissement" et un "jeton d'accès" de courte durée. Maintenant, chaque fois que le jeton d'accès expire, je peux envoyer mon jeton d'actualisation à Google et ils me donneront un nouveau jeton d'accès.

Ma question est la suivante : à quoi sert l'expiration du jeton d'accès ? Pourquoi ne peut-il pas y avoir un jeton d'accès de longue durée au lieu d'un jeton de rafraîchissement ?

De plus, le jeton de rafraîchissement expire-t-il ?

Ver Utilisation d'OAuth 2.0 pour accéder aux API de Google pour plus d'informations sur le flux de travail de Google OAuth2.

240voto

Eran Hammer Points 2522

Ceci est très spécifique à la mise en œuvre, mais l'idée générale est de permettre aux fournisseurs d'émettre des jetons d'accès à court terme avec des jetons de rafraîchissement à long terme. Pourquoi ?

  • De nombreux fournisseurs proposent des jetons au porteur, dont la sécurité est très faible. En leur donnant une courte durée de vie et en exigeant un rafraîchissement, ils limitent le temps pendant lequel un attaquant peut abuser d'un jeton volé.
  • Les déploiements à grande échelle ne veulent pas effectuer une recherche dans une base de données à chaque appel d'API. Ils émettent donc des jetons d'accès auto-codés qui peuvent être vérifiés par décryptage. Cependant, cela signifie également qu'il n'y a aucun moyen de révoquer ces jetons. Ils sont donc émis pour une courte durée et doivent être rafraîchis.
  • Le jeton de rafraîchissement nécessite une authentification du client, ce qui le rend plus solide. Contrairement aux jetons d'accès ci-dessus, il est généralement mis en œuvre avec une consultation de base de données.

4 votes

Deux questions : 1) Dans le cas des applications mobiles, l'exigence d'une authentification du client la rend-elle plus forte ? Parce que le client_secret fait partie du code source de l'application, il n'est donc pas du tout secret. En supposant que le jeton d'accès soit également partagé uniquement via TLS (et que votre premier point ne s'applique pas), y a-t-il une sécurité supplémentaire ? 2) En supposant que tout cela soit valable dans notre scénario (uniquement TLS, pas de jetons non révocables auto-codés), est-il possible d'émettre des jetons d'accès qui n'expirent pas ?

4 votes

Qu'est-ce qu'un jeton porteur, et quel est son rapport avec les jetons de rafraîchissement et d'accès ?

8 votes

Thilo : Je pense que l'idée est que les jetons d'accès ne doivent pas être révocables. Comme Eran le souligne, cela permet au service demandé de décider s'il doit répondre à une demande sans avoir à rechercher le jeton d'accès dans une base de données. AFAICT, c'est le véritable avantage de la séparation des jetons de rafraîchissement et des jetons d'accès.

36voto

Ed Sykes Points 409

Quelques scénarios peuvent aider à illustrer le but des jetons d'accès et de rafraîchissement et les compromis techniques dans la conception d'un système oauth2 (ou tout autre système d'authentification) :

Scénario d'application Web

Dans le scénario de l'application web, vous avez plusieurs options :

  1. si vous avez votre propre gestion de session, stockez à la fois l'access_token et le refresh_token en fonction de votre identifiant de session dans session state sur votre service session state. Lorsqu'une page est demandée par l'utilisateur qui vous demande d'accéder à la ressource, utilisez l'access_token et si l'access_token a expiré, utilisez le refresh_token pour obtenir le nouveau.

Imaginons que quelqu'un réussisse à détourner votre session. La seule chose qui soit possible est de demander vos pages.

  1. si vous ne disposez pas d'une gestion de session, mettez la clé d'accès dans un cookie et utilisez-le comme session. Ensuite, chaque fois que l'utilisateur demande des pages à votre serveur web, il envoie l'access_token. Votre serveur d'applications peut rafraîchir l'access_token si nécessaire.

Comparaison entre 1 et 2 :

En 1, access_token et refresh_token ne voyagent que sur le fil entre le serveur d'autorisation (google dans votre cas) et votre serveur d'application. Cela se fait sur un canal sécurisé. Un pirate pourrait détourner la session, mais il ne pourrait interagir qu'avec votre application Web. En 2, le pirate pourrait s'emparer de l'access_token et formuler ses propres demandes aux ressources auxquelles l'utilisateur a donné accès. Même si le pirate met la main sur le code d'accès, il ne disposera que d'une courte fenêtre pour accéder aux ressources.

Dans tous les cas, le refresh_token et le clientid/secret ne sont connus que du serveur, ce qui rend impossible l'obtention d'un accès à long terme à partir du navigateur Web.

Imaginons que vous implémentez oauth2 et que vous définissiez un long délai d'attente pour le jeton d'accès :

En 1) Il n'y a pas beaucoup de différence ici entre un jeton d'accès court et long puisqu'il est caché dans le serveur d'application. En 2) quelqu'un pourrait obtenir le jeton d'accès dans le navigateur et ensuite l'utiliser pour accéder directement aux ressources de l'utilisateur pendant une longue période.

Scénario mobile

Sur le mobile, il y a deux scénarios que je connais :

  1. Stockez le clientid/secret sur le dispositif et faites en sorte que le dispositif orchestre l'obtention de l'accès aux ressources de l'utilisateur.

  2. Utilisez un serveur d'applications dorsal pour contenir le client/secret et laissez-le faire l'orchestration. Utilisez l'access_token comme une sorte de clé de session et faites-la passer entre le client et le serveur d'applications.

Comparaison entre 1 et 2

En 1) Une fois que vous avez le clientid/secret sur le dispositif, ils ne sont plus secrets. N'importe qui peut décompiler et ensuite commencer à agir comme s'il était vous, avec la permission de l'utilisateur bien sûr. L'access_token et le refresh_token sont également en mémoire et pourraient être accessibles sur un appareil compromis, ce qui signifie que quelqu'un pourrait agir comme votre application sans que l'utilisateur donne ses informations d'identification. Dans ce scénario, la longueur de l'access_token ne fait aucune différence pour le piratage puisque le refresh_token se trouve au même endroit que l'access_token. Dans 2) le clientid/secret et le refresh_token sont compromis. Dans ce cas, la durée d'expiration de l'access_token détermine combien de temps un pirate peut accéder aux ressources de l'utilisateur, s'il s'en empare.

Durées d'expiration

La durée d'expiration de votre code d'accès dépend de ce que vous sécurisez avec votre système d'authentification. S'il s'agit de quelque chose de particulièrement précieux pour l'utilisateur, elle doit être courte. S'il s'agit de quelque chose de moins précieux, elle peut être plus longue.

Certaines personnes comme Google n'expirent pas le refresh_token. D'autres, comme stackflow, le font. La décision sur l'expiration est un compromis entre la facilité d'utilisation et la sécurité. La durée du jeton de rafraîchissement est liée à la durée de retour de l'utilisateur, c'est-à-dire que le rafraîchissement doit correspondre à la fréquence de retour de l'utilisateur sur votre application. Si le jeton de rafraîchissement n'expire pas, la seule façon de le révoquer est de le révoquer explicitement. Normalement, une connexion ne peut pas être révoquée.

J'espère que cet article assez long vous sera utile.

0 votes

Pour le SCENARIO MOBILE, il importe peu que vous stockiez l'identifiant du client sur votre serveur. Ainsi, n'importe quelle autre application peut envoyer une requête à votre serveur et accéder aux ressources de l'utilisateur par le biais de votre serveur.

0 votes

Vrai, mais ils n'ont alors accès qu'aux facilités que vous fournissez, plutôt qu'un accès complet au jeton sous-jacent. En d'autres termes, ils peuvent se faire passer pour votre application. Souvent, les jetons peuvent avoir des autorisations étendues, alors que vous n'avez besoin que d'un sous-ensemble. Le fait de conserver le jeton dans le backend permet de restreindre davantage l'accès, si nécessaire.

12voto

Guillaume Points 2812

En plus des autres réponses :

Une fois obtenus, les jetons d'accès sont généralement envoyés avec chaque demande des clients aux serveurs de ressources protégés. Cela induit un risque de vol et de relecture des jetons d'accès (en supposant bien sûr que les jetons d'accès sont de type "Bearer" (comme défini dans la RFC6750 initiale).

Des exemples de ces risques, dans la vie réelle :

  • Les serveurs de ressources sont généralement des serveurs d'applications distribués et présentent généralement des niveaux de sécurité inférieurs à ceux des serveurs d'autorisation (configuration SSL/TLS inférieure, renforcement moindre, etc.) Les serveurs d'autorisation, quant à eux, sont généralement considérés comme des infrastructures de sécurité critiques et sont soumis à un renforcement plus important.

  • Les jetons d'accès peuvent apparaître dans les traces HTTP, les journaux, etc. qui sont collectés légitimement à des fins de diagnostic sur les serveurs de ressources ou les clients. Ces traces peuvent être échangées dans des lieux publics ou semi-publics (traceurs de bogues, service-desk, etc.).

  • Les applications dorsales de RS peuvent être confiées à des tiers plus ou moins dignes de confiance.

Le jeton de rafraîchissement, quant à lui, est généralement transmis uniquement deux fois sur les fils, et toujours entre le client et le serveur d'autorisation : une fois lorsqu'il est obtenu par le client, et une fois lorsqu'il est utilisé par le client pendant l'actualisation (ce qui a pour effet d'"expirer" le jeton d'actualisation précédent). Il s'agit d'un radicalement possibilité limitée d'interception et de relecture.

Enfin, les jetons Refresh offrent très peu de protection, voire aucune, contre les clients compromis.

0 votes

Vous avez quelque peu abordé ce sujet, mais j'insiste sur le fait que la surface d'attaque la plus importante pour obtenir (ou inversement divulguer par inadvertance) des jetons se trouve dans les journaux d'application ou les services de ressources ajoutés par malveillance (ce qui n'est pas une attaque MITM aujourd'hui). À peu près tout ce qui se trouve dans un backend d'API commun a accès au jeton d'accès utilisé (s'il a accès à l'objet HttpRequest, etc.). Seuls DEUX chemins de code dans le système ont accès au jeton de rafraîchissement - celui qui le génère en premier lieu, et celui qui l'échange contre un nouveau jeton d'accès. Il s'agit d'une différence significative en termes de surface d'attaque.

9voto

Claudio Cherubino Points 10519

Il s'agit essentiellement d'une mesure de sécurité. Si votre application est compromise, l'attaquant n'aura accès qu'au jeton d'accès de courte durée et n'aura aucun moyen d'en générer un nouveau.

Les jetons de rafraîchissement expirent également, mais ils sont censés vivre beaucoup plus longtemps que le jeton d'accès.

48 votes

Mais l'attaquant n'aurait-il pas également accès au jeton de rafraîchissement ? et pourrait-il l'utiliser pour créer un nouveau jeton d'accès ?

1 votes

Vous n'envoyez que le jeton d'accès avec vos demandes, de sorte qu'un attaquant ne pourra capturer que cela. S'il obtient votre jeton de rafraîchissement, vous pouvez toujours le révoquer.

10 votes

@levi, le pirate ne peut pas utiliser le jeton de rafraîchissement pour créer un nouveau jeton d'accès car l'ID et le secret du client sont nécessaires avec le jeton de rafraîchissement pour générer le nouveau jeton d'accès.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X