Cookieの概念
- Cookieは、サーバーがWebブラウザに送信する小さなデータの塊です。
- WebブラウザはこのCookieをローカルコンピュータに保存し、指定されたドメインにアクセスする際にこれを送信します。
- HTTPは無状態プロトコルですが、Cookieを用いることで状態を持たせることができます。
Cookieの用途
- セッション管理:ログイン状態の維持やショッピングカートの情報保存などに使用されます。
- 個人設定:ユーザーの設定やテーマの選択など、個人化された体験を提供するために使われます。
- 追跡:ユーザーの行動や嗜好を追跡し、分析やマーケティングに役立てます。
Cookieに関連するHTTPリクエスト/レスポンスヘッダー
HTTPリクエストヘッダー
GET /sample_page.html HTTP/2.0
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
HTTPレスポンスヘッダー
HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
セキュリティ上の脆弱性
- MITM攻撃(中間者攻撃)
- XSS(クロスサイトスクリプティング)
- CSRF(クロスサイトリクエストフォージェリ)
セキュリティを強化するための属性
-
HttpOnly:JavaScriptを介してCookieにアクセスすることを防ぎます。
Set-Cookie: id=q1w2e3; HttpOnly
-
Secure:HTTPSプロトコルを使用する際にのみCookieを送信します。
Set-Cookie: id=q1w2e3; Secure
-
SameSite:同一サイト/異なるサイトからのリクエストに対するCookieの送信ルールを定めます。SameSiteの基準は、「登録可能なドメイン」によって決まります。
- SameSiteの基準
- ドメインが
https://example.com
の場合- ⭕
https://example.com/en-US/docs/
(ルート不問) - ⭕
https://api.example.com/en-US/
(サブドメインは問いません) - ⭕
https://example.com:8080
(ポートは問いません) - ❌
https://example2.com
(登録可能なドメインが異なる) - ❌
http://example.com
(プロトコルが異なる)
- ⭕
- ドメインが
- SameSiteの値
- Strict:同一ドメインからのリクエストのみにCookieを送信します。
Set-Cookie: id=q1w2e3; SameSite=Strict
- Lax:リンクを介したリクエストを含む、同一ドメインからのリクエストに対してCookieを送信します。
Set-Cookie: id=q1w2e3; SameSite=Lax
- None:任意のドメインからのリクエストに対してCookieを送信しますが、この場合はSecure属性が必須です。
Set-Cookie: id=q1w2e3; SameSite=None; Secure
- Strict:同一ドメインからのリクエストのみにCookieを送信します。
- SameSiteの基準
有効範囲を定めるための属性
api.example.com
でCookieを生成した場合
-
Domain:指定されたドメインに対するHTTPリクエストであれば、Cookieを送信する。指定ドメインがなければ、サブドメインは除外されます。
Set-Cookie: id=q1w2e3; domain=example.com
- ⭕ www.example.com
- ⭕ api.example.com
- ⭕ example.com
Set-Cookie: id=q1w2e3;
- ❌ www.example.com
- ⭕ api.example.com
- ❌ example.com
-
Path:指定したURLパスを含むHTTPリクエストの場合にのみ、Cookieを送信します。
Set-Cookie: id=q1w2e3; path=/docs
- ⭕ /docs
- ⭕ /docs/
- ⭕ /docs/Web/
- ⭕ /docs/Web/HTTP
- ❌ /
- ❌ /docsets
- ❌ /fr/docs