Spring Securityセッションの管理


作成したアカウントを使用してサーバから認証を取得すると、サーバにセッションが作成されます.他のブラウザまたは他のPCで同じアカウントを使用してログインすると、サーバで以前に作成したセッションを共有するのではなく、新しいセッションが作成されます.
今回の記事では、これらのセッションの数を制限するなど、いくつかの設定について説明します.

1.同時セッション管理


スプリング宣言では、1つの勘定科目に対して作成したセッションの数を設定し、セッションが最大数に達したときの処理方法を簡単に設定できます.これらの設定は、1.1に記載のmaximumSessions()maxSessionsPreventsLogin()によって行うことができる.

1.1同時セッション管理設定コード

    protected void configure(HttpSecurity http) throws Exception {     
        http.sessionManagement()
                .maximumSessions(1)
                .maxSessionsPreventsLogin(true)
                .invalidSessionUrl("/invalid")
                .expiredUrl("/expired ");
    }
  • maximumSessions(1):最大許容セッション数のapiを設定します.(値-1はセッションを無制限に作成できます)
  • maxSessionsPreventsLogin(true):上記で設定した最大許容セッション数が達したときに、追加の認証要求(セッションの作成)があった場合、どのように処理するかを指定するAPIです.(trueの場合、現在のユーザー認証に失敗します.false(デフォルト)の場合、既存のセッションは期限切れになります.)
  • invalidSessionUrl("/invalid"):セッションが無効な場合に移動するページを設定するapi.
  • expiredUrl("/expired "):セッションが期限切れになったときに移動するページを特定するapi.
  • 1.1. 最大セッション数の処理方法

    maximumSessions()の設定が1の場合について説明する.
    1.以前のユーザー・セッションの有効期限が切れています
    step 1. ユーザー1がログインすると、そのアカウントのセッションがサーバに作成されます.
    step 2. ユーザー2がユーザー1がログインしている同じアカウントにログインしようとする場合は、複数のフィルタの「SessionManagement MetFilter」の値が1であることを確認します.
    step 3. サーバは、新しいアクセスを試みるユーザ2の新しいセッションを作成し、認証します.ユーザ1のセッションはmaximumSessions()に変更され、セッションの有効期限が設定されます.
    step 4. ユーザー1が要求を再度要求すると、ConcurrentSessionFilterはsession.isExpired() == trueの値をチェックして、3つの線が期限切れであるかどうかを判断し、検証を要求して新しいセッションを作成します.
    2.新しいユーザー認証に失敗しました
    step 1. ユーザー1がログインすると、そのアカウントのセッションがサーバに作成されます.
    step 2. ユーザー2がユーザー1がログインしている同じアカウントにログインしようとする場合は、複数のフィルタの「SessionManagement MetFilter」の値が1であることを確認します.
    Step 3. サーバはユーザー2のセッションを作成しませんが、認証異常が発生します.
  • ConcurrentSessionFilter:各リクエストにユーザー・セッションsession.isExpired()があるかどうかを確認し、セッションの有効期限が切れたときにログアウト(期限切れ)を処理できます.
  • SessionManageMetFilter:同時セッション制御、セッション固定保護、セッション作成ポリシーなど、セッションを管理するためのフィルタです.
  • 2つのフィルタのセッションの有効期限切れの全体的な動作は、次のとおりです.
  • 2.固定セッション保護


    固定されたセッションIDを持つセッションを使用する場合、攻撃者がサーバ上でセッションを作成し、そのセッションIDをユーザーに渡すと、ユーザーと攻撃者は同じセッションを使用し、攻撃者がユーザーの情報を抽出できなくなります.

    Spring Securityのデフォルトでは、これらの問題は保護されます.

    2.1. 三線固定保護設定コード

        protected void configure (HttpSecurity http) throws Exception {
            http.sessionManagement()
                    .sessionFixation().changeSessionId()
        }
    これらの設定には、次の4つのオプションがあります.
  • maximumSessions():ユーザーが検証を試みると、ユーザー・セッションは保持され、セッション名のみが変更されます->セッションIDが変更され、攻撃者が持つセッションIDは不要になります.(デフォルトは3.1以降です)
  • :新しいセッションを作成し、セッションIDを再発行して移行します.(デフォルトは3.1より前です.)
  • session.isExpired()-:新しいIDと新しいIDが作成され、以前の設定は使用できませんでした.
  • changeSessionId():保護なしX
  • newSession()none()は、以前のセッションの設定値を保持します.ただし、changeSessionId()では、以前の設定が使用できないように、新しいセッションが作成されます.
    デフォルトでは、Spring Securityはこれらの機能を設定する必要がなく適用します.

    3.セッションポリシーの設定


    Springでは、セッションの作成と使用のポリシーを設定できます.

    3.1. セッションポリシー設定コード

        protected void configure(HttpSecurity http) throws Exception {
            http.sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.If_Required)
        }
    これらの設定には、次の4つのオプションがあります.
  • migrateSession():スプリング宣言は常にgセッションを作成します.
  • newSession():スプリングの安全保護が必要な場合に作成します.(default)
  • SessionCreationPolicy.Always:スプリングパリティは作成されませんが、既に存在する場合は使用します.
  • SessionCreationPolicy.If_Required:スプリングシリーズは作成されず、存在しても使用されません.(セッションがJWTと同じでない限り)
  • Reference

  • インフラストラクチャ-スプリングセキュリティSpring Bootに基づいて開発されたSpring Security