管理職サラリーマン。

様々な職種を経験してきた中途半端な管理職サラリーマンが贈るブログ

【徹底解説】セッションクッキー(Session Cookie)と永続的クッキー(Parmanent Cookie)

今回は、クッキー(Cookie)をより詳細に取り上げていきます。

↓前回の記事はこちら↓ www.pdm.tokyo

前回は、アフィリエイトで使われるクッキーについて、ドメイン観点での種類について簡単な説明をしました。 ファーストパーティクッキーとサードパーティクッキーについてですね。

実はファーストパーティクッキーには、セッションクッキーを利用する場合があったり、セッションクッキーを利用せず永続的クッキーを利用してするケースがあります。 また、サードパーティクッキーも同様で、どのようなクッキーを利用するかは様々です。

今回は、そんなセッションクッキーと永続的クッキーについて、解説していきます。

1. 改めてクッキーについて

クッキー(Cookie)は、Webサービスの利用ユーザーにとっては分かりにくいものですよね。

理由としては、HTTPヘッダーというヘッダーに格納される情報で、意図的に確認しない限り、ユーザには見えないからです。

さらに、クッキーがくせ者な理由は、同じことを指すのにもかかわらず、サーバー側/ブラウザ側で利用される言葉が異なる点です。 サーバーではセッションID、同じ情報をブラウザではクッキーやセッションクッキーと呼んでいます。

さらにさらに、前回のブログでも取り上げた通り、技術的には同じ仕組みのクッキーでも、ファーストパーティクッキーと呼んだり、サードパーティクッキーと呼ぶケースもあります。

これでは、分からないというのは当然ですよね。。。

2. セッションクッキー

セッションクッキーとは?

Webブラウザで、あるショッピングサイトを訪問したとします。

このときは、Webブラウザはクッキー情報はない状態でアクセスします。

ショッピングサイトのサーバは、初めて訪問をしたユーザに対して、そのユーザのログインIDとパスワード情報を紐づけたセッションIDというのを発行します。

サーバ側では、そのセッションIDをデータベースに保存しておきます。

↓データベース内の情報↓

ユーザ パスワード 有効期限 セッションID
hatena pass 60分 1234567890abc

これで、セッションIDを見るだけで、どのユーザか判別することができます。

基本的には、サーバー側はあくまでもこのセッションIDを保持するだけです。

ここまでの説明では、まだクッキーというキーワードは出てきてませんね。

続いて、サーバーはセッションIDを付与したHTTPヘッダーをWebブラウザ(ユーザ)に返答します。

Webブラウザは、そのセッションIDをセッションクッキーとして保存しておきます。

ここで、初めてクッキーというワードが出てきました。

セッションクッキーは1234567890abcというランダムな値となります。 もちろん、サーバ側で保存されているセッションIDと同一のものとなります。

ショッピングサイトに滞在している間は、WebブラウザはずっとセッションクッキーをHTTPヘッダに付与してアクセスし続けます。

なぜ、セッションクッキーが必要なのか?

一見すると、ショッピングサイトのサーバ側がずっとそのユーザのログイン状態を保持していれば問題はありませんよね?

ところが、Webサイトで利用されるHTTPというのはそのような仕組みのプロトコルではありません。

HTTPはセッションレスという状態を持たないプロトコルです。 TCPはセッションを持ちますが、その上位のHTTPは持ちません。

そのため、仮にセッションクッキーを持たずにWebアクセスをしたとすると、Webサーバ目線では同一のユーザからのアクセスが全て一見さん(異なるユーザ)に見えてしまいます。

これをショッピングサイトの例で説明しますね!

ユーザが「購入ボタン」を押して商品購入を進めようとしても 次のページに遷移した際に、サーバ側はユーザ(セッションクッキー)の過去の行動を覚えていないため ショッピングカートは空っぽの状態になってしまいます。

こんなショッピングサイトなんか、絶対に利用したくないですよね? 何度やっても購入までいかないなんて。。

