549 votes

Déconnexion : GET ou POST ?

Cette question ne porte pas sur le moment où il faut utiliser GET ou POST en général ; il s'agit de savoir quelle est la solution recommandée pour gérer la déconnexion d'une application web. J'ai trouvé beaucoup d'informations sur les différences entre GET et POST au sens général, mais je n'ai pas trouvé de réponse précise pour ce scénario particulier.

En tant que pragmatique, je suis enclin à utiliser GET, car sa mise en œuvre est beaucoup plus simple que POST ; il suffit de déposer un simple lien et le tour est joué. Cela semble être le cas pour la grande majorité des sites web auxquels je pense, du moins pour ce qui me vient à l'esprit. Même Stack Overflow gère la déconnexion avec GET.

Ce qui me fait hésiter, c'est l'argument (certes ancien) selon lequel certains accélérateurs/proxies web pré-cachent les pages en allant récupérer tous les liens qu'ils trouvent dans la page, afin que l'utilisateur obtienne une réponse plus rapide lorsqu'il clique dessus. Je ne sais pas si c'est toujours d'actualité, mais si c'était le cas, alors en théorie un utilisateur avec un de ces accélérateurs serait expulsé de l'application dès qu'il se connecterait, parce que son accélérateur trouverait et récupérerait le lien de déconnexion même s'il n'a jamais cliqué dessus.

Tout ce que j'ai lu jusqu'à présent suggère que POST doit être utilisé pour les "actions destructives", tandis que les actions qui ne modifient pas l'état interne de l'application - comme les requêtes et autres - doivent être traitées avec GET. . Sur cette base, la vraie question est la suivante :

La déconnexion d'une application est-elle considérée comme une action destructive / modifie-t-elle l'état interne de l'application ?

0 votes

En supposant que vous visitez le site pour la première fois et que le lien de déconnexion n'est pas présent, vous serez déconnecté lors de votre connexion. Tout irait bien si vous vous connectiez une deuxième fois, puisque l'URL de déconnexion est déjà en mémoire cache. Mais on peut supposer que tout accélérateur décent serait capable de filtrer la plupart des url de déconnexion.

2 votes

HyperCas, les accélérateurs filtrant les URL de déconnexion était une théorie que j'envisageais et l'une des raisons pour lesquelles j'ai décidé de poster la question. Je suis un peu réticent à l'idée de faire confiance à la logique des accélérateurs et de voir un jour un utilisateur équipé d'un accélérateur de mauvaise qualité se plaindre qu'il ne peut pas se connecter. Savez-vous s'ils suivent une norme, ou si une telle norme existe ?

0 votes

Tout accélérateur qui soumet automatiquement un formulaire (par exemple) serait un malware IMO... il est totalement illogique de penser qu'un accélérateur soumettrait un formulaire automatiquement. Imaginez que vous visitez Google. Comment pourrait-il soumettre le formulaire de recherche ? Personne ne peut rendre compte des malwares car ils sont trop imprévisibles et ne suivent pas les règles.

607voto

David Murdoch Points 28521

Utilisez POST .

En 2010, l'utilisation de GET était probablement une réponse acceptable. Mais aujourd'hui (en 2013), les navigateurs vont précharger les pages qu'ils "pensent" que vous allez visiter ensuite.

Voici l'un des développeurs de StackOverflow qui parle de ce problème sur Twitter :

J'aimerais remercier ma banque pour avoir fait de la déconnexion une requête GET, et l'équipe de Chrome pour la préextraction d'URL pratique - Nick Craver ( @Nick_Craver ) 29 janvier 2013

Fait amusant : StackOverflow avait l'habitude de gérer la déconnexion via GET, mais plus maintenant.

3 votes

Merci pour cette mise à jour, Dave. Je n'avais même pas remarqué que SO avait changé sa déconnexion en POST, et honnêtement, je ne savais pas que Chrome était équipé d'une fonction de préchargement intégrée. Enfin, l'idiot que tu as cité n'aurait jamais pu offrir un meilleur exemple du problème que j'ai décrit dans ma question et confirme mes soupçons. Je vote en faveur de votre réponse et en fait la réponse acceptée.

4 votes

In my browser, Stackoverflow logout looks like <li><a href="http://stackoverflow.com/users/logout">log out</a></li> which is a GET, not a POST

10 votes

@Mark0978, cliquez sur le lien.

52voto

Darrel Miller Points 56797

Dans REST, il ne devrait pas y avoir de session, donc il n'y a rien à détruire. Un client REST s'authentifie à chaque requête. Connecté ou non, ce n'est qu'une illusion.

Ce que vous demandez en réalité, c'est si le navigateur doit continuer à envoyer les informations d'authentification à chaque demande.

Si votre application crée l'illusion d'une connexion, vous devriez être en mesure de vous déconnecter en utilisant le javascript. Aucun aller-retour n'est nécessaire.


Dissertation Fielding - Section 5.1.3

chaque demande du client au serveur doit contenir toutes les informations nécessaires à la compréhension de la demande, et ne peut pas profiter d'une quelconque contexte stocké sur le serveur. La session est donc entièrement conservé sur le le client

1 votes

En fait, je n'étais pas au courant de cela. Dans ce cas, je suppose que mon application ne sera pas du tout RESTful, car j'utilise ASP.NET MVC avec FormsAuthentication et elle repose sur des sessions...

