CookieのFirst-Party-Only属性

draft 05より、「Same-site Cookies」という仕様に改称され、SameSite属性として属性が定義されました。
http://tools.ietf.org/html/draft-west-first-party-cookies-05
(2016/01/28)



Googleの方による、CookieにFirst-Party-Only 属性を追加するという仕様が提案されていたので、簡単に目を通す。
大分理解が足りず間違い等あるかもしれません。


First-Party-Only Cookies(draft-west-first-party-cookies)

First-Party-Only 属性

First-Party-Only 属性は他の属性と同様にset-cookieヘッダで指定される。

Set-Cookie: SID=31d4d96e407aad42; First-Party-Only


これを受け取ったユーザエージェントは、First-Partyリクエスト時のみCookieを送信する。


First-Partyリクエストとは簡単に言うと、リクエストするリソースのオリジンとブラウザのアドレスバーのURLのオリジンが一致しているHTTPリクエストです。


もう少し正確に言うと

  • "コンテキスト"はウィンドウ内のトップレベルブラウジングコンテキスとする
  • "トップオリジン"は"コンテキスト"内の有効なdocumentのlocationのオリジンとする
  • "リクエスト"のURLのオリジンが"トップオリジン"と同一であれば、それは*First-Partyリクエスト*とする。それ以外の"リクエスト"を*Third-Partyリクエスト*とする。


もちろん、First-Party-Only属性付きのSet-CookieはFirst-Partyリクエストに対するレスポンスの時のみ受け取り、それ以外の時は保存されない。

多分こんな感じ

  1. ブラウザで http://example.com/ にアクセスし(First-Partyリクエスト)、「First-Party-Only」属性のついたSet-Cookieヘッダを受け取る
  2. 次に別のサイト http://example2.com/にアクセスする。そこには<img src="http://example.com/hoge.jpg">のようなタグがあり、example.comにHTTPリクエストが送信される。
  3. この時のリクエストはThird-Partyリクエストになるので[1]で発行されたCookieは付加されない
何が嬉しいか

Third-PartyリクエストでCookieが付加されないので、CSRFや予期せぬ形での情報流出を緩和することが出来る。
(CSRFとかはコレで完全に防げるという感じではなさそう