6

ユーザーの認証を維持するために、Spring Security の RememberMe Services を使用しています。

有効期限を固定するのではなく、RememberMe Cookie をセッション Cookie として設定する簡単な方法を見つけたいと思います。私のアプリケーションでは、ユーザーがブラウザーを閉じるまで Cookie が保持されるはずです。

これを最適に実装する方法について何か提案はありますか? これが潜在的なセキュリティ問題であるという懸念はありますか?

そうする主な理由は、Cookie ベースのトークンを使用すると、ロード バランサーの背後にあるサーバーのいずれかが、HttpSession に格納されるユーザーの認証に依存することなく、保護された要求を処理できるためです。実際、名前空間を使用してセッションを作成しないように Spring Security に明示的に指示しました。さらに、Amazon の Elastic Load Balancing を使用しているため、スティッキー セッションはサポートされていません。

注: 2008 年 4 月の時点で、Amazon がスティッキー セッションをサポートするようになったことは承知していますが、他にもいくつかの理由でそれらを使用したくありません。つまり、1 つのサーバーが不意に停止した場合でも、そのサーバーに関連付けられているすべてのユーザーのセッションが失われる可能性があります。 http://aws.amazon.com/about-aws/whats-new/2010/04/08/support-for-session-stickiness-in-elastic-load-balancing/

4

2 に答える 2

5

Spring Security 3は、Cookieの生成方法の構成を提供していません。デフォルトの動作をオーバーライドする必要があります。

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices;

/** Cookie expires on session. */
 public class PersistentTokenBasedRememberMeServicesCustom extends
   PersistentTokenBasedRememberMeServices {

  /** only needed because super throws exception. */
  public PersistentTokenBasedRememberMeServicesCustom() throws Exception {
    super();
  }

  /** Copy of code of inherited class + setting cookieExpiration, */
  @Override
  protected void setCookie(String[] tokens, int maxAge,
      HttpServletRequest request, HttpServletResponse response) {
    String cookieValue = encodeCookie(tokens);
    Cookie cookie = new Cookie(getCookieName(), cookieValue);
    //cookie.setMaxAge(maxAge); 
    cookie.setPath("/");
    cookie.setSecure(false); // no getter available in super, so always false

    response.addCookie(cookie);
  }
}

Bean構成にクラス名を追加して、 rememberMeService用にこのカスタマイズされたPersistentTokenBasedRememberMeServicesを使用していることを確認してください。

<beans:bean id="rememberMeServices"
 class="my.custom.spring.PersistentTokenBasedRememberMeServicesCustom"/>
于 2010-04-23T20:36:59.553 に答える
3

負荷分散を使用してセッションを適切に機能させるには、セッション データを SQL データベースに保存します。

Cookie は、常に有効期限が切れるランダムな値である必要があります。状態を Cookie 値として保存でき、ユーザーの優先言語などのセキュリティ上の危険がない場合もありますが、これは可能な限り回避する必要があります。HttpOnlyCookies をオンにするのは素晴らしいアイデアです。

A3: 2010 年の OWASP トップ 10 の「Broken Authentication and Session Management」を読んでください。このセクションの重要なポイントの 1 つは、セッション全体で https を使用する必要があることです。セッションが非常に長時間続く場合、これはさらに重要です。

また、「Remember Me」は、攻撃者がセッションに「乗る」ことができる大きなウィンドウを作成することに注意してください。これにより、攻撃者は CSRF 攻撃を実行できる非常に長い時間 (数か月?) を得ることができます。CSRF 保護があっても、攻撃者は XSS と XmlHttpRequest を使用してセッションに乗ることができます (HttpOnlyCookies は完全なハイジャックを防ぎます)。「Remember Me」は、xss、csrf、スニッフィングなどの他の脅威をより深刻にします。これらの脆弱性が解決されている限り、現実世界のハッカーに問題はないはずです。

「remember me」機能を実装するための最も簡単な (そして安全な) 方法は、セッション タイムアウトを変更して非常に長く (数か月) することです。「remember me」チェックボックスがオフの場合、新しいタイムアウト (ログインから 1 日) でセッション変数を保存します。ブラウザーが閉じられたときに Cookie がブラウザーによって削除された場合でも、セッションはサーバー側でアクティブなままであることに注意してください。セッション ID が盗まれた場合でも、引き続き使用できます。

于 2010-04-09T15:51:58.520 に答える