Cookieの改訂版仕様 rfc6265bis の変更点

Cookieの改訂版仕様 rfc6265bis について、その変更点をざっと眺めていく

はじめに

Cookieの仕様は『RFC 6265: HTTP State Management Mechanism』として標準化されています。

そのCookieの仕様の改訂版が『rfc6265bis』と呼ばれているもので、現在標準化作業が進められいています。"SameSite属性"や”Cookieプレフィックス”などが仕組みとして追加されているほか、仕様として曖昧だった部分が明確化されています。

これらの機能はすでにブラウザに実装されているため、今回の改訂で大きくCookieの仕組みが変わるということはありません。

そんなrfc6265bisの仕様だが、標準化作業を進めているIETF HTTPWGにおいて"Working Group Last Call"が呼びかけられました。この段階までくれば、機能追加などの大きな変更は入らないと思われます。

SameSite属性

新しく定義されたCookieの属性であり、リクエストが同じSiteの時のみCookieが送信されるように制限できる。

属性値として次の値が指定できる

  • Strict: same-site のときのみCookieが送信される
  • Lax: same-siteもしくは、トップレベルナビゲーションじのときにCookieが送信される
  • None: same-site及びcross-site の両方でCookieが送信される

今まで、一度セットした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に対する取り組みは幾つかありますが、今回の改訂には含まれていないものもあります。
幾つか紹介します