2013-06-08 30 views
65

トークン認証とCookieを使用した認証の違いは何ですか?トークン認証とCookie

私はEmber Auth Rails Demoを実装しようとしていますが、「なぜトークン認証なのか」という質問のEmber Auth FAQに記載されているように、トークン認証を使用する理由はわかりません。それは要求/応答ネイチャーズのため

+1

トークンは、モバイルアプリに与えられ、後で使用するために変数に保存することができます。また、ブラウザでJavaScriptを使用してSPAリクエストで使用するために保存することもできます。 Cookieは一般的に(ブラウザによって)ブラウザで使用されます。 –

+0

2016年に書かれた記事https://auth0.com/blog/cookies-vs-tokens-definitive-guide/を参照してください。 –

答えて

19

典型的なWEPアプリは、主にステートレスです。 HTTPプロトコルは、ステートレスプロトコルの最良の例です。しかし、ほとんどのWebアプリケーションはの状態を必要とするので、サーバーとクライアントの間での状態を保持するために、サーバーがすべての応答をクライアントに返信できるようにクッキーが使用されます。つまり、クライアントからの次の要求にはこのCookieが含まれ、サーバーによって認識されます。このようにしてサーバーはセッションステートレスのクライアントに保ち、アプリケーションの状態に関するすべてを知っていますが、サーバーに保存します。このシナリオでは、クライアントがの状態を保持することはありません。これはEmber.jsの動作ではありません。

Ember.jsではさまざまなものがあります。それはあなたのために実際に状態を保持しているためEmber.jsは、それが状態データを求めてサーバーに要求を加えることなく状態だについてすべての瞬間で知って、クライアントでは、より簡単に、プログラマの仕事になります。

しかし、また単にステートレス状況には存在しない同時実行の問題を導入することができ、クライアントに状態を保持しています。 Ember.jsはこの問題も扱っています。具体的にはember-dataはこれを念頭に置いて作成されています。結論として、Ember.jsはステートフルクライアント用に設計されたフレームワークです。

Ember.jsはセッション状態と対応するクッキーがサーバによってほぼ完全に処理される典型的なステートレスウェブアプリのように動作しません。 Ember.jsは、の状態を完全にjavascript(クライアントのメモリ内にあり、他のフレームワークのようにDOMではなく)に保持しているため、サーバーをセッション管理する必要はありません。これによりEmber.jsは多くの状況でより汎用性が高まります。あなたのアプリがオフラインモードのとき

それは トークンまたは 要求がようにするために作られて毎回サーバーに送信するためのユニークなキーは、サーバが送信トークンを検索することができますこの方法をを認証済みのいくつかの種類を必要とし、セキュリティ上の理由から明らかに

(サーバーによって最初に発行されたもの)を検証し、クライアントに応答を返す前に有効かどうかを確認します。私の意見で

主な理由Ember.jsフレームワークの性質のものであり、またそれがステートフル Webアプリケーションのパラダイムと、よりフィットするのでEmber Auth FAQに述べたように、認証トークンの代わりに、クッキーを使用する主な理由。したがって、Ember.jsアプリケーションを構築する際のクッキーメカニズムは最良の方法ではありません。

私の答えがあなたの質問にもっと意味を与えることを望みます。

+51

トークンがクッキーより優れている/違う理由はまだ分かりません。あなたは、有効なセッションを識別する何かをapiサーバに送信しています。単一ドメイン上ですべてを実行していると仮定します(そして、エバーとあなたのAPIが異なるサーバー上にあっても、これを達成するために必要なのはCDNの背後で実行されますが、とにかく実行する必要があります)余分なセットアップ作業とタイミング攻撃に対する余計な脆弱性? –

+23

マイケル・ジョンストンとの合意。この回答はトークンベースの認証が何であるかを説明していますが、実際にはその質問に答えなかったものです。私が見ることができる最も関連性のある情報は最後のビットです_ "ember.jsフレームワークの性質のため、またステートフルなWebアプリケーションのパラダイムに合っているからです" _しかし、それはまったく答えではありません。私は同じ質問があります。 – Daniel

+4

私はここのコメントに同意します...実際には、私は全体的に "魔法のようです"と感じています。 – Grapho

8

私はここにいくつかの混乱があると信じています。 Cookieベースの認証と現在HTML5 Web Storageで可能なこととの間の重要な違いは、Cookieデータを設定するドメインからのリソースを要求するたびにCookieデータを送信するようにブラウザが構築されていることです。クッキーをオフにすることなく、それを防ぐことはできません。ブラウザは、ページ内のコードがを送信しない限り、Web Storageからデータを送信しません。また、ページは保存したデータにのみアクセスでき、他のページに保存されているデータにはアクセスできません。

ユーザーは、CookieデータがGoogleまたはFacebookによって使用される方法を心配し、Cookieを無効にする可能性があります。しかし、Web Storageをオフにする理由は少ない(広告主がそれを使用する方法を理解するまで)。

これはCookieベースとトークンベースの違いです。後者はWeb Storageを使用します。

30
  • トークンが

  • トークンがクッキーのように有効期限が切れることはできますが、より多くの制御

  • ストレージが動作しませんローカル/セッションを持っている(ローカル/セッションストレージやクッキー)どこかに保存する必要がありますドメイン間で、マーカーのクッキーを使用し

  • プリフライトリクエストは各CORS要求

  • に送信されます

    あなたは、何かをストリーミングすることはトークンがリクエストごとに送られますXSRF

  • よりXSSに対処する方が簡単です署名要求

  • を取得するためにトークンを使用し、そのサイズ

  • を注意する必要がありますあなたは、機密情報を格納し

    場合は、トークン

  • JSONウェブトークンはOAuthの

    で使用することができ
  • トークンの暗号化銀のない弾丸再、あなたの承認のユースケースを考えるトークンベースの認証はステートレスで慎重

