質問: ### 前提・実現したいこと 現在、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の方が有利になる何かがあると思うのですが、何かあるのでしょうか?
回答: 貴方のDBの用途はまさしくセッションのそれだと思われます。 ただ、わざわざ自前でセッションの再発明をするのは色んな意味で望ましくないので、 そのフレームワークが対応してるならセッションのバックエンドをDBにするのが良いでしょう。 なお、セッションの生存期間は別にブラウザの状態とは関係ないですよ。 --以下追記 もういうべきことは他の方がおっしゃっているので蛇足感はありますが、 何をするべきかとその理由について一応追記させていただきます。 ・やるべきだと思われること 自前のセッションもどきな仕組みはやめて 言語の提供するセッションの機能を適切に使用することに注力するべきと考えます。 私はあまりPHPに明るくないので公式ドキュメントを案内させていただきます。 セッション処理 バックエンドをDBにするなら以下の内容を使用することになると思われますが、 言い出しておいてなんですがそもそも本当にDBにするべきなのかについてはよく考えて選択なさってください。 カスタムセッションハンドラ ・なぜそう思うか Web上のアプリが特定のクライアントを識別し状態を保持するための仕組みがSession(とCookie)です。 あなたのやろうとしていることも特定のクライアントを識別し状態を保持するための仕組みですね。 要するにあなたが現在セッションとCookieとDBで自前でやろうとしていることはセッションの劣化コピーです。 本来の機能の上に劣化コピーをのっけようとしているのですから、片方は無駄に思えて当然といえば当然です。 ただし、上記ドキュメントを見ればわかりますが、 言語の提供しているセッションは適切に運用するために様々な機能を保有しています。 それらの機能を捨て自前の実装で済ませることは、 短期的には楽かもしれませんが実に多くのリスクを背負うことになるでしょう。 ・盗聴について 当然HTTPであれば通信経路上にいる者はCookie(以外もですが)を盗聴できます。 しかし、適切に構築されたHTTPSな環境であれば盗聴は基本的に不可能です。 余計な仕組みを無駄に入れることを考えるのではなく、守るべきレイヤで守りましょう。