Cookieとセッション


188

数か月前にPHPを使い始めました。私のWebサイトにログインシステムを作成するために、Cookieとセッション、およびそれらの違い(Cookieはユーザーのブラウザーとサーバー上のセッションに保存されます)について読みました。当時、私はCookieを好み(そしてCookieが嫌いな人は!?)、「誰が気にかけているのか?私のサーバーに保存することにあまり意味がない」と言ったので、先に進んでCookieを使用しました私の学士卒業プロジェクト。しかし、私のアプリの大部分を実行した後、ユーザーのIDを格納する特定のケースでは、セッションの方が適切であると聞きました。では、なぜセッションではなくCookieを使用したのか、陪審員から尋ねられたらどうしたらよいかと考え始めました。私にはその理由があります(ユーザーに関する情報を内部的に保存する必要がないため)。?それともそれ以上ですか?
ユーザーIDを保持するためにCookieを使用するメリット/デメリットについて教えてください。

StackOverflowをご利用いただきありがとうございます。


2
どちらの方法もデータを保存します。Cookieは、クライアント側、つまり訪問者のデバイスのストレージに保存されます。セッションは、クライアント側の一意のIDとサーバー側のすべての実際のデータのみを格納するという点で、巧妙な「拡張」です。クライアントのCookieから一意のIDを受け取ると、サーバーにロードするデータがわかります。ほとんどの場合、必要なのはセッションです。ちなみに、どちらもgithub.com/delight-im/PHP-Cookieでよりモダンな方法で管理できます。
2016

余談ですが、WordPressコアは数年前にセッションの使用を中止し、現在はCookieのみを使用してます。面白い。負荷分散された一連のサーバー全体に展開しやすくしたり、セッションのガベージコレクションによるランダムなログアウトを削減したりするために、それらを実行したのでしょうか。
Simon East

回答:


228

この概念は、Web訪問者がページをロードしても永続的なデータを保存することです。クッキーはそれを直接クライアントに保存します。セッションでは、Cookieを一種のキーとして使用して、サーバー側に格納されているデータに関連付けます。

実際の値はクライアントから隠されているため、セッションを使用することをお勧めします。データの有効期限が切れて無効になるタイミングはユーザーが制御します。すべてがCookieに基づいている場合、ユーザー(またはハッカー)はCookieデータを操作して、サイトへのリクエストを再生できます。

編集:単純さ以外に、Cookieを使用する利点はないと思います。このように見てください...ユーザーは自分のID番号を知る必要がありますか?通常、私はノーと言います。ユーザーはこの情報を必要としません。情報を提供することは、必要に応じて制限する必要があります。ユーザーが別のIDを持つようにCookieを変更した場合、アプリケーションはどのように応答しますか?これはセキュリティ上のリスクです。

セッションが大流行する前は、基本的に自分で実装していました。クライアントに一意のCookie値を保存し、そのCookie値と共に永続データをデータベースに保存しました。次に、ページリクエストでそれらの値を照合し、クライアントにそれを制御させずに永続的なデータを取得しました。


29
@JiminyCricketそれは本当だとは思いません...もしそうなら、誰もが現在ログインしているユーザーを保存するためにセッション変数を使用することはなく、誰もがそうします。これは大きなセキュリティリスクになります。通常、セッションIDがクライアントマシンのCookieとして保存され、サーバー側でセッションデータと照合されることを確認してください。サーバーは通常、Cookie値を介してではなく、IPアドレスを介してセッションを制御しません。
John M.

1
私が最近Cookieのみを使用し始めたばかりです。純粋にセッションがページをロードするのは、session_write_close();必要なときにすべてのページの前に付けない限り、同じセッションから現在別のページが実行されている場合はページが読み込まれないためです。独自の一意のIDをロールしてプレーンCookieと照合することはそれほど難しくはなく、すべてのページを美しく、きちんと保ちます。
ブライアンリーシュマン2017

認証にセッションを使用する必要があると思いますか?セキュリティ上のリスクはありますか?ハッカーが自分のセッションIDを変更しようとした場合、サーバーはどのように応答しますか(推測されたセッションIDが有効であると想定)。
O-BL

セッションをハイジャックできるため、セッションを使用してから2FAを使用します。
Zakir Sajib

119

これら2つを区別するための基本的なアイデア。

