はじめに
去年ぐらいからCookieに関する議論が活発に行なわれているように感じます。そこでCookie関連の最新動向について仕様の観点から幾つか列挙します。
- Deprecate modification of 'secure' cookies from non-secure origins
- Cookie Prefixes
- Same-site Cookies
- A Retention Priority Attribute for HTTP Cookies
- Content Security Policy: Cookie Controls
GoogleのMike West氏による提案がほとんどです。議論はIETFのHTTPbis WGやW3Cで行なわれており将来的には正式に標準化されるものもあるでしょう。
また、幾つかはChromeへの実装が進められています。
(間違いなどありましたらご指摘下さい)
Deprecate modification of 'secure' cookies from non-secure origins
非セキュアなオリジン(http://)から、secure属性の付いたCookieをセットできないようにする仕様。既にsecure属性が付いたCookieが保存されていたとしても、非セキュアオリジンから上書き出来ないようになります。
「HTTPSを使ってもCookieの改変は防げないことを実験で試してみた」の記事で指摘されているような、中間者攻撃によるCookieの改変が防げるようになります。
Chrome 52で導入される予定のようです。
Cookie Prefixes
サーバ側からはユーザエージェントが保存しているCookieにどのような属性が付いているか確実に知る方法はありません。自身がセットしたCookieといえど、Cookieを共有するサブドメインやJavaScriptに属性を変更されている可能性もあります。
そこで、Cookie名にプレフィックスを用いることで属性を強制する仕様になります。
以下のように、Cookie名に__Secure
といったPrefixをつけます
Set-Cookie: __Secure-SID=12345; Secure; Domain=example.com
仕様の中で定義されているPrefixは2つです
-
__Secure-
secure属性がついていないCookieは拒否される -
__Host-
secure属性がついている。path属性が/
。domain属性が設定されていない。
現在議論中の仕様での実装が Chrome 49で導入されているようです。
Same-site Cookies
当初はFirst-Party-Only Cookieと呼ばれていた仕様ですが、今はSame-site Cookieという仕様になっています。
SameSite属性という属性を新たにCookieに追加する仕様です。このSameSite属性が付いたCookieはクロスサイトなリクエストには付与されなくなります。クロスサイトなリクエストには条件は幾つかアリますが、リクエストの起因となったオリジンと、リクエスト先のオリジンが異なるようなリクエストなどです。これにより、例えばCSRF攻撃などを緩和することが出来ます。
SameSite属性はその他の属性と同様に、以下のように設定できます
Set-Cookie: SID=31d4d96e407aad42; SameSite
Chrome 51で試験導入されているようです。
A Retention Priority Attribute for HTTP Cookies
サーバからCookieの優先度を指定できるようにする仕様です。ユーザエージェントが容量の問題等でCookieを削除する際にその優先度を見て削除可能にするものです。Cookieを削除する際に、セッションIDといった重要なCookieの削除を避けられるようになります。
Low, Medium, Highという三段階で優先度を指定できます。
Chromeは以前導入されていたらしく、29までは導入されていたらしい。
Content Security Policy: Cookie Controls
CSP(Content Security Policy)に、新しくcookie-scopeと言うディレクティブを追加する仕様です。HTTPレスポンスのSet-Cookieヘッダと、JavaScriptからdocument.cookieで設定できるCookieを制限します。
その他と同様に以下のように指定します。
Content-Security-Policy: cookie-scope none
設定できる値は以下のとおりでです
-
host
: domain属性が付いている場合はブロックされる。 -
http
: Set-CookieヘッダからのみCookieをセットできる。document.cookieからはセットできない。 -
none
: 全てブロックする -
secure
: secure属性の付いたCookieのみを許可する。それ以外はブロックする。