
【9秒チャレンジ】
Set-Cookieは、サーバーがクライアントに「このCookieを保存してね」と指示するHTTPレスポンスヘッダーです。
HTTPはステートレスなので、ログイン情報などのセッションを維持できません。そこで、Cookieを使って状態を管理します。そのために、サーバーが Set-Cookie
を送って、クライアントにCookieを保存させます。
クッキーに関するサーバーからの指示には、Set-Cookie
にはClear-Site-Data
(Cookie削除指示)というヘッダーもあります。
更に詳しく知りたい場合↓
では、練習問題を通して実感していきましょう!
そもそもSet-Cookieとは
Set-Cookie
は、Webサーバーがクライアント(ブラウザ)に対してCookieを保存するよう指示するHTTPヘッダ です。
簡単な流れ
- サーバー → クライアント(ブラウザ)
- サーバーが
Set-Cookie
ヘッダを使ってCookieを発行し、ブラウザに保存させる。
- サーバーが
- クライアント → サーバー
- 次回以降、ブラウザは保存したCookieを
Cookie
ヘッダに含めてサーバーに送信する。
- 次回以降、ブラウザは保存したCookieを
なぜCookieが必要なの?
HTTPはステートレス(状態を保持しない) なプロトコルなので、サーバーはクライアントの状態を覚えていない。
そこで、Cookieを使って「このユーザーはログインしている」「カートに商品が入っている」などの情報を管理する。
具体例(ログイン時のセッション管理)
1. 初回リクエスト(ログイン)
クライアントがサーバーにログインリクエストを送る
POST /login HTTP/1.1
Host: example.com
サーバーがセッションIDを発行して、Set-Cookieを送る
HTTP/1.1 200 OK
Set-Cookie: session_id=abcdef123456; Path=/; HttpOnly; Secure
➡️ ブラウザは session_id=abcdef123456
を保存する。
2. 次回以降のリクエスト
保存されたCookieが、サーバーへのリクエスト時に自動的に送られる。
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
の設定を以下のように変更した。
Set-Cookie: session_id=abcdef123456; Path=/; HttpOnly; Secure; SameSite=Strict
この設定により、上記の (1) ~ (3) の問題に対してどのような効果が得られるか。それぞれについて説明せよ。
解説
設問 1:XSSによるセッションIDの漏洩を防ぐには?
解答:
HttpOnly
属性を設定する。
解説:
HttpOnly
を設定すると、JavaScript から Cookie を取得できなくなる。- これにより、攻撃者が XSS(クロスサイトスクリプティング)を利用して JavaScript を実行し、
document.cookie
でセッションIDを盗むことを防げる。
具体例:
Set-Cookie: session_id=abcdef123456; HttpOnly
この設定により、JavaScript (document.cookie
) から session_id
が取得できなくなる。
設問 2:(HTTPSを使用しない場合のセッションIDの漏洩)を防ぐには?
解答:
Secure
属性を設定する。
解説:
Secure
を設定すると、HTTPS(暗号化通信)を使用している場合のみ Cookie が送信される。- これにより、HTTP(平文通信)経由でセッションIDが盗聴されることを防げる。
具体例:
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
属性をStrict
やLax
にすることで、異なるサイト(またはサブドメインを含む)からの不要なリクエストで Cookie を送信しないよう制御できる。
具体例:
Set-Cookie: session_id=abcdef123456; SameSite=Strict
この設定により、異なるサイト(サブドメインを含む)からのリクエスト時に Cookie が送信されなくなる。
設問 4:以下の Set-Cookie 設定での効果
Set-Cookie: session_id=abcdef123456; Path=/; HttpOnly; Secure; SameSite=Strict
この設定による効果を説明する。
解答と解説:
HttpOnly
の効果(XSS対策)- JavaScript (
document.cookie
) から Cookie を読み取れないため、XSS攻撃によるセッションIDの漏洩を防ぐ。
- JavaScript (
Secure
の効果(HTTPS強制)- HTTPS通信でのみ Cookie が送信されるため、HTTP経由の盗聴を防ぐ。
SameSite=Strict
の効果(クロスサイトリクエスト対策)- 他のサイトからのリクエストでは Cookie を送らなくなるため、クロスサイトリクエストフォージェリ(CSRF)攻撃を防ぎやすくなる。
- ただし、他のサイトからのリンクをクリックした際にセッションが適用されない可能性がある(厳格すぎる場合がある)。
まとめ:この設定の効果
✅ XSSによるセッションID漏洩を防ぐ(HttpOnly
)
✅ HTTPS以外でのセッションID漏洩を防ぐ(Secure
)
✅ CSRFや不要なサブドメイン間Cookieの共有を防ぐ(SameSite=Strict
)
補足(より実践的な設定)
場合によっては SameSite=Lax
のほうが利便性が高いこともある。
SameSite=Strict
は、他のサイトからのリンクをクリックした場合でも Cookie を送信しないため、ログインが必要なサイトでは使いづらい。SameSite=Lax
ならば、同じブラウザタブ内での遷移は許容されるため、利便性を維持できる。
Set-Cookie: session_id=abcdef123456; Path=/; HttpOnly; Secure; SameSite=Lax
この設定なら、
✅ XSS・盗聴を防ぎながら、最低限のクロスサイト対策を確保できる。
総括
Set-Cookie
の適切な設定は、セキュリティを向上させるだけでなく、利便性とのバランスを取ることが重要!試験対策としては、以下の3つを押さえておけば安心:
HttpOnly
→ XSS対策Secure
→ HTTPS強制SameSite
→ CSRF・不要なCookie共有対策(LaxかStrictを選択)
実際のシステムでは、要件に応じて SameSite
の設定を慎重に選ぼう!