本文へ移動
easeweb
ご相談
トピックを検索

ログインし直すと入力内容が消えてしまうセッション切れ

保険金の請求フォームは、最後のリクエストから30分でログアウトさせることをどこにも書いていないうえ、ログインし直すと、入力した内容が消えた状態のフォームに戻ってしまう

WCAG 2.2
SC 2.2.6AAA· 2.1 で追加SC 2.2.5AAA
必須とする規格
Section 508、EN 301 549、JIS X 8341-3 では必須ではない
問題あり res.redirect('/sign-in')
アクセシビリティの問題を示した図: 認知:ログインし直したのに、書いた内容はどこ?
01

問題

フォームの入力に時間がかかる人が、制限があることを知らないままログアウトされ、ログインし直すと、書いた内容をすべて失う

02

試してみる

30分離れてから請求を送り、もう一度ログインしてみましょう

ウィンドウの上の時計は、離れている時間を進めるためのデモ用のもので、保険会社のサイトの一部ではありません。フォームを離れてよい時間は書かれていますか?ログインし直すと、請求の内容はどうなっていますか?

修正を適用して、同じことを試してください。

問題あり 修正できますか?

問題送られた内容を捨てるログイン
デモ用の時計:フォームを離れて 0分
Harbourline Alexとしてログイン中

保険金の請求

再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。

03

修正方法

ログインし直しても、入力した内容を残す

修正前
問題送られた内容を捨てるログイン
<form id="claim" method="post" action="/claims">  <h1>保険金の請求</h1>  <label for="policy">証券番号</label>  <input id="policy" name="policy" value="{{ fields.policy }}">  <label for="what">事故の状況</label>  <textarea id="what" name="what" rows="8">{{ fields.what }}</textarea>  <button>送信する</button></form>
問題点4点
  • 30分でログアウトされることも、そのとき入力した内容が失われることも、フォームのどこにも書かれていません。
  • 入力してもサーバーには何も送られないため、30分書き続けても、30分離れていたのと同じに数えられます。
  • その後に送った請求は捨てられ、ログイン後のために残るのはフォームのアドレスだけです。
  • ログインし直すと、フォームは空で戻ってきます。
修正後

ページの上でログインし直し、同じ請求を送る

<form id="claim" method="post" action="/claims">  <h1>保険金の請求</h1>  <label for="policy">証券番号</label>  <input id="policy" name="policy" value="{{ fields.policy }}">  <label for="what">事故の状況</label>  <textarea id="what" name="what" rows="8">{{ fields.what }}</textarea>  <button>送信する</button></form> <dialog id="sign-in-again" aria-labelledby="sign-in-title">  <form id="sign-in" method="post" action="/sign-in">    <h2 id="sign-in-title">もう一度ログインして、請求を送信してください</h2>    <p>入力した請求の内容は残っています。パスワードを入力すると送信します。</p>    <input type="hidden" name="username" value="{{ user.email }}" autocomplete="username">    <label for="password">パスワード</label>    <input id="password" name="password" type="password" autocomplete="current-password">    <button>ログインして送信</button>  </form></dialog>
修正の手順4ステップ
  1. 請求は fetch でページから送ります。サーバーがどう答えても、フォームはそのまま残ります。
  2. セッションが切れていたら、リダイレクトではなく401で請求に答えます。これで、ページの側でログインを求めればよいと分かります。
  3. フォームの上に、ログインのダイアログを showModal() で開きます。フォーカスはダイアログへ移ります。アカウントは入力済みなので、求めるのはパスワードだけで、パスワード管理ツールでも入力できます。
  4. ログインできたらダイアログを閉じ、同じ請求をもう一度送ります。

これで修正前の例は直り、2.2.5と2.2.6を満たします。請求の内容はページに残り続けるため、どれだけ離れていても失われません。失われるのはタブを閉じたときだけで、W3Cはタブを閉じることをタイムアウトとして数えていません。ただし、スクリプトが必要で、ログインもページの中で済ませられなければなりません。別のサイトを通してログインするサイトは、次の修正か、下のシングルサインオンの項を参考にしてください。

04

修正の確認

5項目、マウス不要

確認方法: キーボード、スクリーンリーダー、パスワード管理ツール

5件中0件を確認済み

OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。セッションの設定、ログインの流れ、フォームを変更した際は、再度確認します。

スクリーンリーダーでの <dialog>の読まれ方

制限

このガイドで扱うのは、セッションが切れたときに入力した内容が失われることと、それまでの時間を伝えることです。制限の前に警告し、延長できるようにするのはレベルAで、別のガイド警告も延長もないセッションタイムアウトで扱っています。時間制限そのものがある作業は2.2.3「タイミング非依存」の対象で、別のガイド確保した座席が時間切れで解放されてしまう購入手続きのタイマーで扱っています。2.2.5と2.2.6はAAAで、W3Cはサイト全体にAAAを求めることを勧めていません。それでも、ログインが必要な長いフォームなら、入力した内容を残すだけでどちらも満たせます。入力内容を残して安全かどうか、どれだけの間残すかは、サービスを運営する人が、プライバシーの担当者と一緒に決めることです。

よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。

EaseWebのサービス

修正した問題を、次のリリースで再発させない

このガイドのような修正方法を、コーディングエージェントが従うルールと、CIのチェックに組み込みます。あわせて定期的に、キーボードとスクリーンリーダーで手動の再テストを行います。

サービス内容を見る