Cookieの改訂版仕様 rfc6265bis について、その変更点をざっと眺めていく
- はじめに
- SameSite属性
- Cookie名プレフィックス (Cookie Name Prefixes)
- 非セキュアなオリジンからの Secure属性の上書きを禁止
- nameless cookieの許容
- Cookie名、Cookie値の上限長の指定
- Expires属性の年が2桁の場合の処理の指定
- Max-Age/Expires の上限
- その他
はじめに
Cookieの仕様は『RFC 6265: HTTP State Management Mechanism』として標準化されています。
そのCookieの仕様の改訂版が『rfc6265bis』と呼ばれているもので、現在標準化作業が進められいています。"SameSite属性"や”Cookie名プレフィックス”などが仕組みとして追加されているほか、仕様として曖昧だった部分が明確化されています。
これらの機能はすでにブラウザに実装されているため、今回の改訂で大きくCookieの仕組みが変わるということはありません。
そんなrfc6265bisの仕様だが、標準化作業を進めているIETF HTTPWGにおいて"Working Group Last Call"が呼びかけられました。この段階までくれば、機能追加などの大きな変更は入らないと思われます。
Cookie名プレフィックス (Cookie Name Prefixes)
今まで、一度セットしたCookieの属性をサーバ側から確認する方法はありませんでした。サーバ側からすると送られてきたCookieについて、預かり知らぬところで属性が変更されている可能性もあるわけです。
Cookie名プレフィックスを付与することで、属性を保証できるようにします。
__Secureプレフィックス
Cookie名を"__Secure"から始めることで、Secure属性がついていることを保証します。
ブラウザはSecure属性のついてないCookieを拒否します。
(サーバ側からするとこのプレフィックス付くCookieが送られてきたら、Secure属性がついてると確信できる。)
ブラウザはこのCookieは拒否します。
Set-Cookie: __Secure-SID=12345; Domain=site.example
__Hostプレフィックス
Cookie名を"__Host"から始めることで、『Secure属性・Path属性==/・Domain属性無し 』であることを保証します。
ブラウザはそうではないCookieを拒否します
ブラウザは以下のようなCookieを拒否します
Set-Cookie: __Host-SID=12345 Set-Cookie: __Host-SID=12345; Secure Set-Cookie: __Host-SID=12345; Domain=site.example Set-Cookie: __Host-SID=12345; Domain=site.example; Path=/ Set-Cookie: __Host-SID=12345; Secure; Domain=site.example; Path=/
非セキュアなオリジンからの Secure属性の上書きを禁止
非セキュアなオリジン(例: スキームがhttp)から、secure属性がついたCookieを上書きを禁止。
例えば、パブリックなWiFi利用時に中間者攻撃にてhttp://~なURLへ誘導され、secure属性を消すような攻撃を不可能にします。
nameless cookieの許容
名前の無いCookie(nameless Cookie)は、RFC6265時点で拒否するよう指定されていますが、実際に使用されているケースが有るため、受け入れるように変更されました(ただし非推奨)。
例えば次のようなset-cookieヘッダがnameless Cookieの例になります。
set-cookie: =hoge set-cookie: hoge
上記のように設定されたCookieは、リクエスト時に次のように付加されます
cookie: hoge
ただし、以下のような名前も値も無いset-cookieは無視されます
set-cookie: =
Cookie名、Cookie値の上限長の指定
Cookie名とCookie値の合計が4096バイトより大きい場合、ブラウザは保存処理時にそのエントリを無視する。
(以前はShouldだったが保存アルゴリズムに組み込まれた)
Expires属性の年が2桁の場合の処理の指定
Expires属性は通常 4桁で年が表記されますが、2桁も許可されています
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT
2桁の場合は、以下のように解釈するよう明示されました
- 70~99の場合は1900年代を示す
- 0~69の場合は2000年代を示す
Max-Age/Expires の上限
Max-Age/Expiresの上限を400日とした。
その他
その他にも細かい修正が幾つかある、rfc6265からの差分については提案仕様を参照してください。
- Cookie2, Set-Cookie2のIANA登録を削除
- 制御文字やタブ文字の拒否
- ”Secureコネクション”かどうかはユーザエージェントによって判断され、localhostも含まれうる
- Service Workerでの取り扱いの追加
今回入らなかった機能
Cookieに対する取り組みは幾つかありますが、今回の改訂には含まれていないものもあります。
幾つか紹介します
- Chromeで実装が行われているCHIPSと呼ばれる仕組みも IETFで標準化が進められています。draftとして「Cookies Having Independent Partitioned State specification」も提出されています
- Cookie Layeringは、Cookieの仕様ついてヘッダ・Fetch・HTML・Clear Dataなどブラウザでの利用が複雑になっている中で、仕様の構造を再整理したいというモチベーションです
- W3Cでの議論が参考になります 「スライド:The Future of Cookies 」