ということで、実際の使われ方は色々ありますが、セッションクッキーは今のWebサービスにおいては非常に重要な役割となっています。

セッションクッキーの有効期限(サーバ側)

セッションクッキーは、セッションIDという名前でサーバ側に保存されると説明しました。

つまり、サーバ側(Webアプリケーション)で、このクッキーの保存期間を自由に定めることができます。

保存期間を無限にすることもできます。

また、サーバ側でクッキーの有効期限が10分と設定されていても、先にブラウザ側でセッションクッキーを削除することも可能です。 この場合には、ブラウザはクッキーなしでサーバにアクセスするので、一見さん扱いでのアクセスになります。

そのため、有効期限については、サーバ側とブラウザ側の双方の設定によるということが実際のところです。

セッションクッキーの有効期限(ブラウザ)

セッションクッキーは、ブラウザ側のメモリに一時的に保存されます。

ここがキーポイントとなります。

セッションクッキーは、メモリへの保存なので、ブラウザを閉じるとセッションクッキーが消えます。 ※ブラウザのタブを閉じてもセッションクッキーは残ります。

つまり、セッションクッキーを削除したいということであれば、ブラウザを閉じれば完了となります。

ただし、ブラウザごとに動きが違ったりするので設定画面よりクッキーは制御するのがより確実です。

Chromeの場合には Chromeの設定で「起動時」に「中断した箇所から続ける」を選択している場合には 一時ファイルとして保存されているのか ブラウザを閉じてもセッションクッキーは保持されますので注意が必要です。

その場合には Chromeの設定で、[ブラウザを終了するまでローカル データを保存する] にチェックすると、中断した箇所から続けてもセッションクッキーを消すことができます。

セッションクッキーについて、イメージを掴むことはできましたでしょうか?

3. 永続的クッキー

永続的クッキーとは?

永続的を英語でいうとParmanent(パーマネント)ということから パーマネントクッキーと称されることもあります。 セッションクッキーは、ブラウザを閉じると削除されますが、 永続的クッキーは、ブラウザを閉じても削除することはできません。

さらに、PCやスマホをシャットダウンさせて、その後ブラウザを立ち上げても、Cookieを使うことができます。

このようなことから、永続的クッキーと呼ばれています。

永続的Cookieの保存方法

セッションクッキーは、クッキー情報(セッションID)をブラウザのメモリに保存されます。

メモリというのは、基本的には作業を終了させるとデータがなくなりスッキリします。 ブラウザのメモリだけではなく、PCのメモリについても同様です。

では、ブラウザを閉じても永続的クッキーが消えないというのは、メモリ以外のどこかに保存してあるということになります。

さぁ、どこでしょうか??

答えは、テキストファイルやその他形式のファイルとして保管されます。

そのため、実体ファイルがあるので、ユーザ側もその中身をテキストのように閲覧できたり、編集したり、削除できてしまうものとなります。

例えば、デスクトップ上にメモ書きしたテキストファイルは、PCを落としても勝手に削除されたりはしないですよね。 それと同じで、削除されないですし、編集も可能です。

永続的クッキーの保存場所は?

場所としては、OS、ブラウザ、それらのバージョンごとに異なります。

またファイルの種類も単なるテキストファイルであったり、Sqliteと呼ばれるタイプだったりします。

エクスプローラで下記のパスを検索してみてください。 バージョンによっては保存場所は異なるのでご了承ください。

  • Windows+FireFoxの例
%APPDATA%\Mozilla\Firefox\Profiles\xxxxxxxx.default\cookies.sqlite
  • Windows+Chromeの例
%UserProfile%\AppData\Local\Google\Chrome\User Data\Default
  • Windows+IE 11の例
\AppData\Local\Microsoft\Windows\INetCookie

sqlieteファイルの閲覧方法