http://blog.auth0.com/2014/01/27/ten-things-you-should-know-about-tokens-and-cookies/

http://blog.auth0.com/2014/01/07/angularjs-authentication-with-cookies-vs-token/

+7

あなたのポイントがクッキーまたはトークンであるかどうかは不明です。 – Pureferret

+4

なぜ私はあなたがクッキーよりもトークンを「制御する」ことが理解できません。 – Aaron

+0

@onsmith私が理解しているところでは、ここに一つ以上の箇条書きがあります。まず、リクエストごとにCookieが送信されます。送信トークンは、JavaScriptコードによってトリガーされます。それらは自動的に送信されません。また、[rfc section 4](https://tools.ietf.org/html/rfc7519#page-8)によると、JWTは当事者間でのセキュリティ要求の転送に使用されるコンテナとして設計されているようです。より詳細な制御を提供するとともに、サードパーティの認証トークンを生成して、あなたの代わりに使用できるようにするアクセス許可のセットを提供します。 – FullStackForger

3

、サーバは、セッション中にユーザー情報を保存する必要はありません。これにより、ユーザーがどこにログインしているか心配することなくアプリケーションを拡張できるようになります。クッキーベースのWebサーバーフレームワークの親和性は、トークンベースの問題ではありません。したがって、別のuid/pwd認証を避けるために、同じトークンを使用して、ログインしているドメイン以外のドメインから安全なリソースを取得することができます。

ここに非常に良い記事:

http://www.toptal.com/web/cookie-free-authentication-with-json-web-tokens-an-example-in-laravel-and-angularjs

112

HTTPはステートレスでは、あなたを承認するためには、あなたがサーバーに送っているすべての単一の要求を「署名」しなければなりません。

サーバへの要求が「トークン」によって署名され

  • トークン認証 - しかし、彼らは、HTTPリクエスト(POST体、等の任意の部分に送信することができ、通常、それが特定のHTTPヘッダを設定する手段、 )

  • 長所:

    • あなたが(クッキーを承認したいだけの要求認可することができます - でも、許可を(XSRFの短い例 - <img src="http://bank.com?withdraw=1000&to=myself" />のような電子メールのリンクを送ってきます。また、cookie認証を使ってbank.comと銀行にログインしている場合) .comにはXSRFの保護手段がありません。あなたのブラウザがそのURLに対して許可されたGET要求をトリガーするということだけで、アカウントから資金を引き出すことになります。 Cookieベースの認証で行うことができる反偽造対策があることに注意してください。しかし、それらを実装する必要があります。
    • Cookieは単一のドメインにバインドされています。ドメインfoo.comで作成されたクッキーは、ドメインbar.comで読み取ることはできませんが、好きなドメインにトークンを送信することはできます。これは、承認が必要な複数のサービスを使用している単一ページのアプリケーションに特に便利です。myapp.com1とmyservice2.comに対して許可されたクライアント側のリクエストを行うmyapp.comドメインのWebアプリケーションを使用できます。
  • 短所:あなたはどこかのトークン格納する必要が
    • 。あなたがブラウザーウィンドウを閉じた後でトークンは破棄されます:conStore:あなたがブラウザウィンドウを閉じた後でもトークンは永続化されます)新しいタブでリンクを開くとそのタブが匿名で表示されます)とCookie(プロセッションクッキーを使用する場合はブラウザウィンドウを閉じた後にトークンが破棄され、新しいタブでリンクを開くと認証され、あなたが認証のためにクッキーを無視しているので、XSRFから免除されています。トークンストレージとして使用するだけです。con:クッキーはすべてのリクエストに対して送信されます。このクッキーがhttpsとしてマークされていない場合、攻撃の場合)
    • トークンベースの認証に対してXSS攻撃を行う方が少し簡単です(つまり、自分のサイトで注入スクリプトを実行できる場合は、トークンを盗むことができますが、Cookieベースの認証は銀色ではありませんクライアントがhttp-onlyとマークされたクッキーを読み取ることはできませんが、クライアントは依然として認証クッキーを自動的に含むリクエストを行うことができます)
    • 動作するはずのファイルをダウンロードするリクエスト許可されたユーザーのみがFile APIを使用する必要があります。 :同じ要求は、サーバーへのリクエストは、常に、認可クッキーによって
    • 長所で署名されている

クッキー認証

  • クッキーベースの認証のために箱から出して動作します
    • Cookieは「http-only」とマークすることができます。これにより、クライアント側での読み取りが不可能になります。もしそうなら(単一ドメインに結合
      • : - 彼は
      • が箱から出てくるXSS攻撃防御のための優れているあなたは、クライアント側で任意のコード
    • 短所を実装する必要はありません
    • XSRFに脆弱であるため、サイトをクロスサイトリクエスト偽装から保護するために余分な対策を講ずる必要があります。
    • が送信されています毎シーズンごとに(でも、認証を必要としない要求用)ngle要求が、欠点は、あなたが非常にしなければならない、私は(あなたが1つのドメインにバインドされていない)トークンがあなたに、より良い柔軟性を与えると言うだろう全体

ある自分でコーディングする

+10

この答えは、受け入れられたものよりも正式な答えにはるかに近い。 –

+2

ありがとう@ ondrej-svejdar。これは最高の答えです!私は「かなりのコーディング」部分だけを主張するだろう。ほとんどすべての言語で利用できるライブラリが数多くあります。したがって、JWTの実装の仕組みを本当に知りたい場合を除いて、最初から始める必要はありません。 – FullStackForger

+2

'すべての単一の要求に対して送信されます。 '要求ごとにトークンが送信されます –