背景から始めるために、この投稿はCSRFトークンについてJeff Atwoodが述べたものです。このページで、彼は続けて言っています:
さらに強力ですが、より複雑な防止方法は、サーバーの状態を活用することです。つまり、クライアントに送信するすべてのHTMLフォームに対して一意のランダムキーを生成(およびタイムアウト付きで追跡)します。Stack Overflowでこのメソッドのバリアントを使用して、大きな成功を収めています。
しかし、この投稿自体では、Jeffはトークンをいつ、どのように更新する必要があるかについて決してコメントしていません。
私が取り組んでいるWebアプリで同様のテクニックを使用していました。それはこのように動作します:
- ユーザーが
POST
サーバーにデータを送信するたびに、csrfトークンが送信されます。 - このCSRFトークンは、ユーザーのセッションで暗号的に強力なCookieに保存されます。
- トークンが有効な場合は、ユーザーのリクエストが処理され、逆の場合も同様です。
- リクエストが有効な場合は、サーバー側の古いトークンを破棄し、新しいトークンを作成します。サーバーからの応答には、次の要求で使用される新しいcsrfトークンが含まれています。ページ上のすべてのフォームの古いトークンが新しいトークンで更新されるため、次のリクエストが適切に処理されます。
トークンを更新してからPOST
リクエストするのが賢明ですか、それともユーザーがGET
リクエストを行ったときにのみ更新を行い、次のGETリクエストが行われるまで同じトークンを保持する必要がありますか?