Cookieの属性を制限する Cookie Prefixesという仕様

"$Origin-"プレフィックスは削除され、"$Host-"プレフィックスが追加されました。 (2015/10/13追記)(2015/10/17 記事更新)


背景の、domain属性の指定に誤りがあったため修正しました。「domain=my-example.com」-> 「domain=example.com」(2015/10/14追記)


draft 05よりプレフィックスが$から__に変更されました(2015/12/1追記)


Googleの方によって「Cookie Prefixes」という仕様が提案されています(draft-west-cookie-prefixes-01


以下のCookieに関する仕様を提案しているMike West氏による提案である


また、既にChromiumのnet-dev メーリングリストでも話題に上がっています。
Intent to Implement: Cookie Prefixes
プレフィックスを付けるのは"ugly"だとしつつも、有用だという意見があるようです。

背景

Cookieに付いている属性が変更されていないことをサーバは確信できません。


ドメイン属性を付与している場合は、Secure属性をつけていたとしても、サブドメインのURLより属性が変更される可能性があります。


例えば、後からサブドメインからSecure属性無しのCookieで上書きできます。


以上の問題に対応するためにCookie名にプレフィックスを付ける手法が提案されています。


提案されている手法では、Cookieヘッダのシンタックスを変更すること無くCookieの名前にプレフィックスを付けることで属性に制約を設けます。

__Secure- プレフィックス

Cookie名に __Secure- が付いている場合は、Secure属性がついていなければいけません(MUST)


Secure属性がついてない場合は、拒否される

   Set-Cookie: __Secure-SID=12345; Domain=example.com


Secure属性がついていれば受け付ける

   Set-Cookie: __Secure-SID=12345; Secure; Domain=example.com

__Host- プレフィックス

$Host-プレフィックスが付与することで、設定されたホストからのみに提出するように制限できます。具体的にはCookieの属性を以下のように設定するように制限されます。

  • Domain属性が付いていてはいけない(MUST)
  • Path属性が"/"でなければならない(MUST)
  • Secure属性がついてなければならない(MUST)
  • URIのschmeが安全でなければならない(概ねhttpsだと思う)

以下のCookieは拒否される(Pathが無い、Domainが指定されている)

   Set-Cookie: __Host-SID=12345
   Set-Cookie: __Host-SID=12345; Secure
   Set-Cookie: __Host-SID=12345; Domain=example.com
   Set-Cookie: __Host-SID=12345; Domain=example.com; Path=/
   Set-Cookie: __Host-SID=12345; Secure; Domain=example.com; Path=/


以下のCookieは受け付ける

   Set-Cookie: __Host-SID=12345; Secure; Path=/

$Origin- プレフィックス

最新版の仕様では"$Origin-"は削除されました(2015/10/17追記)
$Origin-プレフィックスが付与することで、設定されたホストからのみに提出するように制限できます。具体的にはCookieの属性を以下のように設定するように制限されます。

  • Domain属性が付いていてはいけない(MUST)
  • Path属性が"/"でなければならない(MUST)
  • httpsといったSecureなオリジンからset-cookieする場合は、Secure属性が付いてなければいけない(MUST)


以下のCookieは拒否される(Pathが無い、Domainが指定されている)

   Set-Cookie: $Origin-SID=12345
   Set-Cookie: $Origin-SID=12345; Secure
   Set-Cookie: $Origin-SID=12345; Domain=example.com
   Set-Cookie: $Origin-SID=12345; Secure; Domain=example.com


以下のCookieは受け付ける

   Set-Cookie: $Origin-SID=12345; Path=/

ただし、HTTPSなどのセキュアなオリジン空は以下のようにSecure属性を付与されている必要がある

   Set-Cookie: $Origin-SID=12345; Secure; Path=/

ユーザエージェントの変更

この仕様のように動作するためには、ブラウザの変更が必要である。
変更点は仕様中で記述されています。