• 締切済み

SESSIONとCOOKIE

はじめまして。 現在、下記環境で開発をしております。 winXP PHP5 smarty3 Mysql 開発は一般的な検索サイトです。 全て一人で行っているものなので規模は小さいものです。 ここで質問なのですが、今セッションとクッキーの使い方について自分で説明できなくなってしまっています。 実現できているからいい そういうつくりになっていて個人的にはあまりうれしくない状態です。 下記が僕の見解です。 【サーバー側の一時記憶領域。 セッション】 アクセス中、一時的に値を確保したい場合に使っています。 ・コンボボックスに表示する内容 ・検索結果の配列 ・会員情報 【クッキー】 クライアント側の記憶領域 クライアント依存があるものでクッキーが有効でない設定の人ものいそう、、 利用していません。 現状はクッキーは使用できていないのですが、インターネットなどで調べると、 ↓クッキー↓ クッキーとは、Webサイトの提供者が、Webブラウザを通じて訪問者のコンピュータに一時的にデータを書き込んで保存させるしくみ。 ↓セッション↓ 接続から切断までの通信の事 とありました。 この答えが全てだとは思いませんが、実際に値を一時的に格納するならどう考えてもクッキーが適任に思えてしょうがないのです。 ここで質問です。 場合による、となればそれまでかもしれませんが実運用されているシステムなど構築する場合、この二つの一時記憶領域をどのように使用するべきなのでしょうか? 持論、参考URLなどなんでも結構です。 よろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

回答No.1

>>クッキーとは、Webサイトの提供者が、Webブラウザを通じて訪問者のコンピュータに一時的にデータを書き込んで保存させるしくみ。 そうですね、これに対してセッションは(セッション変数) Webサイトの提供者が、Webブラウザを通じて訪問者のコンピュータに一時的にセッションIDを渡して、そのIDに対する変数をサーバー上で管理するものです。 つまり両方ともクライアント側にデータがありますが、格納される情報がまるで違います。そのデータを改ざんされて困るようなデータはクッキーに保存してはいけません。 回答です。 【セッション変数で管理すべきもの】 ログイン情報 ユーザーID&パスワードを入力して Aさんとしてログインを済ませましたという情報を持ち歩く必要があります。 たとえばWEBメール(niftyとか)の画面にこの機能が無い場合 URLを直打ちしてしまえば見られてしまいます。 【クッキーで管理すべきもの】 ユーザーID(Nifty等のログイン) 後日再度入力する必要があり 万が一そのデータが第三者にわたってもそれだけでは利用できない そしてクッキーを利用できないクライアントでも問題がない状態の場合。

eclipsePG
質問者

お礼

早速のご回答ありがとうございます。 まず、質問返しになってしまい申し訳ないのですが、セッションIDを発行してクライアントを個人として認識できるということはわかります。 クライアントというか、「その通信」って事ですよね。 セッションIDがあれば「その通信」だとサーバーから見分けられる。 そして変数名は同じでも通信毎にプライマリな扱いになるのはセッションIDがあるからである。 うん、納得です。 >つまり両方ともクライアント側にデータがありますが、、、 ここが。。なんとも。 あっセッションIDのみクライアント側で保存する。 そういう事か! なるほど! クッキーにセッションIDを持たせて、そのIDで、、 なるほどです。そのIDでリクエストがあれば、サーバー側で認識できる。 そのIDにひもづく細かいデータはサーバー側に記憶される。 だから、セッションに格納しすぎるとサーバー付加が上がる。 なるほど。理解できました!(あってるのかな。。) あとは、おっしゃるとおりパフォーマンスなどとは別に 「セキュリティ」という角度で考えたときに 問題のあるものはセッション。 問題ないものは、クッキーにあずけちゃう。 そういう事ですよね! ありがとうございます! セキュリティ>ユーザービリティの優先順位で格納する場所の判断基準ができました。 自分の実装に確固たる理由があるというのはいいものです。 すっきりします。 丁寧な解説ありがとうございましたmm

