Spring Boot を使用して記述された REST API でステートレス トークン ベースの認証を使用すると、奇妙な動作が見られます。
クライアントには各リクエストに JWT トークンが含まれており、GenericFilterBean を拡張する私が作成したカスタム フィルターは、トークン内のクレームに基づいて、次を使用して認証オブジェクトをセキュリティ コンテキストに追加します。
SecurityContextHolder.getContext().setAuthentication(authentication);
リクエストを処理した後、次のようにしてコンテキストをクリアします。
SecurityContextHolder.getContext().setAuthentication(null);
しかし、私が開発した単純なアプリがさまざまな操作を実行すると、セキュリティ コンテキストが正しく設定されていないことが時々わかります。トークンを提供したリクエストに対して null になることもあります。フィルターは正しく呼び出され、setAuthencation() も呼び出されていますが、要求は認証に失敗し、403 拒否がスローされます。
セッション作成ポリシーを STATELESS に設定して明示的に http セッション管理をオフにすると、この動作は停止します。
ここで何が起こっているのでしょうか?セキュリティ コンテキストは、何らかの方法でリクエストを処理するスレッド間で共有されていますか?