Spring Springセキュリティを使用したログイン処理-(3)


CSRF設定

  • スプリングパリティデフォルトでは、クロスサイト要求偽造(CSRF)と呼ばれる攻撃を防ぎ、GET以外のすべての要求メソッドに含めて正常に動作するために任意の値を作成する必要があります.
  • CSRF攻撃は「サイト間要求偽造」と訳すことができる.
  • サーバで受信した情報を利用して予め検証されていない欠点のある攻撃方法である.
  • CSRFを使用して、投稿のクリック率を単純に増やすなどの操作から、被害者のアカウントを使用するまで、さまざまな攻撃を行うことができます.
  • CSRF攻撃例


    たとえば、Aというサイトがあるとします.攻撃者は、
  • Aサイトに特定のユーザレベルを変更するURLが存在し、そのURLにはいくつかのパラメータが必要であることを知っていると仮定する.
  • 攻撃者は、Aサイト管理者が頻繁にアクセスするBサイト上で、<img>タグまたは<form>タグを使用して、上記URIを追加する投稿を作成する.
  • Aサイトの管理者は、通常アクセスしているBサイトにアクセスし、攻撃者が作成した投稿を表示します.
  • <img>タグなどのURIを呼び出し、サーバはログイン管理者の要求に従って攻撃者をadminレベルのユーザに変更する.
  • Aサイトの管理者が管理するAサイトにログインしている場合、サーバの観点から、このサイトはログインしたユーザーの通常の要求として解釈されます.
  • CSRF攻撃は、サーバが受信した要求を解析および処理する際に、どこから呼び出すかを考慮しないことによって生じる脆弱性に対する攻撃である.
  • 「サイト間リクエストの偽造」ですが、実際には1つのサイトで完了できます.
  • CSRFはURI(例えば<img>ラベル)を使用することができるので、攻撃しやすい方法である.
  • 現在のプロジェクトで自動的に作成されたログイン・ページには、「ページ・ソースの表示」機能があり、コンテンツを表示すると、CSRFタグ値が次の画面と同様に非表示になっていることがわかります.
  • デフォルトでは、
  • CSRFトークンはセッションごとに1つ作成されるので、次の図に示すように、セッションの異なるユーザは異なる値を作成します.
  • セキュリティの面では、CSRFタグ
  • (通常はセッション)を使用することを推奨しますが、CSRFタグは発行されない場合があります.これは、毎回CSRFタグの値(RESTなど)を知る必要があるため、不便です.
  • CSRFトークンの無効化


  • HttpSecurityのcsrf()メソッドを使用してCSRFトークンを無効にするには、次の簡単な設定を追加します.


  • 上記でdisable()を指定して生成したログインページコードは設計上の差異はありませんが、CSRFタグは必要ありません.
  • logout設定

  • formLogin()と同様に、logout()メソッドはログアウトの処理を許可します.
  • FormLogout()は、ログインと同様に、他の設定がない場合はSpring Securityから提供されるWebページが表示されます.
    -SecurityConfigdp logout()を適用するだけです.
  •  @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .antMatchers("/sample/all").permitAll()
                    .antMatchers("/sample/member").hasRole("USER");
    
            http.formLogin();//인증/인가에 문제시 로그인 화면
            http.csrf().disable();
            http.logout();
        
  • logout()注意すべき点は、CSRFタグを使用する場合はPOST方式でログアウトを処理しなければならないことである.
  • CSRFタグを使用すると、/logoutという名前のURLを呼び出すと、<form>タグとボタンからなる画面が表示されます.
  • CSRFがdisable()としてマークされていない場合、ログアウトもGETで処理されます.
    formLogin()と同様に、
  • ログアウトでは、ユーザーがログアウトに関連する個別の設定を追加することもできます.
  • logoutUrl()、logoutSuccessUrl()などを指定できます.
  • デフォルトでは、
  • スプリングパリティではHttpSessionが使用されます.無効なHttpSession()とdeletCookies()を使用してCookieまたはセッションが無効になるように設定できます.