Fincs

横断/運用基盤 / セッション制御

横断/運用基盤 / セッション制御

本ページは 2 段構成。上段が biz/CS 向け(ユーザー提示可)、下段(## 🔧 実装詳細 以降)が dev 向け。biz/CS がユーザーへ提示・転用してよいのは上段のみ。

概要

fincs サービスの認証セッション・端末管理・バージョン更新検知・契約期限チェック・ログイン試行制限をまとめたセッション制御基盤。

主な構成要素:

  • 同時ログイン端末数の制限: 1 ユーザーが同時に利用できる端末数を制限
  • アプリのバージョン更新検知: 新バージョンが配信されたタイミングで内部的に検知し、画面リロードを促す
  • 契約期限チェック: 受講者の講座契約期限切れを定期的にチェックし、期限切れ後の不適切な閲覧を防止
  • ログイン試行制限・アカウントロック: メール + パスワード認証で連続失敗時のアカウントロック処理(実装は途中段階で、運用上の効果は限定的)

主な利用想定は、不正利用防止(同時ログイン制限・連続失敗の検知)、リリース後の最新版への自動誘導、契約期限切れ後の閲覧防止など。

同時ログイン制限: 受講者・サブ講師は最大 2 台までの同時ログイン。メイン講師は対象外(端末制限なし)。3 台目以降の端末でログインすると、最も古い端末から自動的にログアウトされる仕組み(先入れ先出し)。CS で「身に覚えなくログアウトされた」相談時は同時利用端末数の確認を案内。

契約期限チェック: 受講者がトーク画面を開いている間、定期的に契約状態をチェックし、期限切れが確認された時点で画面を自動リロードしてアクセス制限。タイミングは数十分〜半日単位で動作。

アカウントロックの注意点: メール + パスワード認証で連続失敗するとアカウントロックの内部記録が走るが、現時点ではロック判定のしきい値・ロック中の拒否処理が未完成のため、実質的に「失敗カウントを記録するだけ」の状態となっている。改善対象。

メンテナンスモードは未提供: メンテナンス時にユーザーに専用画面を表示する機能は未実装。リリース・障害対応時の運用は別経路で対応する。

📝 レビュー観点:

  • 目的: 不正利用防止、契約期限切れ表示、最新バージョン強制
  • 誰が使うか: 全ユーザー(受講者・講師・運営アドミン)
  • どこで使うか: ログイン後の全画面、特に講座詳細・トーク画面で常駐
  • 隣接機能との関係: 通知(./notification.md)、運営アドミン認証(../admin/overview.md
  • CS 問い合わせで頻発する論点: 「他端末で勝手にログアウトされる」「契約終了したのに画面が見える」「アプリ更新ダイアログが何度も出る」「アカウントロックの解除方法」
  • [本機能特有] 同時ログイン上限 2 台(dev=3): メイン講師は制限対象外
  • [本機能特有] FIFO 押し出し: 古い端末から自動ログアウト
  • [本機能特有] 契約期限チェックは 1 分タイマー + 12h しきい値: トーク画面常駐
  • [本機能特有] バージョン検知は 1 時間ポーリング: appenv.json 比較
  • [本機能特有] アカウントロック判定の発火しきい値が不明: 失敗カウント記録のみで実質ロックされない可能性
  • [本機能特有] メンテナンスモードは未実装

利用シナリオ

シナリオ 1: 3 台目の端末でログインしたときの挙動

受講者またはサブ講師が既に 2 台の端末でログイン中の状態で、3 台目の端末からログインしようとすると、最も古い端末が自動的にログアウト状態になる。3 台目のユーザーは正常にログイン継続可能で、押し出された端末は次回操作時にセッション切れとなり再ログインを求められる。

シナリオ 2: リリース直後のバージョン更新ダイアログ

新バージョンがリリースされると、ユーザーが画面を開いてしばらく経つと内部的に新バージョンを検知してダイアログを表示。「更新する」ボタンで画面リロードが走り、最新版に切り替わる。

シナリオ 3: 契約期限切れ後の自動リロード

受講者がトーク画面を開いて利用していた状態で、契約期限が経過した場合、定期チェックで失効が確認された時点で画面が自動的にリロードされ、契約終了後のアクセスができなくなる。

シナリオ 4: ログイン連続失敗時の挙動

メール + パスワード認証で連続して失敗を繰り返した場合、内部的に失敗カウント・ロック予定時刻を記録。ただし現時点でロック判定の仕組みは完成途中のため、運用上のロック効果は限定的。

よくある失敗ケース

  • 押し出された端末での操作: ログアウトされた端末で操作するとセッション切れエラー。再ログインを案内
  • 契約終了後のトーク画面残留: 契約期限直後のタイミングで画面を開いている場合、定期チェックの周期次第で短時間アクセスできてしまうケースがある
  • 更新ダイアログを閉じても再度表示される: 次回ポーリングタイミングで同じ新バージョン検知が走るため。「更新する」を選ばない限り表示が続く
  • Redis 障害時のセッション制御不能: 内部のセッション情報を Redis で保持するため、Redis 障害時はセッション制御が機能しないリスクあり

権限別仕様

権限定義は ../user-roles.md 参照。

横断軸

操作 受講者 サブ講師 メイン講師 運営アドミン
同時ログイン上限 2 台 ○(適用) ○(適用) ×(制限なし) ○(適用)
バージョン更新検知
契約期限チェック × × ×
アカウントロック対象 ○(メールパス認証)

📝 レビュー観点:

  • メイン講師は同時ログイン制限対象外(メイン講師ロール判定で early return)
  • 契約期限チェックは受講者が対象、講師は契約概念外
  • ソーシャルログインはアカウントロック対象外(Firebase 側委譲)

機能詳細(ふるまい)

同時ログイン制限

  • 対象: 受講者・サブ講師(メイン講師は対象外で台数制限なし)
  • 上限: 同時 2 台までログイン可能(dev 環境は 3 台)
  • 3 台目以降のログイン: 最も古い端末から自動ログアウトされる先入れ先出し方式
  • 押し出された端末の検知: 内部で定期的にセッション継続をチェックし、押し出された端末は自動的にログアウト状態へ移行

バージョン更新検知

  • 内部で定期的(約 1 時間周期)に最新バージョン情報をポーリング
  • 起動時のバージョンと現行バージョンが不一致の場合、画面に更新ダイアログを表示
  • 「更新する」ボタンで画面リロードが走り、最新版に切り替わる
  • ユーザーが「後で」を選んだ場合、次のポーリングタイミングで再表示

契約期限チェック

  • 受講者がトーク画面を開いている間に動作
  • 1 分タイマーで動作し、前回チェックから 12 時間経過時に契約情報を再取得
  • 契約失効が確認された時点で画面を自動リロード
  • 講師には契約概念がないため対象外

ログイン試行制限・アカウントロック

  • 対象: メール + パスワード認証
  • 失敗時: 内部の失敗カウント・ロック予定時刻を記録(既定 60 分)
  • 成功時: 失敗カウントとロック予定時刻をリセット
  • 現状の課題: しきい値判定・ロック中の拒否処理が完成途中で、運用上のロック効果は限定的(改善対象)
  • ソーシャルログイン: 外部認証側に委譲のため本機能の対象外

メンテナンスモード

  • 現時点では未実装
  • メンテナンス時にユーザーに専用画面を表示する機能は提供していない
  • リリース・障害時のユーザー対応は別経路で運用

📝 レビュー観点:

  • 入力 → 処理 → 出力: ログイン → トークン発行 → セッション継続中の周期チェック → 自動ログアウト / 更新通知
  • エッジケース: 同時ログインで押し出された端末の操作、契約期限ピッタリのトーク表示、バージョン更新ダイアログを閉じても次回ポーリングで再表示
  • エラー表示: 押し出された端末は API 401 で気づく(FE が自動ログアウトに繋ぐ)

admin 操作

運営アドミン経路で可能な操作

  • アクセストークン / リフレッシュトークン一覧の参照(Redis から取得)

該当なし / 実装されていない

  • 運営アドミンによる強制ログアウト経路: 未実装
  • メンテナンスモードのオンオフ切替: 未実装
  • アカウントロック解除の運営アドミン経路: 未確認

📝 レビュー観点:

  • 強制ログアウト経路の必要性
  • メンテナンスモード導入の優先度

品質 / 約束事項

  • 応答性: ログインは即時、セッションチェックは周期実行
  • 信頼性: トークンは Redis に永続化、Redis 障害時はセッション制御不可
  • 制限値:
    • 同時ログイン: 2 台(dev 環境は 3 台)。メイン講師は制限対象外
    • アクセストークン有効期限: 12 時間
    • リフレッシュトークン有効期限: 1 週間
    • アカウントロック時間: 60 分(既定)
    • バージョンポーリング: 1 時間周期
    • 契約期限チェック: 1 分タイマー + 12 時間しきい値
  • データ保持: ログイン履歴は内部テーブル + S3 出力(dev 下段に詳細)

📝 レビュー観点:

  • [本機能特有] アカウントロック発火不全の可能性: 改善課題
  • [本機能特有] Redis 障害時の影響範囲

変更履歴(リリースノート候補)

v2.29.2: 2026-05-04(PSD 初版)

  • [PSD 追加] 本ドキュメント初版作成。v2.29.2 時点の実装を起こし。機能追加・変更は含まない

📝 レビュー観点:

  • 過去の主要変更(同時ログイン制限導入 / バージョン検知導入 / 契約期限チェック追加 等)

関連ドキュメント


このページの内容を AI に質問しますか?
関連 spec を自動抽出して ChatGPT / Claude などに渡せます。
AI Prompt で開く →