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

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

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

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

クラス `BaseCookie`( | [input])

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

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

クラス `SimpleCookie`( | [input])

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

クラス `SerialCookie`( | [input])

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

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

クラス `SmartCookie`( | [input])

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

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

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

参考:

`cookielib`:モジュール
  Webクライアント向けの HTTP クッキー処理です。 `cookielib`と`Cookie`は互いに独立しています。.

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