3秒でわかる
一定時間操作がないログイン状態を自動的に無効にする仕組み。放置された端末から他人が入り込むのを防ぐために、期限を決めて区切ります。
もう少し詳しく
どういうものか
セッションタイムアウトは、ログイン状態を表すセッションが、決められた時間を過ぎると自動的に無効になる仕組みです。無効になった後にリクエストを送ると、ログイン画面へ戻されます。
数え方には 2 種類あります。最後の操作からの経過で測る方式と、ログインからの経過で測る方式です。前者は使っている間は延び続け、後者は使っていても決まった時間で必ず切れます。銀行や管理画面では両方を組み合わせ、無操作 15 分または通算 8 時間で終了、といった設定にすることがあります。
なぜ必要か
共有端末やオフィスの離席が主な理由です。画面を開いたまま席を離れた人のアカウントで、他人が操作できてしまう状況を時間で塞ぎます。
サーバー側の資源も理由のひとつです。セッション情報をメモリや DB に持つ実装では、期限が無いと使われないデータが増え続けます。
具体例
Express でセッションの有効期限を 30 分にする例です。
<a href="/glossary/app-use" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">app.use</a>(
session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
rolling: true, // 操作のたびに期限を延長する
cookie: { maxAge: 30 * 60 * 1000, httpOnly: true, secure: true },
})
);rolling を有効にすると最後の操作からの計測になり、外すとログインからの固定時間になります。
つまずきやすいところ
クッキーの maxAge だけ延ばしてもサーバー側のセッションが先に消えていれば入れません。逆にサーバー側だけ長くしても、ブラウザのクッキーが消えれば同じことです。両方の期限を揃えて考える必要があります。
利用者からの苦情で多いのは、長文を書いている最中に切れて入力内容が消える、というものです。フォームの下書きを保存する、期限が近づいたら画面上で知らせる、といった対応が要ります。
開発中に「タイムアウトを長くすれば楽」と 24 時間などに伸ばしたまま本番へ出てしまう事故もあります。設定値は環境ごとに分けます。
非同期の通信も見落としがちです。画面を開いたまま裏側で定期的にデータを取りに行く作りだと、利用者は何もしていないのに操作扱いになり、無操作の判定が働きません。期限を延ばす対象を利用者の操作に限る、といった線引きが要ります。
似た用語との違い
| 語 | 何が切れるか |
|---|---|
| セッションタイムアウト | ログイン状態そのもの |
| クッキーの有効期限 | ブラウザが持つ識別子 |
| トークンの有効期限 | 認証情報としての通用期間 |
| 接続タイムアウト | 1 回の通信の待ち時間 |
覚え方
「無操作で切れる」タイプと「時計で切れる」タイプの 2 つがある、と分けて覚えます。