Cookie(クッキー)の届く範囲

トップ > 気まぐれ実験 > Cookieの届く範囲

Cookieが届く範囲を再確認

別のページでCookieについて解説しましたが、 実際Cookieを利用したプログラムを作ると疑問に思えることも出てきます。 その一つとして、Cookieが届く範囲は?というものがあります。

発行されたサーバー(ホスト)に返信されるというのが基本ですが、 Cookieの仕様には「domain」や「path」というのがあったのを覚えてますでしょうか? (なにそれ?という方は下記のW3CのRFCか前回の解説をどうぞ、、、)

Cookieの仕様は下のリンクをどうぞ・・・
W3C (RFC 2109)HTTP State Management Mechanism
Netscape HTTP Cookies

Cookieの詳細については上のリンクで確認していただくとしても、 実際にプログラムを書く場合にどうやって使うの?という場面も多いと思います。 自分もCookieを利用するプログラムを書いていて、 あれ?ということも多いので、実際にCookieがどの範囲まで届き、どの範囲まで読めるのか ということを実験してみました。

具体的には、前回作成したCookieプログラムを 「domain」と「Path」を直接指定できるように改造し、 お互いサーバー(ホスト)からCookieを書き込んで、読めるかどうかを実験しました。

実際の仕様にはどう書かれているのか?

実験結果を列挙する前に、 Cookieの仕様には実際にどのように書かれているかをチェックしてみたいと思います。

If there is a tail match, then the cookie will go through path matching to see if it should be sent. "Tail matching" means that domain attribute is matched against the tail of the fully qualified domain name of the host. A domain attribute of "acme.com" would match host names "anvil.acme.com" as well as "shipping.crate.acme.com".

ドメインが合致しているかの比較を後方から行い、 合致していればPath(ディレクトリ)が合致しているかをチェックして Cookieを送るようなことを書いています。

例として、「domain=acme.com」が指定されていれば、 「anvil.acme.com」でも「shipping.crate.acme.com」でもOKであるということですよね。

Cookieの実験結果はどうなったか?

で、これらのルールを実際にCookieに適用して調べてみました。 下記のような条件を想定していただけるとわかりやすいと思います。

プログラムのあるURL:http://ABC.DOMAIN1.COM/program/
呼び出場所1:http://ABC.DOMAIN1.COM/
呼び出場所2:http://ABC.DOMAIN1.COM/program/under/
呼び出場所3:http://XYZ.DOMAIN1.COM/
呼び出場所4:http://XYZ.DOMAIN1.COM/program/
呼び出場所5:http://XYZ.DOMAIN1.COM/program/under/
呼び出場所6:http://ABC.DOMAIN2.COM/
呼び出場所7:http://ABC.DOMAIN2.COM/program

domain, pathの指定がない場合

基本的に、Cookieに「domain」や「path」を何も指定せずに書き込むと、 書き込みを行った「domain」や「path」が指定されることになります。
つまり、「domain=ABC.DOMAIN1.COM」「path=/program/」が指定されたのと同じ状態ということです。

この状態でそれぞれの場所からCookieが読めるか試してみると、読み込みが可能であったのは 書き出したプログラムがある場所および「呼び出場所2」のみということになりました。 (下の図の「program」というフォルダにあるお菓子箱が Cookieを書き出すプログラムだと思ってください。)

domain=ABC.DOMAIN1.COM path=/program/の場合

場所1では「domain」はマッチしていますが「path」がマッチしていません。
場所2では「domain」はマッチしていおり、「path=/program/」は 場所2「/program/under/」の上位となるので、下位である「/program/under/」から呼び出しが可能になります。
場所3では「domain」がマッチしていません。以下同じですね。

domainの指定なし,pathを指定した場合

次に、ドメインを指定せずに、Pathのみ指定してみました。 ですから、「domain=ABC.DOMAIN1.COM」となります。
「path=/」を指定すると、、、

domain=ABC.DOMAIN1.COM path=/の場合

場所1では「domain」「path」共にマッチています。
場所2では「domain」がマッチ、「path=/」は上位なので読み出し可となります。
場所3では「domain」がマッチしていません。以下同じですね。

逆に、「path=/program/under/」と下位を指定した場合は、 当然ですが、場所1の場合は読み出し不可となります(下の図を参照)

domain=ABC.DOMAIN1.COM path=/program/under/の場合

「program」フォルダにあるプログラムから書き出していますが、 pathに下位のフォルダを指定しているため、自分自身の位置でも Cookieを読むことができません。自分が書き出したCookieは自分で読める・・・ と思っていたのですが、読めないとは不思議な気もしますよね。

domainに別のホストを指定した場合

「domain=XYZ.DOMAIN1.COM」「path=/」を指定した場合はどうなるでしょうか?

この場合は、いずれの場合も読み込みができません。 これは、Cookieの仕様上、「domain」で指定される内容は、 実際にDNSでどのように指定されているかは別として、ドメイン名として捕らえるため、 別のドメインが指定されていると解釈されるからだと思います。

domain=XYZ.DOMAIN1.COM path=/の場合

