課題5:献立確認画面から入力画面に戻った時、「フォーム再送信の確認」が表示されてしまう

献立確認画面の「戻る」ボタンを押すと、ブラウザの履歴機能を利用して、入力画面に戻り入力内容を編集することができます。
しかし、この「戻る」ボタンを押すと、「フォーム再送信の確認」という画面が表示されます。


原因:(まだ理解不足のため、要更新)セッションを使っていると
自動でキャッシュ制御用のHTTPヘッダーが送られるため、クライアント側のキャッシュが使用できなくなるから、です。

「ページの有効期限切れ・フォーム再送信の確認」の対策 - enma-laravel


(なぜセッションを使うとキャッシュが使用できなくなるかというと、
処理の重複(この場合は、同じ献立を2回登録してしまうこと)を避けるためです。

(そもそもキャッシュは、閲覧ページの情報を一時的に保存する機能で、単にページを見ているだけのときは問題ないけど、
ECサイトで買い物カゴに商品を登録したり、とか、入力フォームにデータを入力したり、とか
データの更新(やりとり)があった場合、「戻る」ボタンを押しても「データを更新した」という事実は残っているので、
再び画面遷移をした時、「戻る」ボタンを押す前の「データを更新した」という事実に加え、
また新たに「データを更新した」という扱いにされてしまうようです。(データの重複)


でも、それはキャッシュの性であって、セッション関係なく発生してしまうことじゃないのかな、と思ってしまい、
なぜセッションを使うとこの画面が表示されるのか、単にキャッシュの問題じゃないのか、と消化不良な状態です。
キャッシュ・セッション・クッキーの違いについて、まだまだ勉強不足なので、
勉強後にまたこの辺りの内容を更新しようと思います。(2020/8/11)


対策:原因が二重登録を防ぐ、というのは確実なので、
これを防ぐための対策は、トークンを利用して画面遷移を管理する、ことです!
具体的には、入力画面でランダムな数字でトークンを発行してセッションに登録し、
かつPOST送信をし、確認画面でセッションに保存されたトークンの値とPOST送信されたトークンの値が同じかどうかで
画面遷移が正しい順番で行われているかを管理します。
つまり、入力→確認→入力画面という正しい遷移であれば、トークンは常に一致しており、
これによって一連の同様の処理の流れであることを認識できるようになります!

二重登録を防ぐだけでなく、今まではURL窓に「mypage_confirm.php」と入れちゃえば、
入力必須のデータが入っていなくても移動できてしまいましたが
それも防げるようになりました。

まだ理解としては半分ぐらいなので、内容に自信がありません・・・。