0 votes

@Daniel J'ai ajouté la section pertinente de la définition de REST.

29 votes

Mais dans la pratique, les informations de connexion sont conservées dans un cookie marqué de l'icône httponly pour éviter certains risques xss, ce qui signifie qu'il ne peut être réinitialisé qu'à partir du serveur (sans effacer manuellement le cookie).

42voto

Raveren Points 4772

Une façon GET pourrait être abusé ici est qu'une personne (un concurrent peut-être :) a placé une balise image avec src="<your logout link>" N'IMPORTE OÙ sur Internet, et si un utilisateur de votre site tombe sur cette page, il sera déconnecté sans le savoir.

5 votes

Non, ce n'est pas bien. Un lien de déconnexion ne fonctionnera que si les données correctes du cookie sont envoyées, ce qui ne sera pas le cas d'un autre domaine. Et même si l'identifiant de session est stocké dans l'url, cela ne fonctionnera pas non plus car il change à chaque session.

5 votes

Wow, je n'ai jamais pensé à ça ! Voilà donc une autre raison de ne pas utiliser GET, et une autre raison pour laquelle je ne comprends pas pourquoi tout le monde le fait. Bon sang, maintenant je suis tenté d'inclure un fichier stackoverflow.com/users/logout "image" aussi mon post et voir ce qui se passe :-D

0 votes

@Richard - C'est logique, mais le problème se poserait pour les sites communautaires tels que SO, non ? Le domaine serait le même dans ce cas.

23voto

VinayC Points 23947

Pour être correct, GET/POST (ou d'autres verbes) sont des actions sur une ressource (adressée par URL) - donc il s'agit généralement de l'état de la ressource et non de l'état de l'application en tant que telle. Donc, dans l'esprit, vous devriez avoir une URL telle que [host name]\[user name]\session alors "DELETE" serait le verbe correct pour l'action de déconnexion.

Utilisation de [host name]\bla bla\logout comme l'URL n'est pas vraiment un moyen REST complet (IMO), alors pourquoi débattre de l'utilisation correcte de GET/POST sur elle ?

Bien sûr, j'utilise aussi le GET vers une url de déconnexion dans mes applications :-)

2 votes

Dans ce cas, je dirais que la partie [nom de l'utilisateur] de l'URL semble inutile, car les utilisateurs se déconnectent toujours de (i.e. DELETE) leur propre jamais celle des autres utilisateurs :-)

2 votes

Pas vraiment - nous disons que la session est une ressource et que nous voulons la supprimer. Donc pour adresser uniformément n'importe quelle session, vous devez avoir le nom de l'utilisateur comme partie de l'URL. Votre argument est aussi valable que de dire qu'il faut lancer une action PUT sur [galerie de photos]. \pictures signifie que vous ajoutez à vos photos (disponibles sur [galerie photo]\[nom d'utilisateur]). \pictures ). Les différentes ressources doivent être abordées de manière explicite, il ne peut y avoir d'implicite. Le site peut permettre à d'autres utilisateurs d'ajouter des photos à votre galerie - cela ferait partie du contrôle d'accès, tout comme vous pouvez avoir un super utilisateur qui peut tuer les sessions de n'importe qui.

1 votes

D'un point de vue philosophique, on pourrait appeler les sessions et les photos des "ressources", mais d'un point de vue réaliste, je ne les traiterais pas de la même manière. Les sessions sont toujours intrinsèquement limitées à l'utilisateur actuel (d'où le nom de session) et, au moins dans ASP.NET, il n'existe aucun moyen d'accéder aux sessions d'un autre utilisateur. Même le développeur de l'application n'a aucun moyen direct d'énumérer toutes les sessions actives, ni aucun moyen de tuer les sessions individuellement. Vous pouvez relancer l'application pour tuer toutes les sessions (InProc), mais je n'appellerais pas cela un contrôle d'accès. Les URLs mises à part, la question reste posée : GET ou POST ?

17voto

Joel Etherton Points 24155

La déconnexion n'a aucun effet sur l'application elle-même. Elle modifie l'état de l'utilisateur par rapport à l'application. Dans ce cas, il semble que votre question soit plutôt basée sur la manière dont l'utilisateur doit lancer la commande pour commencer cette action. Puisqu'il ne s'agit pas d'une "action destructive", c'est-à-dire que la session est abandonnée ou détruite mais que ni votre application ni vos données ne sont altérées, il n'est pas infaisable de permettre aux deux méthodes de lancer une procédure de déconnexion. La méthode post devrait être utilisée par toute action initiée par l'utilisateur (par exemple, l'utilisateur clique sur "Log out"), tandis que la méthode get pourrait être réservée aux déconnexions initiées par l'application (par exemple, une exception détectant une intrusion potentielle de l'utilisateur redirige de force vers la page de connexion avec un GET de déconnexion).

0 votes

Intéressant ; je n'y avais jamais pensé de cette façon. +1.

0 votes

Il est concevable que cela dépende de l'application (une sorte de comportement de "suppression en cascade"), mais vous avez raison.

0 votes

@JoelEtherton Merci Joel, je lisais les réponses en me demandant quand j'arriverais à la bonne. :)

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