• 締切済み

セッション(session)ってクッキー(cookie)とどう違うの?

セッションはクッキーが有効になってないと使えないと本で覚えました。そしてセッションの仕様として「そのウィンドウでのみ有効。閉じたら破棄される」ともありました。しかしこれではexpires(有効期限)を設定しないクッキーと違いがないように思うのですが・・・。セッションとクッキーの相違点はどのようなものなのでしょうか?またそれをどのように生かす方法があるのでしょうか?

  • PHP
  • 回答数6
  • ありがとう数21

みんなの回答

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.6

スーパーグローバルで言うところの$_SESSIONと$_COOKIEの違いと理解させていただきます クッキーはクライアント側(パソコン側)に様々な情報を保存させる セッションは、サーバー側に様々な情報を保存させる ここが大きくちがっています SESSIONはなぜ クッキー機能を使うかということですがNo4さんの仰るとおり、HTTP通信は、1アクセスごとにブチブチと切れてしまい、前後のページとの因果関係を引き継がないからです セッションIDと呼ばれる値のみをクッキーとして保存させておくのです クッキーはクライアント側(パソコン側)に全ての値を保存させますからユーザーが改変可能なのです 改変されても問題のない情報ならば良いのですが、例えばユーザーログインを必要とするサイトの場合は改変されたら大変です 例えばメールアドレス+パスワードでログインするシステムでログイン後に Login=TRUE という値をクッキーに保存させておくシステムがあったらどうなるでしょう ちょっと知識のある悪意ある人ならば、常にLogin=TRUEというクッキーを用意しておけば、他人のメールアドレスを知っているだけで、そのメールアドレス本人になりすましてログインし放題になりますよね そういったクライアント側に保存させておきたくない情報をサーバー側で保存する仕組みで、クライアント側には、セッションIDと呼ばれる値のみを保存させておきます サーバーとクライアント側のやりとりとしては、このセッションIDのみをやりとりしてセッションIDを基にサーバー側に保存させておいたSESSION値を読むわけです http://search.net-newbie.com/php/ref.session.html (ここで、「または、URL に埋め込みます」ってありますけど、URLに埋め込むような使い方は好ましくないです

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.5

がるです。すみません追伸をば。 #1さんや#2さんがおっしゃってるのは「セッション情報」という、「そのセッションに結びついた情報とかデータとか」のお話になります。 私が書いているセッションというのは「Web サイトを訪れたユーザがサイト内で行なう一連の行動」という行動の単位になります。 例えばこのあたりをご覧いただけると。 http://e-words.jp/w/E382BBE38383E382B7E383A7E383B3.html

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.4

がると申します。 んっと…全体的に色々と整理などしながら。 まず先に。 > セッションはクッキーが有効になってないと使えないと本で覚えました。 多くの場合においてYesですが「必ずCookieが必要か」というと「Cookieを使わないやり方もあります」。 んで。 まずCookieとは、httpという通信方法によって定められた「情報をやり取りするための方法の一つ」になります。 もうちょっと正確に行きますと「サーバ側からの依頼でクライアント側に情報を保存させ、それを受け取ることが出来るメカニズムである」と定義できます。 Cookieは、サーバ側からの「Set-Cookieヘッダ」によって情報がサーバからクライアントに伝達され、保存されます。 また、クライアントからサーバへのアクセス時に、送信すべきCookieを「Cookieヘッダ」によってクライアントからサーバへ伝達します。 という記述からわかるとおり、Cookieは厳密に通信手法の定まっている「実装」になります。 一方で。 HTTPは基本的に「1アクセス毎にぶつぶつと切れてしまう」ものなのですが、そのアクセスを「一人のユーザが一連のものとして」あつかいたいなんてケースが少なからずありまして。 その場合に「セッション」と呼ばれる「概念(私は哲学とか呼称しますねぇ)」を使って「どのユーザさんからのアクセスなのか」を識別したいなぁっていう部分があります。 ただ、セッションそのものはhttpという通信方法での固定的な規約はありません。つまり「やりたいなぁって気持ちはあるけどどうやったらいいかははっきりしていない」状態なんですね。 というわけで。「多くの場合において」、セッションという概念の実装のために、Cookieを用いる「ことが多い」ってのが実状です。 ただ、Cookieではなく、INPUTエレメントのhiddenを用いるなんて方法もあるので、セッションの実装は一概に「これだ」とはいえないのですが。 で。そのセッションの「実装方法によっては」、例えば「有効期限を設定しないCookieを使って」セッションを実装する、なんてぇことが起きるわけですね。 というわけで。CookieはRFCでも明示的に定められている一つの「仕様」であり「実装」ですが、セッションは飽く迄「概念」であり、実装ではありません。 これが最も大きな違いであると言えるかと思います。 技術よりな回答で恐縮ではありますが。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

