2017-07-11 5 views
1

This articleは、BREACH攻撃を防ぐために、毎回CSRFトークンを変更する必要があることを示唆しています。つまり、gzip/brotliとセッションごとのCSRFトークンとSSLを使用する場合、私たちのトークンはわずか1000件のリクエストで脆弱です。ユーザビリティやセキュリティを犠牲にすることなく、すべてのリクエストで新しいCSRFトークンを生成する方法は?

もしそうだとすると、バック/フォワードと複数のタブを壊すことなく、すべての要求に対してCSRFトークンを再生成する方法を教えてください。

わかりやすい解決策は、正当なCSRFトークンの配列を最新のものではなく、私たちのセッションに格納することです。恐らくそれを100程度に制限します。

しかし、代わりにJWTなどを使用するとどうなりますか?そこにユーザーIDだけを格納し、トークンが期限切れではなく、現在のユーザーに属していることを検証することができます。これをサーバーにまったく格納する必要はありません。唯一の問題は、ユーザーがログアウトしたときにCSRF-JWTを取り消すことができなかったことです。短期的な有効期限が必要ですが、短すぎることも、期限切れになることもありません。形。

この問題にアプローチするにはどうすればよいですか?

答えて

1

JWTを使用してヘッダー内のBearerトークンとして送信し、ローカルストレージに格納することができます。それをクッキーで送信しないでください。リクエストごとに送信し、リクエストごとに有効性をチェックします。ユーザーにログアウト時に取り消すことができる更新トークンをユーザーに与えることができます。リフレッシュトークンは、各呼出しに対して非常に短い期間が経過した後に満了するアクセスJWTを生成する。

JWTを使用して、アクセス制御と必要なすべての認証を行うことができます。

+0

なぜクッキーで送信しないのですか?私は毎回それを捨てるのですが、どうして私はそれを保管しておくのですか?通常のように、私のフォーム上の隠された入力に詰め込むだけです。 – mpen

+0

クッキー内にある場合は、ノンスを追加しないとCSRFのリスクがあります。要求ごとにトークンを格納する必要はありませんが、複数の要求に対してトークンを存続させることができます。リフレッシュトークンを保存する必要があります。トークンは時間ベースなので、ノンスとしてしか使用していない場合を除いて、非表示のフィールドに入れたくありません。 – HackEDU

+0

なぜ更新トークンを保存する必要がありますか?リフレッシュトークンはAPIには便利ですが、これは私がここで構築しているものではありません。私は毎回新しいトークンを与えています。ユーザーはトークン自体をリフレッシュする必要はありません。私が隠しフィールドにトークンを入れておらず、クッキーを入れていないのであれば、ユーザーがフォームを送信したときにトークンを元に戻す方法は? CSRFをフォームとともに提出する必要があります。 JWTは有効期限が切れるまで有効です。 – mpen

関連する問題