セッション:

  1. IDUはサーバー(サーバー側)に保存されます
  2. より安全(1のため)
  3. 有効期限を設定できません。ユーザーがブラウザを閉じると、セッション変数が期限切れになります。(現在、PHPではデフォルトで24分間保存されています)

クッキー:

  1. IDUはWebブラウザー(つまり、クライアント側)に保存されます。
  2. ハッカーがあなたの情報にアクセスして取得できるため(1のため)、それほど安全ではありません。
  3. 有効期限を設定できます(詳細については、setcookies()を参照してください)

計算、測定、クエリなどの変数など、短期的な情報/値を保存する必要がある場合は、セッションが推奨されます。

ユーザーのアカウントなどの長期的な情報/値を保存する必要がある場合は、Cookieが推奨されます(ユーザーが2日間コンピューターをシャットダウンした場合でも、ユーザーのアカウントは引き続きログインします)。Cookieはほとんどの状況で採用されていないため、多くの例を考えることはできません。


6
注意:これは良い答えではありません。最初は大丈夫ですが、物事を混乱させ、偽情報で終わります。これは、セッションとcookieの説明ではありません。セッション対セッション+セッションCookieの説明です。明記されている理由により、Cookieのみでは推奨されません。明記されている理由により、セッション+セッションCookieが推奨されます。
マーカス2017

もう1つの間違いは、PHP構成を介してセッションの存続期間に影響を与えることです。
マーカス2017

1
セッションは依然としてユーザーブラウザーにCookieを設定するため、このサーバー/クライアント側の説明は正確ではありません
Zalaboza

セッションの有効期限は、どのアプリケーションでも簡単に設定できます。3点目が間違っています。さらに、Cookieとセッションに保存できるデータ量を忘れてしまいました。それはより重要なポイントです
saran3h

1
IDUは何の略ですか?
Simon East

44
SESSIONS ENDS WHEN USER CLOSES THEIR BROWSER,

COOKIES END DEPENDING ON THE LIFETIME YOU SET FOR IT. SO THEY CAN LAST FOR YEARS

これが選択の大きな違いです。

IDを長期間記憶させたい場合は、Cookieを使用する必要があります。それ以外の場合は、この訪問のユーザーのみをWebサイトに認識させたい場合は、セッションが適切です。

セッションは、phpサーバーが生成するファイルに保存されます。どのファイルがどのユーザーのものかを覚えておくために、phpはユーザーのブラウザにこのセッションファイルIDを保持するCookieも設定するため、次回の訪問時にphpがこのファイルを読み取ってセッションをリロードします。

現在、phpはデフォルトでセッションをすべての間隔でクリアし、セッションの命名規則によりセッションが自動的に期限切れになります。また、ブラウザを閉じるか履歴をクリアすると、ブラウザはセッションIDを保持するCookieを保持しなくなります。

最近のブラウザーは、LocalStorage、SessionStorage、およびJavaScriptコードがデータをコンピューターに保存して記憶するために使用できる他のwebdbエンジンなど、別の種類のストレージエンジンもサポートしていることに注意することが重要です。たとえば、Facebook内でJavaScriptコンソールを開いて「localStorage」と入力すると、FacebookがCookieなしで記憶するために使用するすべての変数が表示されます。


16
実際、デフォルトでは、ユーザーがブラウザを閉じるまでセッションが続きますが、php.iniファイルで、session.cookie_lifetime = 0の0を、セッションを継続する秒数に変更するか、またはsession_set_cookie_params()を使用します。
DOK

1
さらに役立つ情報、多くの回答を得るような質問..素晴らしい、再びDOKに感謝します!
Nadjib Mami

1
また、単一障害点のセッションファイルが作成する可能性があることに注意してください。最小のdosスタイルの攻撃でさえ、プロキシ、IPスイッチャー、またはゾンビを介して発生すると、サーバーのハードディスクまたはSSDにセッションファイルが作成されます。読み取り/書き込みに対応できない場合、サイトはダウンします。
Shawn E Carter

「ユーザーがブラウザを閉じたときにセッションが終了する」1.ユーザーがページからawyaに移動した場合はどうなりますか?ブラウザを閉じずに戻ります。2.同じサイトを指す複数のブラウザウィンドウ/タブが開いている場合はどうなりますか?作業中の一部のWebアプリはこの状況で混乱しますが、使用しているCookieの種類がわかりません。
jcansell 2017

