HTTPのcookieはどこに保存され、どう送られるのか
情報セキュリティマネジメント試験 令和5年度 問10 / ネットワーク › ネットワーク応用
過去問にチャレンジ
HTTPのcookieに関する記述のうち,適切なものはどれか。
- ア
cookieに含まれる情報はHTTPヘッダーの一部として送信される。
- イ
cookieに含まれる情報はWebサーバだけに保存される。
- ウ
cookieに含まれる情報はWebブラウザが全て暗号化して送信する。
- エ
クライアントがcookieに含まれる情報の有効期限を設定する。
会話形式の解説
講師今回はHTTPのcookieの基本的な仕組みを問う問題です。cookieがどうやって送られるのか、どこに保存されるのか、有効期限は誰が決めるのか。この3点を順に確かめていきましょう。
受験者cookieはログイン状態を覚えておくものですよね。大事な情報なので、Webサーバ側に保存されていると思っていました。
講師そこは誤解しやすいところです。cookieは、サーバの指示を受けてブラウザ側に情報を保存させる仕組みです。保存場所はクライアントのブラウザなので、Webサーバだけに保存されるという記述は誤りになります。
受験者では、サーバ側で管理しているように見えるのは何なのでしょうか。
講師サーバ側でセッションID、つまり利用者を識別するための番号にひも付けて情報を管理することはあります。ただ、cookieそのものはブラウザに置かれています。この二つを分けて考えてください。
受験者なるほど。では、ブラウザに保存されたcookieはどうやってサーバに届くのですか。
講師ヘッダで流れを追うと分かりやすいです。サーバはレスポンスのSet-Cookieヘッダでcookieを設定します。ブラウザは次からのリクエストで、Cookieヘッダに入れて送り返します。どちらもHTTPヘッダの一部で、本文とは別に扱われます。
受験者それなら、ヘッダの一部として送信されるという記述が正しいですね。でも、ブラウザが全部暗号化して送るという選択肢も、安全そうなので迷いました。
講師ブラウザがcookieの中身を自動で暗号化する仕様はありません。HTTPSなら通信経路は暗号化されますが、それは通信全体の話です。HTTPで送れば、cookieは平文のまま流れます。
受験者経路の暗号化とcookie自体の暗号化は別ということですね。残りの有効期限はどうですか。クライアント側に保存されるなら、クライアントが期限を決めそうに思えます。
講師有効期限は通常、サーバがSet-CookieヘッダのExpires属性やMax-Age属性で指定します。期限が指定されていなければ、ブラウザを閉じるまで有効なセッションcookieとして扱われるのが一般的です。ですから、クライアントが設定するという記述は誤りです。
受験者整理すると、保存はブラウザ、送受信はヘッダ、期限はサーバが指定、自動の暗号化はない、ということですね。
講師そのとおりです。あわせてcookieの属性も覚えておきましょう。Secure属性はHTTPS接続のときだけcookieを送らせます。HttpOnly属性はJavaScriptからcookieを読めなくします。SameSite属性は他サイトから発生したリクエストでのcookie送信を制御するもので、CSRF対策に使われます。
受験者cookieの中に、パスワードのような認証情報をそのまま入れることはあるのでしょうか。
講師一般的には、認証情報そのものではなく、推測しにくいセッションIDを入れます。仕組みと属性を一緒に押さえておけば、セキュリティ寄りの出題にも対応しやすくなります。
まとめ
HTTPのcookieは、サーバの指示によってブラウザ側に情報を保存させる仕組みです。サーバはレスポンスのSet-Cookieヘッダでcookieを設定し、ブラウザは以降のリクエストのCookieヘッダで送り返すため、cookieはHTTPヘッダの一部として送信されます。cookieの内容が自動で暗号化されることはなく、HTTPでは平文のまま流れます。有効期限はサーバがExpires属性やMax-Age属性で指定し、指定がなければセッションcookieとして扱われるのが一般的です。
解答・解説
正解はアです
この問題のテーマ
HTTPのcookieがどのように送受信され、どこに保存され、有効期限を誰が決めるのかという基本的な仕組みを問う問題です。
解き方の考え方
まず、cookieはサーバの指示によってブラウザ側に情報を保持させる仕組みだという前提を確認します。次に、サーバとブラウザのやり取りをヘッダの流れで追います。サーバはレスポンスのSet-Cookieヘッダでcookieを設定し、ブラウザは以降のリクエストのCookieヘッダでそれを送り返します。この流れが頭に入っていれば、保存場所・暗号化・期限の設定主体を述べた各選択肢の誤りを見分けられます。
選択肢ごとの解説
- ○ア cookieに含まれる情報はHTTPヘッダーの一部として送信される。cookieはHTTPヘッダで送られるという記述は正しいです。サーバからはレスポンスのSet-Cookieヘッダで、ブラウザからはリクエストのCookieヘッダでやり取りされます。どちらもヘッダの一部なので、本文(ボディ)とは別に扱われます。
- ×イ cookieに含まれる情報はWebサーバだけに保存される。Webサーバだけに保存されるという記述は誤りです。cookieはクライアントのブラウザ側に保存されます。サーバ側でセッションIDにひも付く情報を管理することはありますが、cookieそのものの保存場所はブラウザです。
- ×ウ cookieに含まれる情報はWebブラウザが全て暗号化して送信する。ブラウザが全て暗号化して送るという記述は誤りです。ブラウザがcookieの中身を自動で暗号化する仕様はありません。HTTPSなら通信経路は暗号化されますが、HTTPでは平文のまま流れます。
- ×エ クライアントがcookieに含まれる情報の有効期限を設定する。クライアントが有効期限を設定するという記述は誤りです。有効期限は通常、サーバがSet-CookieヘッダのExpires属性やMax-Age属性で指定します。期限が指定されていない場合は、ブラウザを閉じるまで有効なセッションcookieとして扱われるのが一般的です。
補足
cookieには、安全に使うための属性があります。Secure属性は、HTTPS接続のときだけcookieを送らせます。HttpOnly属性は、JavaScriptからcookieを参照できないようにします。SameSite属性は、他サイトから発生したリクエストでのcookie送信を制御し、CSRF対策として使われます。また、cookieには認証情報そのものではなく、推測しにくいセッションIDを入れるのが一般的です。
POINT
- cookieはサーバの指示で、ブラウザ側に情報を保存させる仕組みです。
- サーバはレスポンスのSet-Cookieヘッダでcookieを設定し、ブラウザはリクエストのCookieヘッダで送り返します。
- cookieの内容が自動で暗号化されることはなく、HTTPで送れば平文のまま流れます。
- 有効期限はサーバがExpires属性またはMax-Age属性で指定します。