そのままテキストエディタで開くと見にくいものです。 sqliteはデータベースの名前で、そのデータベース用のファイル形式です。 SQLite Expert Personalなどのフリーソフトにて閲覧することができます。

クッキー情報は他のブラウザとの共有するのか?

Cookieの保存場所をご紹介した通り、ブラウザごとに形式や保存場所が異なります。

そのため、クッキーはブラウザ間で共有することはできません。

つまり、クッキーはOSではなく、ブラウザのものということになります。

サーバから送られる永続的クッキーの正体

ブラウザがWebサイトに訪問したら、そのWebサイトのサーバからのHTTPレスポンス内に以下のような情報が付与されます。

Set-Cookie: クッキー名=クッキー値; expires=有効期限; domain=ドメイン名(サーバ名); path=パス; secure

これが、クッキーの正体です。

各項目は、下記のようになっています。

  • クッキー名 = クッキー値 ブラウザーに保存したい変数名(クッキー名)とその値(クッキー値)をセットします。スペース、カンマ、セミコロンは含まれてはいけません。そのため URL エンコードをする必要があります。(後述) クッキーをセットする際には、この項目のみが必須です。

  • expires(有効期限) クッキーの有効期限をセットします。有効期限は GMT で指定します。フォーマットは以下のとおりです。

Wdy, DD-Mon-YYYY HH:MM:SS GMT

有効期限が省略されると、テンポラリークッキーとして扱われます。つまり、ブラウザーを閉じた時点で、そのクッキーは無効となります(つまり、セッションクッキーと同様の扱いがなされます)

  • domain(ドメイン) セットしたクッキーが送信されるドメインを指定します。サーバ名で指定すれば、指定サーバへのアクセスの時だけセットしたクッキーを送信します。ドメインが省略されると、そのときアクセスしたサーバ名がセットされます。

  • path(パス) セットしたクッキーが送信されるパスを指定します。パスが省略されると、アクセスしたリソース(HTML、CGI)のパスがセットされます。

  • secure (secure属性) この項目が指定されていると、アクセス先が SSL などのような安全なサイトの場合のみにクッキーを送信するようになります。ドメイン、パスが一致したとしても、アクセス先が安全とみなされないと、クッキーを送信しません。

永続的クッキーのセキュリティ問題

一般に、永続的クッキーは以下のようなセキュリティ課題を抱えているとされています。

セキュリティリスク
  • クッキーは、ファイルとして保存されるので改ざんされる恐れがある
  • ファイルが盗まれると、セッションハイジャックされる恐れがある
  • クラスサイトリクエストフォージェリ攻撃をされる可能性がある
  • クッキーに個人情報を付与してくるWebサイトもあり、その場合に中間者攻撃されると情報が抜かれている恐れがある
  • 端末紛失時に永続的クッキーファイルをコピーされ、他の端末で使用される恐れがある(端末が見つかったとしても悪用され続ける可能があります)
サーバ側でできる対策
  • secure属性を使い、平文ではクッキーを送れないようにする。そうすることで中間者攻撃されても容易には解読できない。
  • クッキー自体に個人情報(ユーザ名など、パスワードは絶対NG)を載せず、十分大きな乱数によるセッションIDを用いる。
ブラウザ側(利用者側)でできる対応
  • ブラウザにて、定期的にクッキーを削除する。(代償として便利さを失いますので、現実的ではないかも)
  • 全ては難しいので、オンラインバンキングなど金銭に絡む利用サイトや、ログインする必要のあるWebサイト(つまり個人情報をすでに渡している)に関しては、クッキー利用法についてポリシーを読んでおくことをお勧めします。(読んだところで理解するのが難しいので、これも現実的ではないかも。信頼できる企業のWebサイトかどうかというのが分かりやすい指標かなと考えてます)
  • 上記のようなWebサイトにおいてはHTTPのみのサイトは利用しないようにする。

長文となりましたが、以上となります。 セッションクッキーと永続的クッキーについての解説でした!