1
@jcansellよく、Cookieはマルチタブによって混乱したり、ナビゲートしたりしません。そのような場合、おそらくこれらのWebアプリケーションは、JavaScriptを使用してデータを保存するためにlocalstorage / sessionストレージを使用しました
Zalaboza

20

ログインしたユーザーを認識するために#IDをCookieとして保存すると、実際には、ユーザーに関係のないデータがユーザーに表示されます。さらに、サードパーティがブラウザでランダムなIDをCookieデータとして設定しようとすると、実際にはそうではないのに、ユーザーがユーザーであるとサーバーに納得させることができます。それはセキュリティの欠如です。

あなたはクッキーを使用しました、そしてあなたが言ったようにあなたはすでにプロジェクトのほとんどを完了しました。クッキーに加えて、セッションがより速く終了する間、長期間残る特権があります。したがって、この場合、セッションは適していません。実際には、多くの有名で人気のあるWebサイトやサービスがCookieを使用しており、長期間ログインしたままにすることができます。しかし、どのようにしてそれらの方法を使用して、より安全なログインプロセスを作成できますか?

ここにアイデアがあります:Cookieの使用方法を支援できます:ログインユーザーを認識するためにIDではなくランダムキーを使用する場合、最初に、ランダムデータにプライマリデータを漏らさず、次に、ランダムを検討する場合キーが十分に大きい場合、キーを推測したりランダムなキーを作成したりすることはだれにとっても難しくなります。たとえば、ユーザーのブラウザーに次のような長さ40のキーを保存できます。


1
素敵な説明。GUIDをトークンで使用して、個々のユーザーを認識します。
Karthik、2016年

16

短い答え

優先度順のルール:

  • ルール1.ユーザー入力を信頼しない:Cookieは安全ではありません。機密データのセッションを使用します。
  • ルール2.ユーザーがブラウザーを閉じたときに永続データを残す必要がある場合は、Cookieを使用します。
  • 規則3.ユーザーがブラウザーを閉じたときに永続データを残す必要がない場合は、セッションを使用します。
  • ルール4.詳細な回答を読んでください!

ソース:https : //www.lucidar.me/en/web-dev/sessions-or-cookies/


詳細な回答

クッキー

  • Cookieはクライアント側(訪問者のブラウザ)に保存されます。
  • Cookieは安全ではありません。Cookieの内容の読み取りと書き込みは非常に簡単です。
  • Cookieを使用する場合は、ヨーロッパの法律(GDPR)に従って訪問者に通知する必要があります。
  • 有効期限を設定できますが、ユーザーまたはブラウザで変更できます。
  • ユーザー(またはブラウザー)は、Cookieの使用を拒否(設定)できます。

セッション

  • セッションはサーバー側に保存されます。
  • セッションはCookieを使用します(以下を参照)。
  • セッションはCookieより安全ですが、無傷ではありません。
  • 有効期限はサーバー構成で設定されます(php.iniなど)。
  • デフォルトの有効期限は24分、またはブラウザを閉じたときです。
  • ユーザーが新しいページを更新またはロードすると、有効期限はリセットされます。
  • ユーザー(またはブラウザー)は、Cookie、したがってセッションの使用を拒否(設定)できます。
  • 法的には、クッキーについても訪問者に通知する必要がありますが、先例がないことはまだ明らかではありません。

適切な選択

セッションはcookieを使用します!セッションデータはサーバー側に保存されますが、UIDはクライアント側のCookieに保存されます。これにより、サーバーは特定のユーザーを適切なセッションデータと照合できます。UIDは保護されており、ハッキングは困難ですが、不死身ではありません。機密性の高いアクション(電子メールの変更またはパスワードのリセット)については、セッションにもCookieにも依存しないでください。アクションを確認するためにユーザーパスワードを要求します。

機密データは決してCookieに保存しないでください(電子メール、暗号化されたパスワード、個人データなど)。データは外部のコンピューターに保存されていることに注意してください。コンピューターがプライベート(教室または公共のコンピューター)でない場合、他のユーザーがCookieのコンテンツを読み取る可能性があります。

