# 11.19 `Cookie` -- HTTPの状態管理

`Cookie`モジュールはHTTPの状態管理機能であるcookieの概念を抽象 化、定義しているクラスです。単純な文字列のみで構成されるcookieのほか、 シリアル化可能なあらゆるデータ型でクッキーの値を保持するための機能も備 えています。

このモジュールは元々RFC 2109とRFC 2068に定義されている構文解析の規 則を厳密に守っていました。しかし、MSIE 3.0xがこれらのRFCで定義された文 字の規則に従っていないことが判明したため、結局、やや厳密さを欠く構文 解析規則にせざるを得ませんでした。

exception `CookieError`
  属性やSet-Cookie:ヘッダが正しくないなど、RFC 2109に合致してい ないときに発生する例外です。

class `BaseCookie`( | [input])

  このクラスはキーが文字列、値が`Morsel`インスタンスで構成される辞書風オブジェ クトです。値に対するキーを設定するときは、値がキーと値を含む `Morsel`に変換されることに注意してください。

  inputが与えられたときは、そのまま`load()`メソッドへ渡され ます。

class `SimpleCookie`( | [input])

  このクラスは`BaseCookie`の派生クラスで、`value_decode()` は与えられた値の正当性を確認するように、`value_encode()`は `str()`で文字列化するようにそれぞれオーバライドします。

class `SerialCookie`( | [input])

  このクラスは`BaseCookie`の派生クラスで、`value_decode()` と`value_encode()`をそれぞれ`pickle.loads()`と `pickle.dumps()`を実行するようにオーバーライドします。

  リリース 2.3 以降で撤廃された仕様です。 このクラスを使ってはいけません! 信頼できないcookieのデータか らピクルス化された値を読み込むことは、あなたのサーバ上で任意のコードを 実行するためにピクルス化した文字列の作成が可能であることを意味し、重大 なセキュリティホールとなります。

class `SmartCookie`( | [input])

  このクラスは`BaseCookie`の派生クラスで、`value_decode()` を、値がピクルス化されたデータとして正当なときは `pickle.loads()`を実行、そうでないときはその値自体を返すよう にオーバーライドします。また`value_encode()`を、値が文字列以外 のときは`pickle.dumps()`を実行、文字列のときはその値自体を返 すようにオーバーライドします。

  リリース 2.3 以降で撤廃された仕様です。 `SerialCookie`と同じセキュリティ上の注意が当ては まります。

関連して、さらなるセキュリティ上の注意があります。後方互換性のため、 `Cookie`モジュールは`Cookie`というクラス名を `SmartCookie`のエイリアスとしてエクスポートしています。これはほ ぼ確実に誤った措置であり、将来のバージョンでは削除することが適当と思わ れます。アプリケーションにおいて`SerialCookie`クラスを使うべきで ないのと同じ理由で`Cookie`クラスを使うべきではありません。

参考資料:

RFC 2109, HTTP State Management Mechanism
  このモジュールが実装 しているHTTPの状態管理に関する規格です。