話が色々と混線しているようです。 セッションと言った場合には2つの意味で使い分けられます。 「セッション」と「セッション管理」です。 > セッションはクッキーが有効になってないと使えないと本で覚えました。 そういう制約をかけるケースもあるということでしょう。 > そしてセッションの仕様として「そのウィンドウでのみ有効。閉じたら破棄される」 これは正しいです。アドレスを入力するかボタンをクリックすると画面が送られてきます。 これで1回のセッションは終わりです。次にボタンをクリックすると別のセッションとなります。 次は「セッション管理」の話です。 それでは都合が悪いのでクッキーやその他の方法(メッセージに情報添付)などで あたかもセッションが連続しているように見せかけています。↓ これによってクッキーの制約を取り除くことが出来るようになります。

参考URL:
http://www.scollabo.com/banban/php/php_14.html
回答No.2

感覚的には #1さんの感じですが、全く意味が違います。 クッキーは、クライアント(ユーザ)側にデータを保持しますが、セッションはサーバ側にデータを保持します。 http://www.1kara.net/printable.php?%2Fphp%2Fapp%2Fcookie.php クッキーはクライアント側にデータが保存されるため、改ざんする事が出来ます。また、クッキーに保存されたデータは同じサーバの別アプリからもアクセス出来るのでセキュリティ上問題がある可能性があります。 セッションの場合はクライアント側にはセッションIDのみが保持されるので、詳細情報はサーバ側に保持されるので比較的安全です。当然、セッションIDが盗まれれば同じ事ですが、セッションIDは自動的に予測不可なIDがその都度振られますので、比較的安全と思ってよいです。 時間的に見た場合は、比較的長いスパンで保持したいもの(不連続な接続、例えばログイン名等)はクッキー、時間的には短時間で、その都度変化していくもの(例えばカート内の数量や価格等)はセッション、と言う風な使い分けが出来ると思います。 参考まで。

noname#25358
noname#25358
回答No.1

 セッションはクッキーの拡張版です。  クッキー・バージョン2とでもいいましょうか。  クッキーはデータの最大容量が4キロしかなかったり、単純な構造のデータしか保存できなかったりと色々制限がありますが、その制限を取っ払ったのがセッションです。