ですので、いくら「ABC.DOMAIN1.COM」と「XYZ.DOMAIN1.COM」が同じドメインに属していても 「domain=XYZ.DOMAIN1.COM」と指定した場合にはCookieの書き込みが行われないようです。

domainに本当にドメインを指定した場合

では、同じドメインに属する違うホスト(サーバー:今の場合、 ABCというサーバーからXYZという別のサーバー)にCookieを渡したい場合はどうするのでしょうか?

「domain=.DOMAIN1.COM」「path=/」を指定してみました。 その結果ですが、
場所1~場所5までで、Cookieの呼び出しが可能となりました。

domain=.DOMAIN1.COM path=/の場合

場所6、7に関しては、ドメインが「DOMAIN2.COM」と 違うため、Cookieの書き込みが行われません。

ちなみに、「path」を「path=/program/」や「path=/program/under/」のように指定することで、 違うホストの特定のパスでCookieの読み出しを可能にできます。ん、、ややこしいですね。

domain=.DOMAIN1.COM path=/program/の場合

別のドメイン(DOMAIN2.COM)を指定した場合

最後に、「domain=DOMAIN2.COM」というように、別のドメインを指定した場合です。 仕様を読んでいるときにはそれも可能かと思ったのですが、実際は不可能です。 ドメインが違う場合(下から数えてgTLDの場合2つドットがある、それ以外の場合3つドットがある) にはCookieというのは書き込み、読み込みができないような仕組みになっています。

ですから、結果的に、どんなにがんばっても 「DOMAIN1.COM」の「ABC」サーバーの 「Program」フォルダにあるプログラムからは、 場所6、7に対してCookieのやり取りができないとの結論になりました。

domain=.DOMAIN2.COM path=/の場合

個人的には明示的にDOMAINを指定するのだから、可能だといいなぁ、、、と思ったのですが。

path の指定に関する注意とテクニック?

path で上位が指定されている場合に、その下位のディレクトリにあるプログラム等から Cookieを読み込むことが可能であることは以上の実験でわかったと思います。

ですが、path指定で注意しなければいけないのは、path を指定した場合に、 そのpathが同一かどうかの判断を上位からの文字列チェックのみで行っているようで、 次のような場合には上位とみなされるということです。

例:上位のディレクトリとして解釈される場合
「path=/abc」 と指定した場合、
ディレクトリが上下関係でないにもかかわらず下記結果となる。
/abc (読込可能)
/abcdef (読込可能)
/abc01 (読込可能)
/abcxyz (読込可能)
/ab (不可)
/abzz (不可)

結局、Cookieの仕様上「path」のチェックというのは、ディレクトリという単位で見ているのではなく、 単純に文字列を上から比較してマッチしているかどうかしか見ていないということになります。 (これは、そのような仕様であるとのことがかかれてます。 逆にドメインはしっかり全てマッチしているかどうかチェックしているようです。)

しかし、これを逆手に取れば、ディレクトリ(Windowsではフォルダか・・・)の名前を工夫することで Cookieを読める範囲を上手に操作することができそうです。

たとえば、
ABC.DOMAIN1.COM/system/ にあるプログラムからCookieを書き出して、
domain=ABC.DOMAIN1.COM path=/user と指定することで、下記のようにCookieの読込制御が可能です。
/ (不可)
/system/ (不可:ここから書き出しました)
/data/ (不可)
/user01/ (読込可能)
/user02/ (読込可能)
/user03/ (読込可能)

Cookieについての色々です

Cookie is yummy! 残念ならが、ここで実験したプログラムは公開していません。 なぜなら、このドメインにホストを2つ作ることができないからです。(レンタルですので・・・)

ですが、実際、個人でレンタルサーバー(サーバーの一部)を借りてサイトをしている場合に ホスト間でCookieをやり取りするような環境でプログラムを組むことは稀だとは思います。

逆に、気をつけなければいけないのは、ドメインの指定やPathを失敗すると、 共有で借りているレンタルスペースの場合、 他人にCookieを読まれてしまう可能性があるということですよね?

クロスサイトスクリプティング(XSS)などでCookieの情報を取られて、別なサーバーに送信、、、 なんていうことも聞きます。 Cookieにどのような情報を書き込むか、ということも含めて、 Cookieの使い方は気をつけないと、、、と実験して思いました。

実際、ウェブアプリを担当しているエンジニアの方々でも、 Cookieについて正しい理解をされている人が少ないので驚きですが、 なかなか奥の深い分野ですよね、、、私もまだまだ勉強中です。

(作成2005/02/11 by あいまい)

トップ > 気まぐれ実験 > Cookieの届く範囲

日時: 2008年01月21日 23:09
newsingに投稿BuzzurlにブックマークBuzzurlにブックマークlivedoorクリップに投稿 Choixにブックマーク イザ!ブックマーク このエントリーを含むはてなブックマーク
トップに戻る
このエントリーの所属カテゴリ: 気まぐれ実験の小部屋
このエントリーのタイトル:Cookie(クッキー)の届く範囲



copyright © 2000-2008 all rights reserved
あいまいモード・コム - rss2.0 atom
newsingに投稿BuzzurlにブックマークBuzzurlにブックマークlivedoorクリップに投稿 Choixにブックマーク イザ!ブックマーク このエントリーを含むはてなブックマーク