リメンバーミーデータはCookieに保存する必要があります。そうしないと、ユーザーがブラウザーを閉じたときにデータが失われます。ただし、パスワードやユーザーの個人データを「remember-me」Cookieに保存しないでください。ユーザーデータをデータベースに保存し、このデータを、Cookieに保存された暗号化されたID /キーのペアにリンクします。

以前の推奨事項を検討した後、次の質問は最終的にCookieとセッションのどちらを選択するのに役立つかです。

ユーザーがブラウザを閉じたときに永続的なデータを残す必要がありますか?

  • 答えが「はい」の場合は、Cookieを使用してください。
  • 答えが「いいえ」の場合は、セッションを使用してください

13

実際、セッションとCookieは必ずしも別のものではありません。常にではありませんが、多くの場合、セッションはCookieを使用します。

ここでこれらの他の質問であなたの質問へのいくつかの良い答えがあります。あなたの質問は特にユーザーのIDU(またはID)を保存することに関するものなので、他の質問と完全に重複しているとは思いませんが、それらの回答が役立つはずです。

クッキー対セッション

キャッシュVSセッションVSクッキー?

セッションとCookieの違いは何ですか?


10

私は個人的にクッキーとセッションの両方を使用しています。

Cookieは、ユーザーが[ 記憶する] チェックボックスをクリックしたときにのみ使用されます。また、Cookieは暗号化され、データはサーバー上でのみ復号化されます。誰かがクッキーを編集しようとした場合、私たちの復号化機能はそれを検出してリクエストを拒否できます。

ログイン情報がCookie保存されている多くのサイトを見てきましたが、CookieのユーザーIDとユーザー名を変更するだけで、誰でもアカウントアクセスできます。

おかげで、


2

セッションとCookieは同じではありません。

セッションは、Webページからの情報を格納するために使用されます。通常、Webページにはこれらの情報を保存するためのメモリがありません。しかし、使用することで必要な情報を保存できます。

ただし、Cookieはユーザーの識別に使用されます。Cookieを使用して、データを保存できます。これは、ユーザーのWebブラウザーに格納されるデータのごく一部です。したがって、ユーザーが次に閲覧するときはいつでも、ブラウザーは以前のアクティビティを取得するためにCookieデータ情報をサーバーに送り返します。

クレジット:セッションとCookie


ユーザーがCookieを無効にした場合はどうなりますか?Cookieはどのようにユーザーを識別しますか?
SohailRajput 2016年

1

セッションを使用すると、Cookieと同じように個々の情報を保存できますが、データはクライアントではなくサーバーに保存されます。


0

他の人が言ったように、セッションは賢く、クライアントから情報を隠すという利点があります。

ただし、Cookieには少なくとも1つの利点があります。JavaScript(たとえばngCookies)からCookieにアクセスできます。PHPセッションでは、PHPスクリプトの外部からアクセスすることはできません。


1
できます。もちろん、直接ではありませんが、セッションデータを返すスクリプトへのajaxリクエストを介してアクセスできます。しかし、私はあなたがすべきかわかりません。
10,000

0

[セッション]を選択します。まず、セッションの方がCookieより安全です。Cookieはクライアントサイトデータであり、セッションはサーバーサイトデータです。Cookieは、サーバーをユーザーのコンピューターのブラウザーに埋め込む小さなコードであるため、ユーザーを識別するために使用されます。一方、セッションはIDを保護するのに役立ちます。これは、HTTPアドレスが状態192.168.0.1を765487cf34ert8ded…..またはGETおよびPOSTメソッドの助けを借りて他の数値に変更するため、Webサーバーはあなたが誰であるかを知らないためです。セッションは、ユーザーIDでさえ一致できない一意のIDセッションでユーザーのデータを保存します。セッションは、1つのアプリケーションのすべてのページに単一のユーザー情報を格納します。cookieの有効期限はsetcookies()を使用して設定されますが、セッションの有効期限は設定されていません。ユーザーがブラウザをオフにすると有効期限が切れます。


0

セッションは、Cookie情報に関連付けられたサーバー上の情報のグループです。PHPを使用している場合は、セッションを確認できます。パスの場所を保存して、実際に「セッションを表示」します。Cookieは、クライアントとの間で送受信されるデータのスニペットです。Cookieは、どのクライアントがどのセッションを処理したかをサーバーに通知するため、セッションを容易にするためによく使用されます。これを行う方法は他にもありますが(クエリ文字列マジックなど)、Cookieが最も一般的です。

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