関連するQ&A

  • クッキーとセッション

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

  • javascriptでクッキーを書き出しているんですが、確実にクッキー

    javascriptでクッキーを書き出しているんですが、確実にクッキーの値を上書きするにはどうすればいいのでしょうか? 通常では同じkeyがあれば上書きされるはずですよね?それなのに、クッキーの内容を確認すると同じkeyで値が違うものができていて判定ができない状態です。 上書きされないという問題の原因が自分ではわかりません。何か原因があるとすれば解決方法などありますでしょうか? どなたか是非ご教示の程お願いします。 /*クッキー作成の関数*/ function SetCookie(Value){ Expires = new Date(); //日付オブジェクト作成 Expires.setTime(Expires.getTime()+(1000*60*60*24*365)); //デフォルト1年有効 Expires = "expires=" + Expires.toGMTString(); //クッキーの有効期限を作成 SetData = "Area=" + escape(Value) + ";"; //クッキー名=値 を作成 document.cookie = SetData + Expires + ";domain=123456789;path=/;"; //クッキー発行 }

  • クッキーを使わないセッションの方法を知りたい

    ので勉強しようと探しているのですが見つかりません 概略の説明があるページは見つかったのですが具体的でないのでわかりませんでした クッキーを使うセッション方法については具体的に説明してあるページがあって理解できました クッキーを使わないセッション方法のページを紹介してください

    • ベストアンサー
    • PHP
  • sessionとcookieの設定内容の区別

    セッションとクッキーの使い分け方法を教えていただけないでしょうか? 簡単に言えばセッションがサーバサイド、クッキーがクライアントサイド、 セッション内容はブラウザ切れば消える(残すことも出来る)、クッキーはブラウザに残る、 と言うことは分かっているのですが、実装の仕方が分かりません。 例えばログインフォームでは$_SESSION['name']、$_SESSION['password']を回す・・・というのは分かります。 認証が終われば$_SESSION['name']、$_SESSION['password']は破棄して$_SESSION['login']=TRUE等を使うのではないかと思っております。 (そうではなくて、認証後は全て$_COOKIEで処理するのでしょうか?) で、$_COOKIEにはsessionIDが入っていると。 しかしながら、ブラウザ切っても暫くしてまたサイトを訪れたときにログイン状態が続くようにするにはどのようにすればいいのでしょうか? $_COOKIEにその情報を格納するのだと思うのですが、例えば$_COOKIE内にユーザidやlogin=OKのような文字を入れているとブラウザから見えてしまいます。 勿論ハッシュ化をして簡単には把握できないでしょうが、ここにはどんな情報が格納されているのか見当も付きません。 具体的な$_SESSION、$_COOKIEに入れるものと、サイトでの各々の実装法を教えていただけないでしょうか?

    • ベストアンサー
    • 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
  • Perl+セッションクッキーの使い方

    セッション管理のために良く使われる 「セッションクッキー」というものがあることを最近になって知りました。管理者画面などを作成する際に利用したいと思うのですが、使い方がよくわかりません。 Perlでセッションクッキーを利用する方法について詳しい情報が記載されている書籍やサイトなどの情報をご存知でしたら、教えてください。 (できれば書籍についての情報がありがたく思います) よろしくお願いします。

  • SESSIONとCOOKIE

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

    • 締切済み
    • PHP
  • CGI:Cookie保存期限の指定について

    CGI:Cookieモジュールを使用して、クッキーの設定を行っています。 そこで、保存期限の指定方法について教えて頂きたいのです。 日にち単位、年単位の保存方法はなんとかわかったのですが、 (-expires=>'+7d' -expires=>'+1y' で正しいですよね?) 時間単位での指定方法がわからないのです。 例えば、『毎時0分0秒にクッキーを消す』と言った指定はできるのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • セッションクッキーの有効期限について

    VC2010でWebアプリケーションを作成しております。 セッションクッキーを使用しているのですが、Webブラウザを閉じた時には、きちんと消えてくれますが、一定時間(20分)が経過したときは、消えてくれません。 数時間経っても、消えませんでした。 ちなみに、セッションクッキーではなく、セッション情報は、一定時間(20分)が経過した後、消えています。 下記、URLでは、一定時間が経過したときに消去されるようなことが書いてあります。 セッションCookie http://www.asp-user.jp/help/session_cookie/ timeoutに関しては、web.configで<sessionState timeout="20" />のように設定しております。 一定時間が経過したとき(timeout)の設定方法は、これ以外に何が必要でしょうか? WEBサーバ、もしくは、セッションステートサーバ側の設定(IIS)が必要でしょうか? IISのバージョンは、7.5です。 サーバの構成は、下記のようになっております。 ・WEBサーバ ・DBサーバ ・セッションステートサーバ(DBサーバと同じサーバ)

  • COOKIEを用いたセッション管理について

    input.phpでsetcookieを使ってcokkieを設定します。 有効期限は1時間です。 check.php→thanks.phpという流れで登録を行い、thanks.phpでcookieを破棄します。 リロードを行ったときにCOOKIEがないのでエラー処理が行われます。 check.phpに直接アクセスしたときもcookieがない場合はエラー処理を行います。 ここまではいいのですが、input.phpにアクセスしたときにthanks.phpで破棄したcookieがまだ生きているのです。 ここで新たにcookieを発行して新しいsessionを開始したいのですが、うまくいきません。 どのようにしたらいいのでしょうか? 1時間たたないうちにユーザが登録をしようとするとcookieの情報を元に更新されてしまいます。

    • ベストアンサー
    • PHP