質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

4305閲覧

ログイン情報をCookieで保持する事とSessionで保持する事の違い

yuuyu

総合スコア1139

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

2グッド

4クリップ

投稿2018/10/22 03:47

前提・実現したいこと

現在、PHPでログインが必要とするサイトを作成しています。
サイト内は基本的にログインしている状態で移動することになりますが、そのログインを識別する方法で悩んでいます。
Webで検索してみると、基本的にログインの識別にはSessionを使用する、と記載されており、
セキュリティー上Cookieは自動ログインにのみ使用すると書かれていました。

今回、自動ログイン機能ありでの作成を試みているのですが、正直Sessionを使わないといけない理由がよく分かっていません。

###現在考えている大まかなログイン方法

ログイン時にランダムな文字列を生成し、その値をCookieとDBに保存する。(ログイン維持用・期間は1週間ほど)
サイト内のページを訪れるとCookieの値をDBへ検索にかけて、ユーザーを識別、ログインしていると判断。
無かった場合は再度ログインを求める。

###ログインにSessionを使う場合

ログイン時にランダムな文字列を生成し、その値をCookieとDBに保存する。(自動ログイン用・期間は1週間ほど・このCookieの値はログインページでのみアクセス出来る)
また同時にSessionを作成し、Sessionの中にユーザー名などのログイン情報を記録。(Sessionはブラウザが閉じれば消滅)
サイト内のページを訪れるとSessionが存在しているか確認し、ログインしていると判断。
無かった場合はログインページへ移行し、自動ログインを試みる。不可能であった場合再度ログインを求める。

Webを調べた感じ、おそらくSessionを使う場合はこのようなログイン方法になるかと思います。

###疑問点
○わざわざSessionを使う必要がありますか?
Cookieの場合は毎回DBにアクセスする必要がありますが、今回のサイトでは最終ログイン時間を記録したいのでどちらにせよDBには毎回アクセスします。
セキュリティー面で考えてみても、Cookieを盗聴されれば他の人が成り済ましてアクセス出来るという話ですが、
SessionでもCookieは使用されていますし、そのCookieを盗聴されたら同じではありませんか?

○それでもSessionが必要な場合、Sessionには何を保存すべきですか?
Session内に$_SERVER['HTTP_USER_AGENT']の値を保存させて、ある程度のSessionの本人確認は可能かもしれないと思いました。でもこの値も偽造できますよね?しかもCookieを盗聴出来るわけですから恐らく簡単にその人の$_SERVER['HTTP_USER_AGENT']も取得出来ると思うんです。となると、他にSessionの方が有利になる何かがあると思うのですが、何かあるのでしょうか?

bonkura05, DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoorwm

2018/10/22 04:21

質問文からsessionに関して理解していない事が伺えるので、もう少し色々な例を見て理解しておくといいかと思います。ちなみに、大抵の事例ではCookieに保存するデータはセッションデータを引いてくる為のキーとして使用されています。
退会済みユーザー

退会済みユーザー

2018/10/22 04:59 編集

自力で認証システムを構築・実装しようとしているのですか? (勉強のためだけでセキュリティの問題は気にしなくてよいということならそれも有りだと思いますが、実用にする予定があるなら止めた方が良いと思うのですが・・・)
guest

回答3

0

セッションハイジャックの話ですかね?
ググってみるとこのへんがわかりやすかったので参考までに
その他、納得がいくまでネットで情報をあさってみると良いでしょう。

結論としては、セッションハイジャックを完全に防ぐことは非常に難しいですが。
二重三重に仕掛けをしておけばある程度までは防げるという認識でよいでしょう。

ちなみにクッキーはタダの平文のデータですからクッキー自体にユーザーidやパスワードを保持したり
するのはNGです。

投稿2018/10/22 04:14

yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuyu

2018/10/22 06:21

