web-dev-qa-db-ja.com

いつクッキーの代わりにセッション変数を使用する必要がありますか?

セッション変数とクッキーは私と非常によく似ています。技術的な違いは理解していますが、一方を使用するタイミングと他方を使用するタイミングをどのように決定しますか?

55
sprugman
  • セッションはサーバーに保存されます。つまり、クライアントは、セッションについて保存した情報にアクセスできません。サーバーに保存されているセッションデータは、ページごとに完全に送信する必要はありません。クライアントはIDを送信するだけで、データはサーバーからロードされます。

  • 一方、Cookieはクライアントに保存されます。長期間にわたって耐久性を持たせることができ、Webサーバーのクラスターがある場合によりスムーズに作業できるようになります。ただし、セッションとは異なり、Cookieに保存されたデータはページリクエストごとに完全に送信されます。

  • Cookieにデータを保存しない

    • それは、エンドユーザーが見たり、読んだり操作したり、悪意を持ったユーザーによって傍受されたりする可能性があります。 「session_id」を除き、Cookie内のデータを信頼することはできません。
    • ユーザーごとにページリクエストごとに1kのデータを追加すると、帯域幅が増加し、帯域幅が10〜15%増加する可能性があります。これはおそらく$$の観点からはコストがかかりませんが、パフォーマンスの観点からは可能性があります。これにより、サーバーごとの帯域幅が実質的に10〜15%減少します。
  • セッションデータに保存できるものは、データの量とユーザーの数によって異なります。 no_of_users * size_of_session_dataは、サーバーで使用可能な空きメモリよりも小さくする必要があります。

54
Daniel Vassallo
  • 常にセッションを使用する
  • 長いログインセッションが必要な場合にのみCookieを使用します。次に、暗号化されたユーザーIDでCookieを追加します。
10
Bozho

ほとんどの場合、セッション状態はCookieを使用して保持されます。したがって、それは実際にはどちらか一方の問題ではなく、それらを一緒に使用する方法です。

フレームワークのセッションインフラストラクチャを使用すると状況が簡単になる場合がありますが、Cookieを使用して手動で状態を追跡すると、通常、きめ細かな制御が可能になります。正しい解決策は、何を達成しようとしているかによって異なります。

7
Daniel Pryden

Cookieは、単一セッションよりも長く存続できます。ただし、Cookieはユーザーによって削除されたり、ブラウザーがCookieを受け入れないユーザーがいる場合もあります(この場合、サーバー側のセッションのみが機能します)。

5
danben

Cookieはクライアント側であり、セッションはサーバー側です。

ユーザーが信頼できる小さなデータ(フォント設定、サイトテーマなど)およびサーバー側データの不透明ID(セッションIDなど)にはCookieを使用します。これらのデータはいつでも失われる可能性があり、信頼できない(つまり、サニタイズする必要がある)ことを期待してください。

セッションデータを使用して、より多くのデータチャンク(多くのシステムではオブジェクト、データ構造などを保存できます)および信頼状態(承認ステータスなど)を使用します。一般に、セッションデータを使用して、より大きな状態データを保存します。

GUI、キャッシュなどに必要な場合は、認可ステータスなどをCookieに保存することもできますが、信頼することや存在することに依存することはありません。 Cookieは簡単に削除でき、偽造も簡単です。セッションデータは、アプリケーションが制御するため、偽造するのがはるかに困難です。

5
StasM

Cookieはリクエストごとにサーバーに送信されるため、かなりの量のデータを保存する予定がある場合は、セッションに保存します。

それ以外の場合、少量のデータを保存する場合は、Cookieで問題ありません。

Cookieは100%安全ではないため、機密データはセッションに保存する必要があります。 Cookieの利点は、通常セッションデータを保存するサーバーのメモリを節約できることです。

2
JonoW

PHPセッションの欠点の1つは、セッション処理の仕組みです。具体的には、1つのプロセス/リクエストのみが、一度に書き込み用にセッションを開いておくことができます。

session_start() 

セッションファイルはロックされています。さらに多くのプロセスが発生すると、残りのプロセスが山積みになり、順番を待ちます。

