Cette question a été abordée, sous une forme légèrement différente, à la longueur, ici:
Réparateur D'Authentification
Mais cette adresse à partir du serveur. Regardons du côté client. Avant de faire cela, cependant, il y a un prélude important:
Javascript Crypto est sans espoir
Matasano de l'article sur ce qui est connu, mais les leçons qui y sont contenues sont assez importants:
http://www.matasano.com/articles/javascript-cryptography/
Pour résumer:
- Un man-in-the-middle attack peut trivialement remplacer votre crypto code avec
<script>
function hash_algorithm(password){ lol_nope_send_it_to_me_instead(password); }</script>
- Un man-in-the-middle attack est trivial par rapport à une page qui sert toute ressource sur une connexion non-SSL.
- Une fois que vous avez SSL, vous êtes réel utilisant de la cryptographie, de toute façon.
Et pour ajouter un corollaire de mon propre:
- Succès d'une attaque XSS peut permettre à un attaquant d'exécuter du code sur votre navigateur du client, même si vous êtes à l'aide de SSL, de sorte que même si vous avez tous les hachures mis, votre navigateur crypto peut encore échouer si votre attaquant trouve un moyen d'exécuter du code javascript sur quelqu'un d'autre navigateur.
Cela rend beaucoup de RESTful schémas d'authentification impossible ou stupide si vous avez l'intention d'utiliser un client JavaScript. Voyons!
HTTP Basic Auth
D'abord et avant tout, HTTP Basic Auth. Le plus simple des régimes: il suffit de passer un nom et un mot de passe à chaque requête.
Ceci, bien sûr, nécessite absolument SSL, parce que vous êtes de passage en Base64 (réversible) codée nom et le mot de passe à chaque requête. Personne à l'écoute sur la ligne pourrait extraire nom d'utilisateur et le mot de passe de façon triviale. La plupart des "Basic Auth est d'insécurité" des arguments viennent d'un lieu de "Basic Auth sur HTTP" qui est une très mauvaise idée.
Le navigateur fournit au four-en HTTP Basic Auth soutien, mais qu'il est laid comme le péché, et vous ne devriez pas l'utiliser pour votre application. L'alternative, cependant, est de ranger les nom d'utilisateur et le mot de passe en JavaScript.
C'est la plus Reposante de la solution. Le serveur ne nécessite aucune connaissance de l'état que ce soit, et authentifie chaque individu interaction avec l'utilisateur. Un peu de REPOS amateurs (surtout strawmen) insistent pour que le maintien de toute sorte d'état est une hérésie et de l'écume à la bouche, si vous pensez à une autre méthode d'authentification. Il y a des avantages théoriques de cette sorte de respect des standards - il pris en charge par Apache hors de la boîte, vous pouvez stocker vos objets, comme des fichiers dans des dossiers protégés par .htaccess si votre cœur désirée!
Le problème? Vous êtes de la mise en cache côté client, un nom d'utilisateur et mot de passe. Cela donne evil.ru une meilleure fissure à elle - même la plus simple des vulnérabilités XSS pourrait donner lieu à une transmission de son nom d'utilisateur et mot de passe pour un mal de serveur. Vous pourriez essayer d'atténuer ce risque par le malaxage et le salage le mot de passe, mais n'oubliez pas de: JavaScript Crypto est sans espoir. Vous pourrait atténuer ce risque en laissant le Navigateur de Base de l'Auth soutien, mais.. laid comme le péché, comme mentionné précédemment.
HTTP Digest Auth
L'Authentification Digest w/ Jquery, est-il possible?
Un plus "secure" auth, c'est une demande/réponse de hachage défi. Sauf JavaScript Crypto est Désespéré, il ne fonctionne que sur SSL et vous avez encore de mettre en cache le nom d'utilisateur et mot de passe sur le côté client, le rendant plus compliqué que HTTP Basic Auth mais pas plus sécurisé.
Requête d'Authentification avec Signature Supplémentaire de Paramètres.
Un autre plus "sécurisé" auth, où vous chiffrer vos paramètres avec le nonce et les données de temps (pour protéger contre les récidivistes et les attaques temporelles) et envoyer le. L'un des meilleurs exemples est le OAuth 1.0, qui est, autant que je sache, une jolie stonking façon de mettre en œuvre l'authentification sur un serveur RESTE.
http://tools.ietf.org/html/rfc5849
Oh, mais il n'y a pas d'authentification OAuth 1.0 clients pour JavaScript. Pourquoi?
JavaScript Crypto est sans espoir, rappelez-vous. JavaScript ne peut pas participer à OAuth 1.0 sans SSL, et vous avez encore pour stocker le nom d'utilisateur du client et mot de passe local - ce qui la met dans la même catégorie que les Digérer Auth - c'est plus compliqué que HTTP Basic Auth mais c'est pas plus sécurisé.
Jeton
L'utilisateur envoie un nom d'utilisateur et le mot de passe, et reçoit en échange d'un jeton peut être utilisé pour les demandes d'authentification.
C'est un peu plus sécurisé que HTTP Basic Auth, parce que dès que le nom d'utilisateur/mot de passe de transaction est terminée, vous pouvez effacer les données sensibles. Il est également moins Reposante, comme des jetons de constituer un "état" et de faire de la mise en œuvre de serveur plus compliqué.
SSL Encore
Le hic, cependant, est que vous devez toujours vous envoyer initiale de nom d'utilisateur et le mot de passe pour obtenir un jeton. L'information sensible encore à toucher votre compromisable JavaScript.
Pour protéger vos informations d'identification utilisateur, vous devez tenir les attaquants de votre JavaScript, et vous avez encore besoin d'envoyer un nom d'utilisateur et mot de passe sur le fil. SSL Requis.
Jeton D'Expiration
Il est courant d'appliquer jeton politiques comme "hey, quand ce jeton a été autour trop long, il faut jeter et de faire de l'utilisateur de s'authentifier à nouveau." ou "je suis assez sûr que l'adresse IP uniquement autorisé à utiliser ce jeton est - XXX.XXX.XXX.XXX
". Nombre de ces politiques sont très bonnes idées.
Firesheeping
Cependant, l'utilisation d'un jeton Sans SSL est toujours vulnérable à une attaque appelée "sidejacking': http://codebutler.com/firesheep/
L'attaquant n'obtenez pas vos informations d'identification utilisateur, mais ils peuvent encore faire semblant d'être votre utilisateur, qui peut être assez mauvais.
tl;dr: Envoi non chiffrés jetons sur le fil signifie que les attaquants peuvent facilement nab ces jetons et faire semblant d'être votre utilisateur. FireSheep est un programme qui fait cela très facile.
Une Autre Zone Sécurisée
La plus grande de l'application que vous utilisez, plus il est difficile de garantir qu'ils ne seront pas en mesure d'injecter un peu de code qui change la façon dont vous traitez des données sensibles. Vous ne faites confiance à votre CA? Vos annonceurs? Votre propre code de base?
Commun pour les détails de carte de crédit, et moins pour le nom d'utilisateur et mot de passe - certains maîtres d'œuvre garder "données sensibles" sur une page séparée du reste de leur application, une page qui peut être étroitement contrôlé et verrouillé vers le bas autant que possible, de préférence une personne qui est difficile de phish utilisateurs.
Cookie (signifie simplement Jeton)
Il est possible (et fréquent) pour mettre le jeton d'authentification dans un cookie. Cela ne veut pas modifier les propriétés de auth avec le jeton, c'est plus pratique. Tous ces arguments s'appliquent toujours.
Session (toujours moyen de Jeton)
Session Auth est juste des jetons d'authentification, mais avec quelques différences qui le font ressembler à un peu autre chose:
- Les utilisateurs commencent avec un non authentifié jeton.
- Le backend maintient un "état" de l'objet, qui est lié à l'utilisateur d'un jeton.
- Le jeton est fourni dans un cookie.
- L'environnement de l'application des résumés les détails loin de vous.
A côté de cela, cependant, il n'est pas différent de Jeton d'Authentification, vraiment.
Ce erre encore plus loin d'une bonne mise en œuvre - de l'état des objets que vous allez plus loin et plus loin sur le chemin de la plaine ol' RPC sur une dynamique de serveur.
OAuth 2.0
OAuth 2.0 regarde le problème de "Comment fonctionne le Logiciel, Un donner Logiciel B l'accès à l'Utilisateur X données sans Logiciel B ayant accès à l'Utilisateur X les informations de connexion."
La mise en œuvre est très bien juste un moyen standard pour un utilisateur pour obtenir un jeton, puis pour un service tiers pour aller "oui, oui, c'utilisateur et ce jeton match, et vous pouvez obtenir certains de leurs données à partir de maintenant."
Fondamentalement, cependant, le protocole OAuth 2.0 est juste un jeton de protocole. Il présente les mêmes propriétés que les autres jeton protocoles - vous encore besoin de SSL pour protéger ces jetons - il change juste de la façon dont ces jetons sont générés.
Il existe deux façons d'OAuth 2.0 peut vous aider à:
- D'Authentification/de l'Information à d'Autres personnes
- L'obtention d'Authentification/de l'Information à partir d'Autres
Mais quand il descend à lui, vous êtes juste... à l'aide de jetons.
Pour revenir à ta question
Alors, la question que vous posez est "dois-je conserver mon jeton dans un cookie et de mon environnement automatique de la session de gestion de prendre soin des détails, ou dois-je conserver mon jeton en Javascript et de traiter les détails à moi-même?"
Et la réponse est: faites ce qui vous rend heureux.
La chose à propos de automatique de gestion de session, cependant, est qu'il y a beaucoup de magie qui se passe derrière les coulisses pour vous. Souvent, il est plus agréable d'être dans le contrôle de ces informations.
J'ai 21 si le protocole SSL est oui
L'autre réponse est: Utiliser le protocole https pour tout ou brigands vont voler de vos utilisateurs, mots de passe et des jetons.