Set-Cookieをネスペ午後問を解きながら9秒でパパパっと理解!

set- cookie ネスペ アイキャッチ
哲学者トニーくん
哲学者トニーくん

【9秒チャレンジ】
Set-Cookieは、サーバーがクライアントに「このCookieを保存してね」と指示するHTTPレスポンスヘッダーです。

HTTPはステートレスなので、ログイン情報などのセッションを維持できません。そこで、Cookieを使って状態を管理します。そのために、サーバーが Set-Cookie を送って、クライアントにCookieを保存させます。

クッキーに関するサーバーからの指示には、Set-CookieにはClear-Site-Data(Cookie削除指示)というヘッダーもあります。

更に詳しく知りたい場合↓

では、練習問題を通して実感していきましょう!

そもそもSet-Cookieとは

Set-Cookie は、Webサーバーがクライアント(ブラウザ)に対してCookieを保存するよう指示するHTTPヘッダ です。

簡単な流れ

  1. サーバー → クライアント(ブラウザ)
    • サーバーが Set-Cookie ヘッダを使ってCookieを発行し、ブラウザに保存させる。
  2. クライアント → サーバー
    • 次回以降、ブラウザは保存したCookieを Cookie ヘッダに含めてサーバーに送信する。

なぜCookieが必要なの?

HTTPはステートレス(状態を保持しない) なプロトコルなので、サーバーはクライアントの状態を覚えていない。
そこで、Cookieを使って「このユーザーはログインしている」「カートに商品が入っている」などの情報を管理する。

具体例(ログイン時のセッション管理)

1. 初回リクエスト(ログイン)

クライアントがサーバーにログインリクエストを送る

HTTP
POST /login HTTP/1.1
Host: example.com

サーバーがセッションIDを発行して、Set-Cookieを送る

HTTP
HTTP/1.1 200 OK
Set-Cookie: session_id=abcdef123456; Path=/; HttpOnly; Secure

➡️ ブラウザは session_id=abcdef123456 を保存する。


2. 次回以降のリクエスト

保存されたCookieが、サーバーへのリクエスト時に自動的に送られる。

HTTP
GET /dashboard HTTP/1.1
Host: example.com
Cookie: session_id=abcdef123456

➡️ サーバーはこの session_id を確認し、ログイン済みのユーザーであることを判別する。

設問

あなたは、A社のWebシステムのセキュリティ改善を担当するネットワークエンジニアである。現在、A社では、ユーザ認証後にセッション管理のために Set-Cookie ヘッダを用いてセッションIDを発行し、ブラウザに保存させている。

しかし、最近になって、以下のようなセキュリティ上の問題が指摘された。

  • (1) クロスサイトスクリプティング(XSS)によるセッションIDの漏洩の可能性
  • (2) HTTPSを使用しない場合のセッションIDの漏洩の可能性
  • (3) サブドメイン間での不要なCookieの共有

これらの問題を防ぐために、適切な Set-Cookie の属性設定を行うことになった。

設問 1

(1) の問題(XSSによるセッションIDの漏洩)を防ぐために、 Set-Cookie のどの属性を設定すべきか。また、その属性の具体的な動作を説明せよ。

設問 2

(2) の問題(HTTPSを使用しない場合のセッションIDの漏洩)を防ぐために、 Set-Cookie のどの属性を設定すべきか。また、その属性の具体的な動作を説明せよ。

設問 3

(3) の問題(サブドメイン間での不要なCookieの共有)を防ぐために、 Set-Cookie のどの属性を設定すべきか。また、その属性の具体的な動作を説明せよ。

設問 4

A社の開発チームが Set-Cookie の設定を以下のように変更した。

HTTP
Set-Cookie: session_id=abcdef123456; Path=/; HttpOnly; Secure; SameSite=Strict

この設定により、上記の (1) ~ (3) の問題に対してどのような効果が得られるか。それぞれについて説明せよ。

解説

設問 1:XSSによるセッションIDの漏洩を防ぐには?

解答:

HttpOnly 属性を設定する。

