HTTP は状態を持たないのに、ログインした状態はどう保たれていますか

HTTP がステートレスであることと、Cookie とセッションで「同じ人」をつなぐ仕組みを分けて答える問い。盗まれたときの守りまで話せると強い答えになります。

こう聞かれます

  • 「HTTP はステートレスと言われますが、どういう意味ですか。それでもログインが続くのはなぜですか」
  • 「Cookie とセッションの違いを説明してください」
  • 「ログインの機能をどう作りましたか」(作った物から、仕組みの理解を確かめる形)

面接官が見ている点

  • 「HTTP が覚えている」のではなく、アプリが毎回の要求に目印を付けさせている、と分かっているか
  • Cookie (ブラウザの置き場) とセッション (サーバーの記録) を混ぜずに話せるか
  • 目印が盗まれたら何が起きるか、どう守るかまで考えられるか

短い答え

  • HTTP は要求を 1 回ずつ別の物として扱い、前の要求を覚えません。これをステートレスと言います。
  • ログインに成功すると、サーバーはセッションという記録を作り、その番号を Cookie に入れてブラウザに渡します。
  • ブラウザは次の要求から Cookie を自動で付けて送り、サーバーは番号から記録を引いて、同じ人だと見分けます。

少し詳しい答え

やり取りの流れ

ログインが通ると、サーバーは応答の Set-Cookie のヘッダーで番号を渡します。

HTTP/1.1 200 OK
Set-Cookie: sid=x9; HttpOnly

ブラウザはこれを覚え、同じサイトへの次の要求に Cookie のヘッダーで付けて送ります。

GET /mypage HTTP/1.1
Cookie: sid=x9

サーバーは x9 の番号でセッションの記録を探し、「この人は利用者 42 番でログイン中」と分かります。HTTP そのものは何も覚えていません。毎回の要求に目印が付いているだけです。

Cookie とセッションの違い

  • Cookie ブラウザが持つ小さな値です。サーバーが渡し、ブラウザが送り返します
  • セッション サーバーの側に置く、ログイン中の人の記録です。Cookie にはその番号だけを入れます

Cookie に利用者の番号や権限をそのまま入れると、利用者が書き換えられます。だから中身はサーバーに置き、Cookie には当てにくい長い番号だけを入れます。

守りの属性

  • HttpOnly を付けると、JavaScript から Cookie を読めなくなります。XSS で盗まれにくくなります
  • Secure を付けると、HTTPS の通信のときだけ送ります
  • SameSite を付けると、ほかのサイトから始まった要求に Cookie を付けるかどうかを決められます

作った物と結ぶなら、たとえば「ログインはセッションで作り、Cookie には番号だけを入れて HttpOnly と Secure を付け、ログアウトではサーバーの記録も消した」のように話します。

よくある間違い

  • 「HTTP がログイン状態を覚えている」と言う覚えているのはアプリの側です。HTTP は要求ごとに独立していて、目印を付けて送らせることで続きに見せています
  • Cookie とセッションを同じ物として話す Cookie はブラウザ、セッションはサーバーにあります。Cookie に入れるのはセッションの番号だけです
  • ログアウトで Cookie を消すだけにする番号が盗まれていれば、サーバーの記録が残る限り使えます。サーバーの側でもセッションを無効にします

深掘りの問い

  • 「サーバーを 2 台に増やすと、セッションはどうなりますか」 1 台のメモリーにだけ置くと、もう 1 台では見つかりません。両方から読める置き場 (データベースや Redis など) に置く、と答えます
  • 「セッションの番号が盗まれたら何が起きますか」その人になりすまされます。HTTPS、HttpOnly、期限、ログインのたびに番号を作り直すこと、で被害を減らすと答えます
  • 「トークン (JWT) を使う方式とは何が違いますか」 署名した値に情報を入れて持たせるので、サーバーに記録を置かない作りにしやすい方式です。記録を置かない作りでは途中で無効にしにくい点を添えます

確認日 2026年10月23日

技術面接問題の一覧へ戻る