[4] [[Cookie]] ははじめに [[Netscape Navigator]] で実装され、開発者向けに仕様案が公開されました。 [[Cookie]] は後に [[IETF]] で標準化されて [[RFC]] となっていましたが [[Netscape]] の仕様と互換性が無いためほとんど無視され、[[Netscape]] の公開した仕様書 (と実装) が事実上の標準になっています。 * 仕様書 - [1] [CITE[Client Side State - HTTP Cookies]] [2] >Preliminary Specification - Use with caution [INS[(予備仕様—心して使うべし)]] と書かれていましたが、この仕様が現在まで事実上の標準となっています。 *BNF ;; Netscape の仕様を元に作成 [PRE(ABNF code)[ http-response /= Set-Cookie http-request /= Cookie Set-Cookie = "Set-Cookie:" set-cookie-content set-cookie-content = [FWS] cookie-pair *([FWS] ";" [FWS] parameter) [FWS] [";"] [FWS] Cookie = "Cookie:" [FWS] cookie-pair *([FWS] ";" [FWS] cookie-pair) [FWS] parameter = expires-parameter / domain-parameter / path-parameter / secure-parameter cookie-pair = name "=" value expires-parameter = "expires=" cookie-date domain-parameter = "domain=" ["."] dot-atom path-parameter = "path=" abs_path secure-parameter = "secure" name = 1*cookie-char value = *cookie-char cookie-date = abs_path = cookie-char = ]PRE] *Set-Cookie: 領域 1つの応答頭に複数あっても良い。 (てことは読点区切り連結に出来るんだろうか?) *NAME=VALUE (上の BNF では cookie-pair) 「a sequence of characters excluding semi-colon, comma and white space」 が入るらしい。元の集合「characters」の定義が不明。 HTTP の OCTET なら 8ビット透過, CHAR なら7ビットの範囲のみ。 実際には8ビットの範囲で使うと化ける UA があるらしいから、 7ビットの範囲にしておくのが無難。 Netscape の仕様では、 「;」, 「,」, 空白間隔が入る時は URI のように %符号化するのを 薦めている。 (他の符号化方法を使っても良い。) http-token 以外 の文字は全部 %符号化した方が安全かも。 *expires (期限切れ) 属性 RFC 822, RFC 850, RFC 1036, RFC 1123 を元にして、 時間帯は GMT 固定と書いてある。これだけ読むと [[HTTPの日付形式]] の様に思われるが、書式はこれだって (前項の cookie-date が) 示されている上、日付の要素間の「-」は必須らしい。 cookie の有効期限を指定。 過去の日付を指定したらその cookie を (既にあれば) 削除。 日付指定の無い cookie は記録されず、そのセッションのみ記憶。 Netscape Navigator 1.1 以前では不具合により、 path 属性 を明示的に「/」と指定しないと適切に働かないと Netscape の仕様 には書いてある。 必然的に間隔が含まれるけど、'''「"」で括ってはいけない'''。 (なんていう仕様だ!) *domain 属性 cookie は後方一致するドメインについてのみ有効。 > Only hosts within the specified domain can set a cookie for a domain > and domains must have at least two (2) or three (3) periods in them > to prevent domains of the form: ".com", ".edu", and "va.us". Any domain > that fails within one of the seven special top level domains listed > below only require two periods. Any other domain requires at least three. > The seven special top level domains > are: "COM", "EDU", "NET", "ORG", "GOV", "MIL", and "INT". 当該ドメイン中のホストだけが指定ドメイン向けの cookie を設定できて、 しかもドメインは、「.com」, 「.edu」, 「va.us」みたいのを防ぐために、 最低でも 2 つか 3 つの句点 (ピリオド) が無いといけない。 次に挙げる7つの特別最上位ドメインの中に入るドメインだけは、 句点 2 つが必須。その他のドメインは最低 3 つ必要。 7つの特別最上位ドメインは (上記引用文参照)。 ;; その後追加された gTLD はどーするんだろね? [[汎用JPドメイン名]]みたいなところも困りそう。 既定値は HTTP 応答の発行元サーバーのホスト名。 *path 属性 cookie が有効な URI の範囲を指定。 HTTP URL の abs_path と前方一致。 Netscape の仕様にはっきり書いてないけど、必ず「/」で始まるってことになろう。 既定値は cookie を含んでいた文書の URI のもの。 *secure 属性 これがついてたら、安全な場合 (実質 HTTPS のみ) でのみ cookie は送り返される。 既定値はこの属性なし。 (値を取らない属性) *例 -Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT -Cookie: CUSTOMER=WILE_E_COYOTE -Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/ -Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001 ;; 以上の例は Netscape の仕様から。日付の年は実際には4桁じゃないと いけないらしい。 * メモ -[[HTTP]] --[[Cookie]] --[[CGI]] --[[HTTP/1.0]] --[[HTTP/1.1]] -[[Netscape Navigator]] -[[Internet Explorer]] [3] 日本語訳 他にも訳があったけど Not found。