回答ありがとうございます サイトは読んでみました。 一応そういう類の話にはなると思うのですが、 簡単に言ってみれば、Sessionのキーとして渡されるようなランダムなCookieの値をそのまま認証に使うのと、 Sessionでサーバーに保存した値を使って認証するものの違いを知りたいのですが・・・
yambejp

2018/10/22 06:33

> Cookieの値をそのまま認証に使う 回答にも書いたとおり平文のユーザーidやパスワードをクッキーにかいちゃだめというだけの話。 セッションでやりとりされるセッションidはあくまでもセッションが確保されていますという情報 でしかないので、ログインに必要な情報は保持されていないので。
guest

0

ベストアンサー

貴方のDBの用途はまさしくセッションのそれだと思われます。
ただ、わざわざ自前でセッションの再発明をするのは色んな意味で望ましくないので、
そのフレームワークが対応してるならセッションのバックエンドをDBにするのが良いでしょう。

なお、セッションの生存期間は別にブラウザの状態とは関係ないですよ。

--以下追記
もういうべきことは他の方がおっしゃっているので蛇足感はありますが、
何をするべきかとその理由について一応追記させていただきます。

・やるべきだと思われること
自前のセッションもどきな仕組みはやめて
言語の提供するセッションの機能を適切に使用することに注力するべきと考えます。
私はあまりPHPに明るくないので公式ドキュメントを案内させていただきます。
セッション処理

バックエンドをDBにするなら以下の内容を使用することになると思われますが、
言い出しておいてなんですがそもそも本当にDBにするべきなのかについてはよく考えて選択なさってください。
カスタムセッションハンドラ

・なぜそう思うか
Web上のアプリが特定のクライアントを識別し状態を保持するための仕組みがSession(とCookie)です。
あなたのやろうとしていることも特定のクライアントを識別し状態を保持するための仕組みですね。
要するにあなたが現在セッションとCookieとDBで自前でやろうとしていることはセッションの劣化コピーです。
本来の機能の上に劣化コピーをのっけようとしているのですから、片方は無駄に思えて当然といえば当然です。

ただし、上記ドキュメントを見ればわかりますが、
言語の提供しているセッションは適切に運用するために様々な機能を保有しています。
それらの機能を捨て自前の実装で済ませることは、
短期的には楽かもしれませんが実に多くのリスクを背負うことになるでしょう。

・盗聴について
当然HTTPであれば通信経路上にいる者はCookie(以外もですが)を盗聴できます。
しかし、適切に構築されたHTTPSな環境であれば盗聴は基本的に不可能です。
余計な仕組みを無駄に入れることを考えるのではなく、守るべきレイヤで守りましょう。

投稿2018/10/22 08:21

編集2018/10/22 17:10
macof

総合スコア83

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuyu

2018/10/22 15:34

回答ありがとうございます >そのフレームワークが対応してるならセッションのバックエンドをDBにするのが良いでしょう。 理解力が低くて申し訳ないのですが、これはつまり・・・どういう感じにすべきということでしょうか? >セッションの生存期間は別にブラウザの状態とは関係ないですよ。 質問文に書かれた期間は、このような期間に設定しようと思っています、というような書き込みのつもりで書きました。ややこしくて申し訳ないです。
yuuyu

2018/10/24 11:43

追記の方も丁寧にありがとうございます。 セッションの劣化ですか・・・。 もう少しセッションのことを勉強して、頑張ってみようと思います。
guest

0

> Cookieで保持する事とSessionで保持

cookie は実装の話、session は仕組みの話です。
ちがう土俵のものを比較しようとしています。

cookie に session id をもたせ、session 機構の一部として使用することもありますし、cookie を使用しない session 機構も存在します。

また、文脈によっては session は「一連の通信のやりとり」を指すことや「session データ」を指す場合もあります。質問中、このあたりの使い分けがおかしい箇所もあるので、キチンと基礎を理解してください。

体系だった学習をすることをオススメします。

投稿2018/10/24 11:57

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問