こう 聞かれます
- 「ログインの
状態を、 サーバーの セッションと JWT の どちらで 持ちますか」 - 「JWT を
使っていて、 ログアウトした 人の 証明を、 すぐ 使えなく するには」 - 「JWT なら
サーバーで 何も 覚えなくて よいので、 いつも JWT が 良いのでは」(裏から聞く形)
面接官が 見ている点
- 仕組みの
違いではなく、 取り消しの しやすさ、 台の 増やしやすさ、 置き場所の 安全さで選べるか - JWT は
期限まで 有効で、 途中で 取り消すのが 難しいと 分かっているか - ブラウザの
どこに 置くかで、 盗まれ方が 変わると 分かっているか - 「流行っているから」ではなく、
サービスの 形に 合わせて選べるか
短い答え
- ふつうの Web の
サービスなら、 サーバーの セッションを 選びます。 サーバーで 消せば、 ログアウトや 強制的な 締め出しが すぐ 効くからです。 台を 増やすときは、 セッションを 共有の 置き場に 持ちます。 - JWT は、
署名で 中身を 確かめられるので、 複数の サービスが それぞれ問い 合わせずに 確かめたい ときに 向きます。 そのかわり期限までは 取り消しにくいので、 期限を 短くし、 長く 持つ更新用の 証明と 組み合わせます。 - どちらでも、
ブラウザでは JavaScript から 読めない Cookie (HttpOnly) に 置きます。 localStorage に 置くと、 XSS の 穴が あった ときに 読み出されます。
この
少し 詳しい答え
何が違うか
- サーバーの
セッション ブラウザには 意味の 無い 番号だけを 渡し、 誰が ログインしているかは サーバーの 置き場に 持ちます。 毎回、 番号で 置き場を引きます - JWT 誰か、
いつまで 有効か、 などを 書いた 中身に 署名を 付けて、 ブラウザに 渡します。 サーバーは 署名を 確かめるだけで、 置き場を 引かなくて済みます
ふつうに
取り消しの引き換え
いちばん
- セッションは、
置き場から 消せば、 次の 要求から すぐ 使えなくなります。 ログアウト、 パスワードの 変更、 怪しい 動きでの 締め出しが、 すぐ効きます - JWT は、
署名が 正しく 期限内なら 有効です。 すぐ 取り消したいなら、 取り消した 証明の 一覧を サーバーに 持って毎回引く ことに なり、 置き場を 引かない 良さが消えます
そこで JWT を
台を 増やすとき
セッションを
ふつうの
ブラウザの どこに置くか
- HttpOnly の Cookie JavaScript から
読めないので、 XSS の 穴が あっても 中身を 盗まれに くくなります。 自動で 送られるので、 CSRF の 手当て (SameSite の 設定、 確認用の 値) が要ります - localStorage 手で
付けて 送る 形に なり、 CSRF の 心配は 減りますが、 ページで 動くどの JavaScript から も読めます
セッションの
話すときは、
よく ある間違い
- JWT なら
何でも 楽に なると思う 取り消しが 難しくなります。 ログアウトや 締め出しを すぐ 効かせたい サービスでは、 かえって 手間が増えます - JWT の
期限を長くする 漏れた とき、 期限まで 使われ続けます。 短くして、 更新用の 証明と 組み合わせます - JWT の
中身に 秘密の 情報を入れる 中身は 誰でも 読めます。 署名は 書き換えを 防ぐだけです - 証明を localStorage に置く XSS の
穴が 1 つ あれば、 そのまま 読み出されます
深掘りの問い
- 「ログインした
直後に、 セッションの 番号を 替えるのは なぜですか」 ログインの 前に 知られた 番号を そのまま 使われる 攻撃 (セッション固定) を 防ぐ ため、と答えます - 「JWT の
署名の 確かめで 気を つけることは」受け入れる 署名の 方式を 決めて おき、 署名の 無い 物や 想定外の 方式は 断る、 期限の 欄も 必ず 確かめる、と答えます - 「スマホのアプリでは」 Cookie を
使わない ことが 多いので、 更新用の 証明は 端末の 安全な 保管の 仕組みに 置く、と答えます