関連するQ&A

  • セッションとクッキーの関わりについて

    いつもお世話になりますm( __ __ )m 質問の前に前提条件としてセッションによるログインサイトなどは、以下のようなやり取りを行っていると認識しています。 1. サーバーからクライアントにセッション ID を発行する 2. クライアントのクッキーにセッション ID が保存される 3. 以降、クライアントがサーバーにアクセスするとクッキーに保存されているセッション ID が一緒にサーバー側に送信され、サーバー側で保存しているセッションデータと関連つける。 ここまで間違っていたらご指摘ください。 以下、質問です。 上記の仕組みを PHP などを用いて既存のセッション関数を使わず自作するとした場合、以下のシーケンスで同等と考えてよろしいでしょうか? 1. サーバー側で乱数などを用いてセッション ID を独自に生成する 2. Set_Cookie 関数などでクライアントのクッキーにセッション ID を保存する。 3. 以降、クライアントのクッキーからセッション ID を取得し、サーバー側でその値を元に DB などから値を取り出す。 私には前者と後者が全く同じ処理に見えるのですが、違うのでしょうか。それとも同じなのでしょうか。と言ったところが聞きたいと考えています。 以上です。 よろしくご教授くださいm( __ __ )m

  • クッキーとセッション

    クッキーとセッションの違いは何ですか? クッキーは「WebサーバーがWebブラウザに渡すメモのようなもの」でセッションは「クライアントに関連する情報(データ)をWebサーバーに預けておくことが出来るもの」で合っていますか?

  • セッションについて

    PHPに限らず、 同一セッションであるかを管理する為にクライアント側で 保存される情報はクッキーデータのみでしょうか? セッション管理方法によっては別の方法もあるのでしょうか? もし、クッキー以外の方法があれば、どのような仕組みになるのか 簡単に教えて頂けませんでしょうか?

    • ベストアンサー
    • PHP
  • phpのsessionとcookieについて

    質問は以下に2つです。 プログラムの説明は、pass,idから認証を行い、sessionidを発行します。二度目の以降はsessioidから認証します。 sidpost.phpからpostでIDとパスワードを入力させます。 データベースはid, pass, sidの3つのカラムがあります。 <?PHP require_once'DB.php'; session_name("sid"); session_start(); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php $id = $_POST['id']; $pass =$_POST['pass']; $cookie = $_COOKIE['sid']; $sid = session_id(); //データベース参照 //プレースホルダーを使用 //id からpassを参照する //cookie から sidを参照する $data=$sth->fetchRow(DB_FETCHMODE_ASSOC);//参照したデータを$dataの連想配列に格納 //sid保存のプレースホルダー $sth2 = $dbh->prepare('UPDATE accountid SET sid=? WHERE id=? AND pass=?'); //cookieが保存されていない場合 if(!isset($cookie) && isset($pass) && isset($id)){ //idとpassから認証 if($pass === $data['pass']){ $sth2 = $dbh->execute($sth2, array($sid, $id, $pass)); echo "初めてのログインsid登録"; } //sidがある場合cookieとデータベースのsidを比較 }else if(isset($cookie)){ if($cookie == $data['sid']) echo "sidあり成功"; //クッキーがあり、データベースと一致しない場合,sidを破棄する }else{ echo"あるはずのクッキー" .$COOKIE['sid']."<br>"; $_SESSION=array(); setcookie('sid', '', time()-3600); session_destroy(); echo "ないはずのクックキー".$_COOKIE['sid']; } //それ以外は入力フォームにリダイレクト }else{ header("location: ./sidpost.php?error=error"); } $dbh->disconnect(); ?> </body> </html> 上のようなセッション管理のプログラムを書きました。 質問は2つありまして、 ・1つめは、通常セッション管理を行う際の、条件はどのようにするのが一般的ですか? IDとパスワードがデータベースと一致する場合としない場合の2通り、cookieがある場合、ない場合の2通り、もしcookieがある場合は、データベースの値と一致する場合としない場合の2通りが考えられます。一番最適な条件文はどのようにすればよいでしょうか? またその処理はどのようにすればよいのでしょうか。 例えばcookieがあり、データベースと一致しない場合、$_SESSIONの初期化、setcookieでクッキーの削除、session_destroy()するなど。。。なにかよくわからなくなってしまいました。 ・二つ目は、 上のプログラムではじめsession_name('sid')およびsession_start()を宣言し、クライアントとサーバに$sid=session_idを発行しています。なので、$_COOKIE['sid'];の値には session_id()($sid)になっているはずです。 下のほうで、セッションの管理を行う際、 //クッキーがある場合 else if(isset($cookie)){ if($cookie == $data['sid']) echo "sidあり成功"; //クッキーがあり、データベースと一致しない場合,sidを破棄する }else{ echo"あるはずのクッキー" .$COOKIE['sid']."<br>"; $_SESSION=array(); setcookie('sid', '', time()-3600); session_destroy(); echo "ないはずのクックキー".$_COOKIE['sid']; } クッキーがあり、データベースと一致しない場合に、sessionおよび、cookieの破棄をしています。この前後でechoをもちいて$_COOKIE['sid']の値を出力すると、 破棄するの前のechoでクッキーが表示されず、 破棄したあとのechoでクッキーが表示されました。 なぜこのような結果になるのですか、逆では?と思いました。

    • 締切済み
    • PHP
  • Railsのセッションについて

    Ruby On Railsについて質問です。 環境はRails2.1でWEB開発を行っていますが 特に設定を変えずにセッションでデータを保持するとそれはクッキーに書かれるのでしょうか? またセッションがクッキーに保持されるのであればセッションをアプリケーションサーバに 保持させたいです。その方法を教えて貰えないでしょうか?

    • ベストアンサー
    • Ruby
  • セッション

    セッションとクッキーで質問です。 1.session_id()やsession_name()っていつ使うのでしょうか? ブラウザは特定できても個人を特定できるわけではないですよね?それとも ブラウザを特定して管理するためなのでしょうか? 2.自動グイン機能を実装しようと思うとき、 クッキーとサーバー側(正確にはdb)にランダムな文字列を格納し、次回サイトを訪れた際、保存している値とクッキーにある値を照合し合えばログインしたことにする。 上記のようなロジックで大丈夫でしょうか?

    • ベストアンサー
    • PHP
  • javaでのセッションについて

    javaでのセッションについてお聞きしたい事があります。 セッションについて下記のページを参考にしました。↓ http://www.atmarkit.co.jp/fjava/javafaq/session/session04.html このページにセッションのタイムアウトについて書いてあったのですが、 その中の文章で 「Webアプリケーションの場合は、ユーザーが処理の途中でブラウザを閉じるということもありますので、必ずしもログアウト処理が行われるとは限りません。このような場合は、クライアント側は処理を終了しているのにもかかわらず、サーバ側にはそのクライアントに対するセッション情報が残ってしまいます」 というのがあったのですが、 自分の作成したwebアプリケーションで セッションを開始した(セッションオブジェクト(HttpSessionインターフェースのオブジェクト)作成)後、明示的に(コーディング上で)セッションを終了していないのに、ブラウザの右上の×ボタンで閉じた後、再びwebアプリケーションで処理を開始すると、セッションオブジェクトがnullになっていました。 ここで、「セッションオブジェクトがnull」=「セッション情報が残っている」と言うのは、間違いでよろしいのでしょうか? 自分は上記の文章で、「セッション情報が残っている」=「セッションオブジェクトがnullでない」と解釈しているのですが。 何か分かる事がありましたら、ご教授お願い致します。

    • ベストアンサー
    • Java
  • hiddenによるセッション管理について。

    hiddenによるセッション管理について。 セッション管理にクッキー利用、URLライティング、hiddenによる3つの方法があると聞きました。 今まではクッキー利用によるセッション管理だったのですが、使えない場合も出てくることを考えて他の方法を試してみようと思いました。 質問1. URLライティングはリンクによる実行時のみ有効という認識でよいのでしょうか。submitによる実行はクッキーまたはhiddenによる方法しか使えないと考えてよいのでしょうか。 質問2. 下記のようにセッションIDをhiddenでサーバに送信しようとしたのですが、サーバ側でも何か処理が必要なのでしょうか。 <input type="hidden" name="jsessionid" value="<%=session.getId()%>" /> 想定ではクッキーの場合と同じくサーバ側でよろしくやってくれるのかと思ったのですが、実際に実行してみるとうまくセッションが引き継がれません。 そこでサイトを探していたところ下記のような記述を見つけました。 「HttpSessionとは異なり、HIDDENパラメータの埋め込みやパラメータの解析などの処理を、開発者が実装する必要があります。」 「HIDDENパラメータの埋め込み」というのは上記の記述になると思うのですが、パラメータの解析というのをサーバ側のプログラム(strutsを利用していますので、アクションやサーブレット?)で何か処理が必要なのでしょうか。 いまはクッキー利用と同じく下記のようにしてしまっていますが、たぶんこの記述を何かに変えないといけないのかなと思っています。 HttpSession session = req.getSession(); hiddenによる実際のサンプルコードをいま探しているところなのですが、いまのところ見つかっていません。 もしよろしければアドバイスをいただけると助かります。

    • ベストアンサー
    • Java
  • cookieについて

    情報の勉強 超初心者です。 教科書に 「クッキーとはwebサーバーが発行したデータをウェブブラウザを通じて訪問者のコンピュータ(クライアント)に一時的にデータを書き込んでテキストファイルで保存する仕組みとあります。」 下記質問です。 1.具体的なイメージがよくわきません。具体例でどのようなことを指すのでしょうか。 2.なんのためにそのようなことをするのでしょうか。誰にとってどのような メリットがあるのでしょうか。 3.実際にはどのように使われているのでしょうか。 なにとぞよろしくお願いします。

  • [PHP]セッション破棄について

    はじめまして。 phpを始めて1週間の初心者です。 現在、ホームページでログイン処理とログアウト処理をphpのセッションを使って作成しています。 今回質問させて頂くのはログアウト処理についてです。 ログアウト処理をでセッションを破棄する際に http://oshiete1.goo.ne.jp/qa3224862.html を参考にして下記の処理を行わせています。 -------------------- logout01.php -------------------- <?php session_start(); $_SESSION = array(); if(isset($_COOKIE[session_name()])){setcookie(session_name(),'',time()-4200,'/');} session_destroy(); header("location: http://~トップページのURL~/"); ?> -------------------- 確認をしたところ、ログインしたユーザの情報は削除されているようでした。 また、http://oshiete1.goo.ne.jp/qa3224862.htmlを参考に下記のようなログアウト処理も行わせてみました。 -------------------- logout02.php -------------------- <?php session_start(); unset($_SESSION['access']); header("location: http://~トップページのURL~/"); ?> -------------------- 同じく確認したところ、ログインしたユーザ情報は削除されているようでした。 -------------------- 環境 -------------------- <サーバ> 【OS】 windows XP(テスト環境)、CentOS 5.2(公開環境) 【PHP】 5.2.6 【Apache】 2.2 <クライアント> 【OS】 windows XP 【ブラウザ】 Firefox 3.0.8 IE 7 -------------------- -------------------- 質問 -------------------- (1)logout01.phpとlogout02.phpの違いは何でしょうか。 (2)「unset($_SESSION);」は使用すると「$_SESSION」が使えなくなるとのことですが、  それはphpを再インストールしない限りは使えなくなるということでしょうか。  それとも、ブラウザを再起動すれば使えるという意味でしょうか。 (3)「unset($_SESSION);」と「unset($_SESSION['access']);」では何が違うのでしょうか。 (3)セッションを使用するとサーバ側にセッションIDを保存したファイルが保存され、  クッキーがクライアント側に保存されるとのことですが、logout01.phpとlogout02.phpを  実行した場合、サーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 (4)セッションの有効期限を指定していないため、logout01.phpとlogout02.phpを実行せずに  ブラウザを終了させた時もログインしたユーザ情報は削除されているようでしたが、  この場合もサーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 初歩的な質問で申し訳御座いませんがよろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう