2017-08-24 72 views
1

2つのSpring Boot RESTアプリケーションがあります。アプリケーションの1つがSpring RestTemplateで他を呼び出します。これらのアプリケーションをサーバーとクライアントのアプリケーションと呼ぶことができます。RestTemplateでCSRFトークンを渡す方法

サーバーアプリケーションは、クッキーとしてXSRF-TOKENトークンを送信しています。これはUI部分に対して行われます。しかし、サーバーからブラウザからの要求とクライアントアプリケーションからの要求を区別するための方法はありません(私が知っていることはありません)。だから私は選択的にCSRFトークンをサーバーからブラウザにのみ送ることはできません。

RestTemplateがCSRFクッキー/ヘッダーを検出してリクエストを再生できるように、Springに組み込まれたメカニズムがありますか?

どうすれば手動で同じ操作を行うことができますか?私はCSRF例外が発生するのを待ってから、応答のクッキーを読んでそれを再生する必要がありますか?

それが1回実行されていればOKであるが、RestTemplateのコールがすべて正しくないようにするために例外を待つ。

トークンを一度保存​​して次回から設定しようとするかもしれませんが、どのように複数のサーバーアプリケーションのシナリオ(次に実装する必要があります)を処理しますか? CSRFのように、1つのサーバーアプリケーションのトークンが他のトークンに対して無効であるため、単一のトークンを保存することはできませんが、新しいサーバーアプリケーションURLごとにエントリを持つトークンのマップを保存する必要があります。

これはすべて複雑すぎるように見えますが、私はむしろSpringでそれを処理するようにします。

すべての手がかりは評価されています。私はCSRFのクッキーを取得するために呼び出すことができ、サーバアプリで保護せずにRESTサービスを実装している今の

おかげ

答えて

0

。セッションを常に作成して、CSRFクッキーが1つのセッションで変更されないようにして、エラーCould not verify the provided CSRF token because your session was not foundを回避できるようにしなければなりませんでした。

クライアントアプリケーションは、CSRF restサービスを呼び出してクッキーを取得し、次のサービスコールでそれを送信します。

RestTemplateを介してREST呼び出しごとにCSRFトークンサービスを呼び出すように思われますが、セッションを格納する複雑なロジックを実装することができません。 CSRFトークンサービスはクッキーを配信するだけで、ネットワークコールは実際のサービスコールと比べて時間がかかりません。

また、永続ストレージ(SQLデータベースまたはRedis)を使用してサーバーアプリケーションのCSRFトークンを保存し、クライアントアプリケーションが永続ストレージから直接読み取りできるようにすることも考えていました。

しかし、クライアントが必要とするトークンを特定するためにSession + Server app + CSRF tokenをどのように関連付けるのか分かりませんでした。クライアントは最初にセッションを持っていないので、データベースからのトークンであるCSRFトークンを一意に見つけることはできません。この方法は、RestTemplateが次の呼び出しのセッションを保存しないという事実によってさらに複雑になります。

関連する問題