web-dev-qa-db-fra.com

Déconnexion: GET ou POST?

Cette question ne concerne pas le moment d'utiliser GET ou POST en général; il s'agit de savoir lequel est recommandé pour gérer la déconnexion d'une application Web. J'ai trouvé de nombreuses informations sur les différences entre GET et POST au sens général, mais je n'ai pas trouvé de réponse définitive à 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 lien simple et vous avez terminé. Cela semble être le cas de la grande majorité des sites Web auxquels je peux penser, du moins du haut de ma tête. Même Stack Overflow gère la déconnexion avec GET.

Ce qui me fait hésiter, c’est l’argument (bien qu’ancien) que certains accélérateurs/proxys Web pré-cachent les pages en récupérant chaque lien trouvé dans la page, de sorte que l’utilisateur obtienne une réponse plus rapide quand il clique dessus. Je ne sais pas si cela s'applique toujours, mais si tel était le cas, un utilisateur disposant de l'un de ces accélérateurs serait théoriquement expulsé de l'application dès qu'elle se connectera, car son accélérateur trouverait et récupérerait la déconnexion. lien même si elle n'a jamais cliqué dessus.

Tout ce que j'ai lu jusqu'à présent suggère que POST devrait être utilisé pour des "actions destructives", alors que les actions qui ne modifient pas l'état interne de la requête semblable à une application et qui devraient être géré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?

373
Daniel Liuzzi

Utilisez POST.

En 2010, utiliser GET était probablement une réponse acceptable. Mais aujourd’hui (en 2013), les navigateurs vont pré-extraire des pages qu’ils "pensent" visiter.

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

Je voudrais remercier ma banque pour avoir déconnecté une demande GET, ainsi que l'équipe Chrome pour le préchargement d'URL pratique. Nick Craver ( @ Nick_Craver ) janvier 29 décembre 201

fait amusant: StackOverflow était utilisé pour gérer la déconnexion via GET, mais plus maintenant.

420
David Murdoch

Dans REST il ne devrait pas y avoir de session, donc il n'y a rien à détruire. Un client REST s'authentifie à chaque demande. Connecté ou déconnecté, c'est juste une illusion.

Ce que vous demandez réellement, c’est que le navigateur continue à envoyer les informations d’authentification à chaque demande.

On peut soutenir que si votre application crée l’illusion d’être connectée, vous devriez pouvoir "vous déconnecter" à l’aide de javascript. Aucun aller-retour requis.


Fielding Dissertation - Section 5.1.

chaque demande client-serveur doit contenir toutes les informations nécessaires à la compréhension de la demande et ne peut tirer parti d'aucun contexte stocké sur le serveur. L'état de la session est donc entièrement conservé sur le client

41
Darrel Miller

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

36
raveren

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

Utiliser [Host name]\bla bla\logout comme URL n’est pas vraiment un REST chemin complet (OMI), alors pourquoi débattre de l’utilisation correcte de GET/POST dessus?

Bien sûr, j'utilise également GET pour créer une URL de déconnexion dans mes applications :-)

19
VinayC

La déconnexion ne fait rien pour l'application elle-même. Cela change l'état de l'utilisateur par rapport à l'application. Dans ce cas, il semble que votre question porte davantage sur la manière dont la commande doit être lancée à partir de l'utilisateur pour lancer cette action. Comme il ne s'agit pas d'une "action destructive", bien que la session soit abandonnée ou détruite mais que ni votre application ni vos données ne soient altérées, il n'est pas impossible d'autoriser les deux méthodes à lancer une procédure de déconnexion. La publication doit être utilisée par toutes les actions initiées par l'utilisateur (par exemple - l'utilisateur clique sur "Déconnexion"), tandis que get peut être réservé pour les 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 une déconnexion GET ).

14
Joel Etherton

Bonjour, à mon point de vue, lorsque vous vous connectez, vérifiez le nom d'utilisateur/mot de passe et, le cas échéant, créez le jeton de connexion.

Jeton CREAT => méthode POST

Lorsque vous vous déconnectez, vous détruisez le jeton, donc la méthode la plus logique devrait être la méthode DELETE.

Jeton DELETE => méthode DELETE

11
miorey

Le scénario de pré-mise en cache est intéressant. Mais je suppose que si beaucoup de sites inc SO ne vous inquiétez pas pour cela, alors vous ne devriez peut-être pas non plus.

Ou peut-être que le lien pourrait être implémenté en javascript?

Edit: Si je comprends bien, techniquement, un GET devrait être destiné aux demandes en lecture seule, qui ne modifient pas l’état de l’application. Un POST devrait être destiné aux demandes d'écriture/édition qui changent d'état. Cependant, d’autres problèmes d’application pourraient préférer obtenir GET au lieu dePOST pour certaines requêtes de changement d’état, et je ne pense pas que cela pose problème.

1
Richard H