LoginSignup
26
20

More than 3 years have passed since last update.

Cookie周りの仕様および図解

Posted at

目次

  1. Cookieの必要性
  2. Cookieの送受信
  3. Cookieの仕様
  4. 3rd Party製 Cookie
  5. CSRF攻撃

1. Cookie(というか状態管理)の必要性

初期のWEB

初期のWEBでは、HTMLファイルを作って、そこに論文を書いて共有するために存在していました。
なので、ブラウザから受けたリクエストに基づいて、ファイルを返すだけ。
ブラウザも同じように、取得したファイルから画面を描画するだけ。
目的自体は論文の共有だったので、これで十分だったわけです。

image.png

WEBサイト、ECサイトの要求

時代が移り変わり情報共有を超えたWEBへ進化しました。
ファイルを返すだけのサーバから、情報・状態を管理するサーバへ変化しました。

例えば、今アクセスしてきた者は【誰】なのか?
誰がアクセスしてきていて、どういった【状態】にあるのか?
などを意識する必要が出てきました。

image.png

Cookieを用いた状態管理

その要求に応えたのが、Netscape Navigatorブラウザであり、それが正式にRFC2109で一般化されました。
その中身がCookie, Set-Cookieによる状態管理メカニズムでした。

image.png

上記のように、接続元に対して、一意なキー1を振ってユーザーを管理しようというものです。
ここでは、【name】という属性を管理していますが、これが【買い物かご】でも同じ方式で管理します。
これを【セッション】や【ユーザーセッション】などと呼びます。

2. Cookieの送受信

Cookieの送受信のアーキテクチャ

image.png

上図の通り、サーバからSet-Cookie: key=value; option群を返します。2
ブラウザはSet-Cookieを受け取り、受信時にブラウザにwww.example.orgCookieとして、保存します。
次回以降の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を他のドメインへ送ることはできません。

image.png

SameSiteオプション

ドメインごとに管理されるCookieですが、SameSiteオプションでさらに混乱します。が、よくよく読めば単純です。

SameSiteオプションは、Cookieの制限をより強めるものになります。
通常、Cookieは、Set-Cookieを送信してきたドメインに対して送れます。
しかし、ブラウザで現在表示しているURLを問わない点が、CSRF攻撃のリスクを孕んでいます。

図解すると、以下のようになります。

image.png

表でまとめると以下のようになります。

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は、これを問題視しており、将来的に排除するようです。

image.png

5. CSRF攻撃

大量の解説記事があるので記載はいったん省略。
もっとも分かりやすかった事例だけ載せておく。

大量の「はまちちゃん」を生み出したCSRFの脆弱性とは?

CSRF対策

OWASPで紹介されている対策

Cross-Site Request Forgery Prevention Cheat Sheet¶

IPAで紹介されている対策

リクエスト強要(CSRF)対策

Spring Security(ライブラリによる)対策

13. Cross Site Request Forgery (CSRF)
IPAで紹介されている対策が「13.2 Synchronizer Token Pattern」。

参考


  1. UUIDなど推測されないものをベースにIDを生成すべき。ここでは簡便的に1,2,3と記載しています。 

  2. Set-Cookieは複数指定可能。 

26
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
20