目次
- Cookieの必要性
- Cookieの送受信
- Cookieの仕様
- 3rd Party製 Cookie
- CSRF攻撃
1. Cookie(というか状態管理)の必要性
初期のWEB
初期のWEBでは、HTMLファイルを作って、そこに論文を書いて共有するために存在していました。
なので、ブラウザから受けたリクエストに基づいて、ファイルを返すだけ。
ブラウザも同じように、取得したファイルから画面を描画するだけ。
目的自体は論文の共有だったので、これで十分だったわけです。
WEBサイト、ECサイトの要求
時代が移り変わり情報共有を超えたWEBへ進化しました。
ファイルを返すだけのサーバから、情報・状態を管理するサーバへ変化しました。
例えば、今アクセスしてきた者は【誰】なのか?
誰がアクセスしてきていて、どういった【状態】にあるのか?
などを意識する必要が出てきました。
Cookieを用いた状態管理
その要求に応えたのが、Netscape Navigatorブラウザであり、それが正式にRFC2109で一般化されました。
その中身がCookie
, Set-Cookie
による状態管理メカニズムでした。
上記のように、接続元に対して、一意なキー1を振ってユーザーを管理しようというものです。
ここでは、【name】という属性を管理していますが、これが【買い物かご】でも同じ方式で管理します。
これを【セッション】や【ユーザーセッション】などと呼びます。
2. Cookieの送受信
Cookieの送受信のアーキテクチャ
上図の通り、サーバからSet-Cookie: key=value; option群
を返します。2
ブラウザはSet-Cookie
を受け取り、受信時にブラウザにwww.example.org
のCookie
として、保存します。
次回以降のwww.example.org
へのリクエスト時に、Cookie
をHTTP Headerに乗せて送信します。
3. Cookieの仕様
Cookieの属性
名称 | 内容 |
---|---|
Path | パス。デフォルトは、現在の文書の位置。 |
Domain | 送信先。 指定しない場合、返送してきたサーバドメインへのみ送信。 指定した場合、返送してきたサーバドメイン+そのサブドメイン。 |
Expires | 有効期限。GMT String。 例:Wed, 31 Oct 2021 07:28:00 GMT |
Max-Age | 有効期限(秒) |
Secure | HTTPS通信時のみCookieを送信する。 |
SameSite | クロスサイト間リクエスト時のポリシー。※後述。 |
HttpOnly | JavaScriptによるdocument.cookieでアクセス不可。 |
ドメインごとに管理される
調べていて最も混乱したポイント。
Cookieは、ドメインに紐付きます。Set-Cookie
を返してきたサーバのドメインにのみ送信可能です。
サーバへ送るCookie
も、送信先サーバからもらったCookie
のみを送信します。
Set-Cookie
でもらったCookie
を他のドメインへ送ることはできません。
SameSiteオプション
ドメインごとに管理されるCookie
ですが、SameSite
オプションでさらに混乱します。が、よくよく読めば単純です。
SameSite
オプションは、Cookie
の制限をより強めるものになります。
通常、Cookie
は、Set-Cookie
を送信してきたドメインに対して送れます。
しかし、ブラウザで現在表示しているURLを問わない点が、CSRF攻撃のリスクを孕んでいます。
図解すると、以下のようになります。
表でまとめると以下のようになります。
Option | 内容 |
---|---|
None | クロスサイトでもCookieは送る。ただし、Secureであることが条件(HTTPSでCookieにSecureが付いていること)。 |
Lax | クロスサイトの場合、Getリクエストに限り送る。 |
Strict | クロスサイトの場合、リクエスト時にCookieは送られない。 |
Chromeは、デフォルトでLaxとなっているようです。Lax化の流れがあるようです。
JavaScriptからアクセス可能
document.cookie
でアクセス可能。
console.log(document.cookie); // 参照
document.cookie="aaaa=bbbb"; // 設定
JavaScriptにおける参照範囲も、ブラウザと同様で、
現在のページを表示しているドメインからSet-Cookie
を通じて返却されたCookieに限る。
4. 3rd Party製 Cookie
下図が仕組みです。
バナー表示のための、HTTPリクエストがバナー広告.comへ飛びます。
それにより、HTTPリクエストに関わる情報からある程度ユーザの行動・リクエスト元サイトなどが把握できます。
Chromeは、これを問題視しており、将来的に排除するようです。
5. CSRF攻撃
大量の解説記事があるので記載はいったん省略。
もっとも分かりやすかった事例だけ載せておく。
CSRF対策
OWASPで紹介されている対策
Cross-Site Request Forgery Prevention Cheat Sheet¶
IPAで紹介されている対策
Spring Security(ライブラリによる)対策
13. Cross Site Request Forgery (CSRF)
IPAで紹介されている対策が「13.2 Synchronizer Token Pattern」。