つまり、ページでAJAXを使用して複数の要素を更新する場合-AJAX要求が同じセッションを開くことを望まない-それらは強制的にキューに入れられ、それらのリクエストのいずれかがスタックした場合-セッションを解放しません-新しいタブまたはウィンドウを開くと、サーバーのキューに別の満たされないリクエストが置かれるだけでブラウザがハングします。

session_write_close()

セッションをリリースするためにできるだけ早く、部分的な回避策です。

ユーザーが退屈してウィンドウをさらに開くという長時間実行されるリクエストは、同じブラウザーのハング効果をもたらす可能性があります。

PHPセッションを避けることをお勧めします。

2
Dieter Donnert

セッションはサーバーに保存されます。 Cookieに何かを保存すると、ユーザーのブラウザーはすべてのリクエストでその情報を送信し、ユーザーの観点からサイトを遅くする可能性があります。できる限りクッキーを使用しないようにしています。

1

セッションとCookieはまったく同じではありません。 Cookieはクライアント側です。セッションはサーバー側です。セッションは、多くの場合(必ずしもそうではありません)、Cookieを使用して、同じユーザーからの別の要求と相関させ、同じセッションに属していることを識別します。

セッションは人工的な概念であり、HTTPにはその概念がありません。 Webサーバーによって作成され、Web開発者がユーザーアカウント情報、ショッピングカート、フォームデータなどのリクエスト間で情報を運ぶのを支援します。Cookieは標準のHTTPヘッダーによって運ばれます。

セッションとCookieに保存する情報はユーザー次第です。通常、ユーザーがブラウザを閉じた後もセッション間で保持したいものをクッキーに入れます。認証トークンを記憶して「記憶」機能を実装したり、過去のユーザーアクティビティを使用してエクスペリエンスをパーソナライズしたりできます。この情報は小さく、「参照」するようにしてください。つまり、サーバー側で保存するより豊富な情報を参照するIDだけにすることができます。クライアント側はマルウェアに対して脆弱であるため、パスワードや機密情報を保存しないでください。

最後に、ローカルストレージもありますが、これについては言及しませんでした。これはクライアント側でもありますが、Cookieデータとは異なり、ヘッダーで自動的に送信されないため、クロスサイトスクリプティングハッキングの影響を受けにくいと考えられます。

0
jbx

セッションはサーバー側に保存されます。訪問者がCookieに何かを保存すると、ブラウザはリクエストごとにユーザー情報を送信します。

これは、多くのサーバーのコンピューター時間を消費し、ユーザーエクスペリエンスを低下させる傾向があります。一部のブラウザはCookieをサポートしていないため、Cookieよりもセッションに有利です。セッションを強くお勧めします。

これは役立つかもしれません:Cookies(php.net)

0
Nekta Point

セッションが使用できるのは、Cookieに対してデータが大きすぎる場合、またはCookieを使用した場合にパフォーマンスが低下するほどデータが大きい場合のみです。

たとえば、2つのログイントークンなどのように、CookieのセッションIDのサイズよりも小さいデータを保存している場合... Cookieを介してセッションを使用する理由がわかりません。

また、PHPセッションファイルは、クライアント側でのみ保存されるcookieと比較して、デフォルトでディスクに保存されます。

0
Jo Smo

あなたの明確なガイド

N.B-cookieはユーザーのブラウザに保存され、sessionはホスティングサーバーマシンに保存されます。

使用する場合

  1. Cookieを使用ユーザーがブラウザを閉じた場合でも、ユーザーのデータを常にアプリケーションに記憶させる場合。たとえば、www.facebook.comと入力すると、ブラウザが閉じられて再び開かれた場合でも、アカウントに移動します。

    ブラウザーを閉じると、セッションに保持されているデータはすべて消去されるためです。

  2. Cookieを使用保存されるユーザー情報が通常よりもはるかに大きい場合。 ...セッションの場合、Facebookなどのより大きなユーザーベースがある場合、ホスティングマシン上のすべてのユーザーセッションを保存する方法を考えてください。

  3. セッションを使用する格納するユーザー情報が通常より大きくなく、ユーザーがユーザー変数にアクセスできないようにする場合...

0
Emeka Obianom