こう 聞かれます
- 「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 の
Cookie と セッションの違い
- Cookie ブラウザが
持つ小さな 値です。 サーバーが 渡し、 ブラウザが 送り返します - セッション サーバーの
側に 置く、 ログイン中の 人の 記録です。 Cookie には その 番号だけを入れます
Cookie に
守りの属性
HttpOnlyを付けると、 JavaScript から Cookie を 読めなくなります。 XSS で 盗まれに くくなります Secureを付けると、 HTTPS の 通信の ときだけ送ります SameSiteを付けると、 ほかの サイトから 始まった 要求に Cookie を 付けるか どうかを 決められます
作った
よく ある間違い
- 「HTTP が
ログイン状態を 覚えている」と言う 覚えているのは アプリの 側です。 HTTP は 要求ごとに 独立していて、 目印を 付けて 送らせる ことで 続きに 見せています - Cookie と
セッションを 同じ 物として話す Cookie は ブラウザ、 セッションは サーバーに あります。 Cookie に 入れるのは セッションの 番号だけです - ログアウトで Cookie を
消すだけにする 番号が 盗まれていれば、 サーバーの 記録が 残る 限り 使えます。 サーバーの 側でも セッションを 無効にします
深掘りの問い
- 「サーバーを 2 台に
増やすと、 セッションは どうなりますか」 1 台の メモリーにだけ置くと、 もう 1 台では 見つかりません。 両方から 読める 置き場 (データベースや Redis など ) に 置く、と答えます - 「セッションの
番号が 盗まれたら 何が 起きますか」 その 人に なりすまされます。 HTTPS、 HttpOnly、 期限、 ログインの たびに 番号を 作り直す こと、で 被害を 減らすと答えます - 「トークン (JWT) を
使う方式とは 何が 違いますか」 署名した 値に 情報を 入れて 持たせるので、 サーバーに 記録を 置かない 作りに しやすい方式です。 記録を 置かない 作りでは 途中で 無効にしにくい点を添えます