Cookieベースの認証はどのように機能しますか?


210

誰かがCookieベースの認証がどのように機能するかを段階的に説明してくれますか?私は、認証やCookieを含むことをしたことがありません。ブラウザは何をする必要がありますか?サーバーは何をする必要がありますか?どんな順番で?物事を安全に保つにはどうすればよいですか?

私はさまざまな種類の認証とCookieについて読んでいますが、2つを一緒に使用する方法の基本的な説明が欲しいのですが、それらはしばしば一緒に使用されることだけを読みましたが、方法の説明が見つかりませんでした。


回答:


162

Cookieは、基本的には辞書内の単なるアイテムです。各アイテムにはキーと値があります。認証の場合、キーは「username」のようなもので、値はユーザー名になります。Webサイトへのリクエストを行うたびに、ブラウザはリクエストにCookieを含め、ホストサーバーはCookieをチェックします。したがって、認証はそのように自動的に行うことができます。

クッキーを設定するには、リクエストの後でサーバーが送り返す応答にクッキーを追加する必要があります。その後、ブラウザは応答を受信するとCookieを追加します。

有効期限や暗号化など、Cookieサーバー側に設定できるさまざまなオプションがあります。暗号化されたCookieは、しばしば署名付きCookieと呼ばれます。基本的にサーバーはディクショナリアイテムのキーと値を暗号化するため、サーバーだけが情報を利用できます。したがって、Cookieは安全です。

ブラウザは、サーバーによって設定されたCookieを保存します。ブラウザがそのサーバーに対して行うすべてのリクエストのHTTPヘッダーに、Cookieが追加されます。Cookieを設定するドメインのCookieのみを追加します。Example.comは、Cookieを設定し、ブラウザがHTTPヘッダーにオプションを追加して、Cookieをsub.example.comなどのサブドメインに送信することもできます。ブラウザがCookieを別のドメインに送信することは受け入れられません。


私が理解しているのは、ブラウザがCookieを同じドメインに送り返すことができるということです。これに関連して、2つのドメインを区別するときにブラウザはサブドメインを考慮しますか?
アーカシュ2014

1
ブラウザがサブドメインを処理する方法について、HTTPヘッダーのオプションを設定できます。
Conor Patrick

288

これは何年も遅れていると思いますが、Conorの答えを拡張して、もう少し議論に追加できると思いました。

誰かがCookieベースの認証がどのように機能するかを段階的に説明してくれますか?私は、認証やCookieを含むことをしたことがありません。ブラウザは何をする必要がありますか?サーバーは何をする必要がありますか?どんな順番で?物事を安全に保つにはどうすればよいですか?

ステップ1:クライアント>サインアップ

何よりもまず、ユーザーはサインアップする必要があります。クライアントは、自分のユーザー名とパスワードを含むHTTPリクエストをサーバーに投稿します。

ステップ2:サーバー>サインアップの処理

サーバーはこのリクエストを受信し、ユーザー名とパスワードをデータベースに保存する前にパスワードをハッシュします。これにより、誰かがデータベースにアクセスした場合、ユーザーの実際のパスワードは表示されません。

ステップ3:クライアント>ユーザーログイン

これで、ユーザーがログインします。彼/彼女はユーザー名/パスワードを提供し、これは再びHTTPリクエストとしてサーバーにポストされます。

ステップ4:サーバー>ログインの検証

サーバーはデータベースでユーザー名を検索し、提供されたログインパスワードをハッシュして、データベースで以前にハッシュされたパスワードと比較します。チェックアウトしない場合は、401ステータスコードを送信してリクエストを終了することにより、アクセスを拒否する場合があります。

ステップ5:サーバー>アクセストークンの生成

すべてが確認できたら、ユーザーのセッションを一意に識別するアクセストークンを作成します。引き続きサーバー内で、アクセストークンを使用して次の2つのことを行います。

  1. そのユーザーに関連付けられているデータベースに保存します
  2. それをクライアントに返す応答Cookieに添付します。ユーザーのセッションを制限するために、有効期限の日時を必ず設定してください

今後、クライアントとサーバーの間で行われるすべての要求(および応答)にCookieが添付されます。

ステップ6:クライアント>ページ要求を行う

クライアント側に戻って、ログインしました。クライアントが認証を必要とする(つまり、ログインする必要がある)ページをリクエストするたびに、サーバーはCookieからアクセストークンを取得し、それをチェックします。そのユーザーに関連付けられたデータベース内。チェックアウトすると、アクセスが許可されます。

これで始められるはずです。ログアウト時に必ずCookieをクリアしてください!


10
説明ありがとうございます。アクセストークンはどのようにセキュリティを提供するのでしょうか。攻撃者がCookieを盗んだ場合、認証されたログインユーザーを装うことができますか?それともSSLで保護されていますか?
Richeek

6
@Richeek SSLは要求/応答中の傍受を保護しますが、攻撃者はエンドポイント(ブラウザなど)でCookieにアクセスする可能性があります。理論的には、Cookieの有効期限が切れるまで、ログインしたユーザーを装うことができます。上記の実装はそれを処理しないので、私は「理論的に」言います。上記の実装では、データベースのアクセストークンが更新される(つまり、次回のログイン)まで、攻撃者はアクセスできます。
pllx 2015年

14
自分の有効期限が切れると、おそらくデータベースの「有効期限」を使用して、アクセストークンを無効にすることができます。または、アクセストークンのようなJSON Web Tokens(JWT)の使用を検討することもできますが、とりわけトークンの期限切れを処理できます。JWTの詳細はこちら。 攻撃者がアクセストークン/ JWTを持っている場合、攻撃者は引き続き短期間アカウントにアクセスできるため、エンドポイントも保護する必要があります。
pllx 2015年

3
長い間ありがとうと言ってくれました!説明ありがとう
Richeek

4
@ManuChadhaトークン/セッションキーとともに、リクエストに有効なCookieが含まれているが、誤ったIP、ブラウザなどからのリクエストの場合、ユーザーエージェントのIPなどの他の識別パラメータも保存できます。要求を拒否し、ユーザーをログインページにリダイレクトして、再度認証します。
FalcoGer

18

Cookieベースの認証

Cookieベースの認証は、次の4つのステップで正常に機能します。

  1. ユーザーはログインフォームにユーザー名とパスワードを入力し、[ログイン]をクリックします。
  2. リクエストが行われた後、サーバーはデータベースでクエリを実行して、バックエンドのユーザーを検証します。リクエストが有効な場合、データベースからフェッチされたユーザー情報を使用してセッションを作成し、それらを保存します。各セッションについて、セッションIDと呼ばれる一意のIDが作成されます。デフォルトでは、ブラウザを通じてクライアントにセッションIDが付与されます。
  3. ブラウザは後続の各リクエストでこのセッションIDを送信し、セッションIDはデータベースに対して検証されます。このセッションIDに基づいて、Webサイトはどのクライアントに属するセッションを識別し、アクセスをリクエストに与えます。

  4. ユーザーがアプリからログアウトすると、セッションはクライアント側とサーバー側の両方で破棄されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.