解説:

  • HttpOnly を設定すると、JavaScript から Cookie を取得できなくなる。
  • これにより、攻撃者が XSS(クロスサイトスクリプティング)を利用して JavaScript を実行し、 document.cookie でセッションIDを盗むことを防げる。
具体例:
HTTP
Set-Cookie: session_id=abcdef123456; HttpOnly

この設定により、JavaScript (document.cookie) から session_id が取得できなくなる。


設問 2:(HTTPSを使用しない場合のセッションIDの漏洩)を防ぐには?

解答:

Secure 属性を設定する。

解説:

  • Secure を設定すると、HTTPS(暗号化通信)を使用している場合のみ Cookie が送信される。
  • これにより、HTTP(平文通信)経由でセッションIDが盗聴されることを防げる。
具体例:
HTTP
Set-Cookie: session_id=abcdef123456; Secure

この設定により、HTTPS接続時のみ Cookie が送られ、HTTP通信では送信されなくなる。


設問 3:サブドメイン間での不要なCookieの共有を防ぐには?

解答:

Domain 属性を適切に設定しない、または SameSite 属性を設定する。

解説:

  • Domain 属性を指定しなければ、Cookie は発行したドメイン(example.com など)でのみ有効になる。
  • もし Domain=example.com を設定すると、sub.example.com などのサブドメインにも Cookie が送信されてしまう。
  • SameSite 属性を StrictLax にすることで、異なるサイト(またはサブドメインを含む)からの不要なリクエストで Cookie を送信しないよう制御できる。
具体例:
HTTP
Set-Cookie: session_id=abcdef123456; SameSite=Strict

この設定により、異なるサイト(サブドメインを含む)からのリクエスト時に Cookie が送信されなくなる。


設問 4:以下の Set-Cookie 設定での効果

HTTP
Set-Cookie: session_id=abcdef123456; Path=/; HttpOnly; Secure; SameSite=Strict

この設定による効果を説明する。

解答と解説:

  1. HttpOnly の効果(XSS対策)
    • JavaScript (document.cookie) から Cookie を読み取れないため、XSS攻撃によるセッションIDの漏洩を防ぐ。
  2. Secure の効果(HTTPS強制)
    • HTTPS通信でのみ Cookie が送信されるため、HTTP経由の盗聴を防ぐ。
  3. SameSite=Strict の効果(クロスサイトリクエスト対策)
    • 他のサイトからのリクエストでは Cookie を送らなくなるため、クロスサイトリクエストフォージェリ(CSRF)攻撃を防ぎやすくなる。
    • ただし、他のサイトからのリンクをクリックした際にセッションが適用されない可能性がある(厳格すぎる場合がある)。
まとめ:この設定の効果

XSSによるセッションID漏洩を防ぐHttpOnly
HTTPS以外でのセッションID漏洩を防ぐSecure
CSRFや不要なサブドメイン間Cookieの共有を防ぐSameSite=Strict


補足(より実践的な設定)

場合によっては SameSite=Lax のほうが利便性が高いこともある。

  • SameSite=Strict は、他のサイトからのリンクをクリックした場合でも Cookie を送信しないため、ログインが必要なサイトでは使いづらい。
  • SameSite=Lax ならば、同じブラウザタブ内での遷移は許容されるため、利便性を維持できる。
HTTP
Set-Cookie: session_id=abcdef123456; Path=/; HttpOnly; Secure; SameSite=Lax

この設定なら、
XSS・盗聴を防ぎながら、最低限のクロスサイト対策を確保できる。


総括

Set-Cookie の適切な設定は、セキュリティを向上させるだけでなく、利便性とのバランスを取ることが重要!試験対策としては、以下の3つを押さえておけば安心:

  • HttpOnlyXSS対策
  • SecureHTTPS強制
  • SameSiteCSRF・不要なCookie共有対策(LaxかStrictを選択)

実際のシステムでは、要件に応じて SameSite の設定を慎重に選ぼう!

勇気100% – 忍たま乱太郎 cover by high_note Music Lounge

タイトルとURLをコピーしました