Java Technologies Spring Security এবং Session Management গাইড ও নোট

367

Session Management হল একটি গুরুত্বপূর্ণ অংশ, বিশেষ করে যখন আপনি ব্যবহারকারীদের লগইন এবং সেশন পরিচালনা করতে চান। Spring Security সেশন ম্যানেজমেন্টের জন্য একটি শক্তিশালী এবং নমনীয় সিস্টেম সরবরাহ করে, যা আপনাকে লগইন সেশন, সেশন টাইমআউট, সেশন ফিক্সেশন আক্রমণ (session fixation attack) থেকে সুরক্ষা এবং অন্যান্য নিরাপত্তা ব্যবস্থা নিয়ন্ত্রণ করতে সাহায্য করে।

Spring Security সেশন ম্যানেজমেন্ট সাধারণত সেশন আইডি (session ID) ব্যবহার করে, যা একটি নির্দিষ্ট ব্যবহারকারীর জন্য সেশনের অবস্থান বজায় রাখে। এটি নিশ্চিত করে যে, ব্যবহারকারী সেশন থেকে বের হওয়ার পরে কোনো অবৈধ অ্যাক্সেস না ঘটে।


Session Management Features in Spring Security

Spring Security সেশনের বিভিন্ন দিক নিয়ন্ত্রণ করতে সাহায্য করে:

  1. Session Fixation Protection:
    • Spring Security সেশন ফিক্সেশন আক্রমণ প্রতিরোধে সাহায্য করে। এটি ব্যবহারকারীর লগইনের পর সেশন আইডি পুনরায় সেট করে, যাতে আক্রমণকারী অন্য ব্যবহারকারীর সেশনের আইডি চুরি করতে না পারে।
  2. Session Timeout:
    • Spring Security সেশনের মেয়াদ শেষ হওয়ার সময় (session timeout) কনফিগার করতে সক্ষম। নির্দিষ্ট সময়ের পরে ব্যবহারকারী যদি কোনো কার্যকলাপে না থাকে, তাহলে সেশন অটোমেটিক্যালি এক্সপায়ার হয়ে যাবে।
  3. Maximum Sessions Per User:
    • নির্দিষ্ট ব্যবহারকারী একাধিক সেশনে লগইন না করতে পারে, এমন কনফিগারেশন করা যায়। এক ব্যবহারকারী কেবলমাত্র একবার লগইন করতে পারবেন।
  4. Concurrent Session Control:
    • Spring Security বিভিন্ন ব্যবহারকারীর সেশনের সংখ্যা নিয়ন্ত্রণ করতে সাহায্য করে, যাতে একই ব্যবহারকারী একাধিক ডিভাইসে বা ব্রাউজারে সেশন খোলার চেষ্টা করলে তা প্রতিরোধ করা যায়।

Spring Security Session Management কনফিগারেশন

1. Session Fixation Protection

Spring Security-তে সেশন ফিক্সেশন আক্রমণ প্রতিরোধ করতে sessionManagement() কনফিগারেশন ব্যবহার করা হয়। এটি MIGRATE_SESSION কৌশল ব্যবহার করে, যা লগইন পরবর্তী সেশন আইডি পরিবর্তন করে।

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .sessionManagement()
            .sessionFixation().migrateSession()  // Enable Session Fixation Protection
            .and()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin();  // Enable form-based login
    }
}
  • migrateSession(): এটি ব্যবহারকারীর লগইন করার পর সেশন আইডি পরিবর্তন করে, যাতে সেশন ফিক্সেশন আক্রমণ প্রতিরোধ করা যায়।
  • none(): সেশন ফিক্সেশন প্রতিরোধ নিষ্ক্রিয় করবে, তবে এটি নিরাপত্তাহীন হতে পারে।
  • newSession(): লগইনের পর একটি নতুন সেশন তৈরি করবে।

2. Session Timeout Configuration

Spring Security তে সেশন টাইমআউট কনফিগার করতে sessionManagement() এর invalidSessionUrl() এবং maximumSessions() ব্যবহার করা যেতে পারে।

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .sessionManagement()
            .invalidSessionUrl("/session-expired")  // Redirect URL if session is invalid
            .maximumSessions(1)  // Limit concurrent sessions for a user
            .maxSessionsPreventsLogin(true)  // Prevent login if user has already logged in from another session
            .and()
            .and()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin();  // Enable form-based login
    }
}
  • invalidSessionUrl(): যখন সেশন এক্সপায়ার হয়ে যায়, তখন ব্যবহারকারীকে নির্দিষ্ট URL এ রিডিরেক্ট করে।
  • maximumSessions(): একটি ব্যবহারকারীর সর্বাধিক কতটি সেশন থাকতে পারবে তা সীমিত করে।
  • maxSessionsPreventsLogin(true): যদি একই ব্যবহারকারী একাধিক সেশনে লগইন করার চেষ্টা করেন, তবে নতুন সেশন তৈরি করতে না দেওয়ার ব্যবস্থা।

3. Session Timeout (Session Expiration Time)

Spring Security তে সেশন টেম্পোরারি হওয়ার সময় সীমা (session timeout) কনফিগার করতে server.servlet.session.timeout বা sessionManagement().sessionTimeout ব্যবহার করা যায়। এটি session-expired পৃষ্ঠায় রিডিরেক্ট করে।

application.properties এ সেশন টাইমআউট কনফিগারেশন:
server.servlet.session.timeout=15m  // Set session timeout to 15 minutes

4. Concurrent Session Control

Spring Security তে আপনি একই ব্যবহারকারী দ্বারা একাধিক সেশন খোলার কন্ট্রোল করতে পারেন। এটি concurrencyControl ব্যবহারের মাধ্যমে কনফিগার করা হয়।

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .sessionManagement()
            .maximumSessions(1)  // Allow only one session per user
            .expiredUrl("/session-expired")  // Redirect to expired session page
            .and()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin();  // Enable form-based login
    }
}
  • maximumSessions(1): এক ব্যবহারকারীকে একাধিক সেশন ব্যবহারের অনুমতি দেবে না। ব্যবহারকারী যখন দ্বিতীয়বার লগইন করবে, তখন প্রথম সেশনটি কাটা যাবে।
  • expiredUrl("/session-expired"): যখন সেশন এক্সপায়ার হবে, তখন ব্যবহারকারীকে একটি নির্দিষ্ট URL এ রিডিরেক্ট করা হবে।

Session Management-এ নিরাপত্তা উন্নতি

  1. Session Fixation Prevention: সেশন আইডি পরিবর্তন করার মাধ্যমে সেশন ফিক্সেশন আক্রমণ প্রতিরোধ করা।
  2. Session Timeout: সেশন নির্দিষ্ট সময় পরে এক্সপায়ার হবে, যা দীর্ঘ সময় ধরে অনুপস্থিত বা নিষ্ক্রিয় ব্যবহারকারীদের সেশন বন্ধ করে।
  3. Concurrent Session Control: একটি ব্যবহারকারী একাধিক সেশনে লগইন করতে না পারবে।

উপসংহার

Spring Security সেশন ম্যানেজমেন্ট কনফিগারেশন সিস্টেমের নিরাপত্তা নিশ্চিত করতে সহায়ক। এটি Session Fixation, Session Timeout, এবং Concurrent Session Control সহ সেশন সম্পর্কিত বিভিন্ন নিরাপত্তা বৈশিষ্ট্য সাপোর্ট করে। এই কনফিগারেশনের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনকে নিরাপদে পরিচালনা করতে পারবেন এবং ব্যবহারকারীদের সুরক্ষিত সেশন প্রদান করতে পারবেন।

Content added By

Session Management কি এবং এর প্রয়োজনীয়তা

280

Session Management একটি গুরুত্বপূর্ণ ধারণা যা ওয়েব অ্যাপ্লিকেশনে ব্যবহারকারী সেশন পরিচালনা করে। ওয়েব অ্যাপ্লিকেশনগুলোতে, যখন ব্যবহারকারী লগইন করে, তখন তার একটি সেশন তৈরি হয়, যার মাধ্যমে সার্ভারের সাথে তার যোগাযোগ পরিচালনা করা হয়। Spring Security-তে Session Management মূলত সেশন সুরক্ষা এবং সেশন সংক্রান্ত বিভিন্ন কার্যক্রম পরিচালনার জন্য ব্যবহৃত হয়।


Session Management কি?

Session Management হলো সেশন তৈরি, মনিটরিং, এবং পরিচালনা করার প্রক্রিয়া। এটি ব্যবহারকারীকে লগইন, অ্যাক্সেস কন্ট্রোল, সেশন টাইমআউট, সেশন ফিক্সেশন প্রতিরোধ ইত্যাদি কার্যক্রমের মাধ্যমে ওয়েব অ্যাপ্লিকেশন সুরক্ষিত করে। Spring Security এর মাধ্যমে সেশন ম্যানেজমেন্ট কাস্টমাইজ করা যায়।

একটি session সাধারণত ব্যবহারকারীর ইন্টারঅ্যাকশন, যেমন লগইন, লগআউট, বা অন্যান্য কার্যকলাপের মধ্যে সার্ভারের সাথে সংযুক্ত থাকে। সেশন সাধারণত একটি সেশন আইডি দ্বারা চিহ্নিত হয় যা কুকি হিসেবে ব্রাউজারে পাঠানো হয়।


Spring Security তে Session Management এর প্রয়োজনীয়তা

  1. ব্যবহারকারীর সেশন ট্র্যাকিং: সেশন ব্যবস্থাপনা ব্যবহারকারীকে ওয়েব অ্যাপ্লিকেশনের সাথে সক্রিয়ভাবে ইন্টারঅ্যাক্ট করার অনুমতি দেয়। লগইন করার পর, ওয়েব অ্যাপ্লিকেশনটি ব্যবহারকারীর সেশন ট্র্যাক করতে সক্ষম হয় এবং সঠিকভাবে অ্যাক্সেস নিয়ন্ত্রণ করতে পারে।
  2. Session Fixation Protection: Session Fixation হল একটি আক্রমণ যেখানে আক্রমণকারী আগে থেকেই একটি সেশন আইডি তৈরি করে এবং সেটি ব্যবহারকারীকে চাপিয়ে দিয়ে ব্যবহারকারীর সেশন হাইজ্যাক করতে পারে। Spring Security সেশন ফিক্সেশন আক্রমণ প্রতিরোধ করার জন্য সেশন আইডি পরিবর্তন করতে সক্ষম।
  3. Session Timeout Management: সেশন ম্যানেজমেন্ট সিস্টেম ব্যবহারকারীর সেশনটি নির্দিষ্ট সময় পর বন্ধ করে দেয়, যাতে অনুপস্থিত বা অকার্যকর সেশনগুলি অব্যবহৃত না থাকে। এটি নিরাপত্তা উন্নত করে এবং সার্ভারের সম্পদ সঞ্চয় করে।
  4. Concurrent Session Management: যখন একাধিক সেশন চালু থাকে, তখন সেশন ম্যানেজমেন্ট এটি কন্ট্রোল করতে সহায়তা করে। একাধিক লগইন অবস্থা পর্যবেক্ষণ এবং একটি অ্যাকাউন্টের জন্য একাধিক লগইন নিষিদ্ধ করতে এটি ব্যবহার করা হয়।
  5. Logout Management: সেশন ম্যানেজমেন্ট সিস্টেম লগআউট করার পর সেশন মুছে দেয়, যা নিরাপত্তা নিশ্চিত করতে সহায়ক।

Spring Security তে Session Management কনফিগারেশন উদাহরণ

Spring Security তে সেশন ম্যানেজমেন্ট কনফিগারেশন করতে HttpSecurity ব্যবহার করা হয়।

১. Session Fixation Protection

Spring Security ডিফল্টভাবে সেশন ফিক্সেশন প্রতিরোধ সক্রিয় থাকে, তবে আপনি এটি কাস্টমাইজও করতে পারেন।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .sessionManagement()
                .sessionFixation().migrateSession();  // Session fixation protection
        return http.build();
    }
}

উপরের কনফিগারেশনে:

  • .sessionFixation().migrateSession() সেশন ফিক্সেশন প্রতিরোধ করার জন্য ব্যবহৃত হচ্ছে। এটি পুরানো সেশন আইডি পরিবর্তন করে এবং নতুন সেশন আইডি তৈরি করে।

২. Concurrent Session Control

Spring Security তে একাধিক সেশন ব্যবস্থাপনা করতে maximumSessions() ব্যবহার করা হয়।

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .sessionManagement()
                .maximumSessions(1)  // শুধুমাত্র 1টি সেশন অনুমোদন
                .expiredUrl("/session-expired");  // সেশন এক্সপায়ার হলে রিডাইরেক্ট URL
        return http.build();
    }
}

উপরের কনফিগারেশনে:

  • .maximumSessions(1) কনফিগারেশনটি একে একে একাধিক সেশন নিষিদ্ধ করে এবং শুধুমাত্র একটি সেশন অনুমোদন করে।
  • .expiredUrl("/session-expired") এর মাধ্যমে সেশন এক্সপায়ার হলে ব্যবহারকারীকে "/session-expired" পেজে রিডাইরেক্ট করা হবে।

৩. Session Timeout Configuration

আপনি Spring Security তে সেশন টাইমআউট কনফিগার করতে পারেন।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .sessionManagement()
                .invalidSessionUrl("/session-invalid")  // সেশন অবৈধ হলে রিডাইরেক্ট URL
                .maximumSessions(1)
                .expiredUrl("/session-expired")
                .and()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);  // সেশন প্রয়োজন হলে তৈরি হবে
        return http.build();
    }
}
  • .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) সেশন সিস্টেমটি তখনই তৈরি করবে যখন এটি প্রয়োজন।

৪. Logout Handling

Spring Security তে লগআউট কনফিগার করার জন্য logout() ব্যবহার করা হয়।

http
    .logout()
    .logoutUrl("/logout")  // লগআউটের জন্য URL
    .invalidateHttpSession(true)  // সেশন মুছে ফেলা হবে
    .clearAuthentication(true)  // ব্যবহারকারীর অথেন্টিকেশন তথ্য পরিষ্কার হবে
    .logoutSuccessUrl("/login?logout");  // লগআউট সফল হলে রিডাইরেক্ট URL

এটি ব্যবহারকারী যখন লগআউট করবে তখন সেশন মুছে ফেলা হবে এবং সঠিক URL তে রিডাইরেক্ট হবে।


উপসংহার

Session Management Spring Security তে একটি অত্যন্ত গুরুত্বপূর্ণ অংশ, যা সুরক্ষিত সেশন তৈরি ও পরিচালনা করতে সাহায্য করে। এর মাধ্যমে আপনি সেশন টাইমআউট, সেশন ফিক্সেশন প্রতিরোধ, কনকারেন্ট সেশন কন্ট্রোল, লগআউট এবং আরও অনেক নিরাপত্তা ব্যবস্থা কার্যকর করতে পারেন। সঠিকভাবে সেশন ম্যানেজমেন্ট কনফিগার করলে আপনার অ্যাপ্লিকেশন অনেক বেশি সুরক্ষিত এবং ব্যবহারকারীর জন্য সহজ ও নিরাপদ হবে।

Content added By

Spring Security তে Session Fixation Protection কনফিগার করা

248

Session Fixation একটি নিরাপত্তা আক্রমণ যেখানে আক্রমণকারী ব্যবহারকারীর সেশনে প্রবেশ করতে পারে এবং সেশন আইডি চুরি করে অননুমোদিত অ্যাক্সেস পেতে পারে। Spring Security তে, Session Fixation Protection এভাবে কনফিগার করা যায় যে, যখন ব্যবহারকারী লগইন করেন, তখন সেশন আইডি পরিবর্তন হয়ে যায়, যাতে আক্রমণকারী পূর্বের সেশন আইডি ব্যবহার করে অ্যাক্সেস না পায়।

Spring Security Session Fixation Protection এই ধরনের আক্রমণ থেকে রক্ষা করতে সাহায্য করে। এটি সেশনের স্থিতিশীলতা বজায় রাখতে session fixation protection কনফিগার করে, যেখানে সেশন আইডি পরিবর্তন করা হয় (migrate or new session creation) লগইন করার পর।


Session Fixation Protection কনফিগারেশন

Spring Security তে, HttpSecurity এর মাধ্যমে সেশন ফিক্সেশন প্রোটেকশন কনফিগার করা যায়। এটি sessionManagement() পদ্ধতির মাধ্যমে করা হয়।

১. Basic Session Fixation Protection কনফিগারেশন

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests()
                .anyRequest().authenticated() // All requests must be authenticated
            .and()
            .sessionManagement()
                .sessionFixation().migrateSession() // Protect against session fixation
            .and()
            .formLogin()
                .permitAll(); // Allow login for everyone

        return http.build();
    }
}

এখানে, .sessionFixation().migrateSession() মেথডটি session fixation আক্রমণ থেকে রক্ষা করতে সেশন আইডি পরিবর্তন করে যখন ব্যবহারকারী সফলভাবে লগইন করেন।

২. আরও শক্তিশালী Session Fixation Protection

Spring Security তে, আপনি sessionFixation() কনফিগারেশনকে "newSession" এ সেট করতে পারেন, যা আরও শক্তিশালী এবং নতুন সেশন তৈরি করে লগইন করার পর।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests()
                .anyRequest().authenticated() // All requests must be authenticated
            .and()
            .sessionManagement()
                .sessionFixation().newSession() // Force creation of a new session upon login
            .and()
            .formLogin()
                .permitAll(); // Allow login for everyone

        return http.build();
    }
}

এখানে .sessionFixation().newSession() পদ্ধতি ব্যবহার করা হয়েছে, যা সেশন আইডি পরিবর্তন করে এবং একটি নতুন সেশন তৈরি করে লগইন করার পর। এটি session fixation আক্রমণ প্রতিরোধের জন্য সবচেয়ে শক্তিশালী পদ্ধতি।


Session Management কনফিগারেশন অপশনস

Spring Security তে sessionManagement() পদ্ধতির মাধ্যমে বিভিন্ন ধরনের সেশন কনফিগারেশন করা যায়:

  1. sessionFixation().migrateSession(): লগইন করার পর সেশন আইডি পরিবর্তন করে (মাইগ্রেট) কিন্তু পুরানো সেশন আইডি ব্যবহার করতে দেয় না। এটি অধিকাংশ সাধারণ ব্যবহার।
  2. sessionFixation().newSession(): লগইন করার পর সম্পূর্ণ নতুন সেশন তৈরি করে এবং পুরানো সেশনটিকে বাতিল করে দেয়। এটি নিরাপত্তার জন্য সর্বোত্তম এবং অধিক শক্তিশালী।
  3. maximumSessions(int maxSessions): একই সময়ে একাধিক সেশন তৈরি হওয়া আটকানোর জন্য সেশন সংখ্যা সীমাবদ্ধ করা।

    http.sessionManagement()
        .maximumSessions(1)
        .maxSessionsPreventsLogin(true); // Prevent new login when max sessions reached
    
  4. sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED): সেশন তৈরির নীতি নিয়ন্ত্রণ করে।
    • IF_REQUIRED: শুধুমাত্র যখন প্রয়োজন, তখন সেশন তৈরি করা হবে (ডিফল্ট পদ্ধতি)।
    • ALWAYS: প্রতিটি অনুরোধের জন্য সেশন তৈরি করবে।
    • NEVER: কখনও সেশন তৈরি করবে না।
    • STATELESS: পুরোপুরি Stateless অ্যাপ্লিকেশন হলে সেশন তৈরি হবে না।

Session Fixation Protection কেন প্রয়োজন?

  • Security: Session fixation আক্রমণ থেকে অ্যাপ্লিকেশনকে সুরক্ষা প্রদান।
  • User Authentication: ব্যবহারকারীর লগইন প্রক্রিয়া সুরক্ষিত রাখা।
  • Prevent Session Hijacking: আক্রমণকারীদের দ্বারা সেশন চুরি করা এবং ব্যবহার করা বন্ধ করা।

উপসংহার

Spring Security তে Session Fixation Protection কনফিগার করে আপনি আপনার অ্যাপ্লিকেশনকে সেশন ফিক্সেশন আক্রমণ থেকে রক্ষা করতে পারেন। .sessionFixation().migrateSession() বা .sessionFixation().newSession() ব্যবহার করে সেশন আইডি নিরাপদভাবে পরিবর্তন করা সম্ভব। এটি আপনার অ্যাপ্লিকেশনের নিরাপত্তা উন্নত করতে সহায়ক।

আপনার প্রয়োজন অনুযায়ী আরও কাস্টমাইজেশন বা উদাহরণ চাইলে জানাতে পারেন!

Content added By

Concurrent Session Control এবং Session Timeout Management

277

Concurrent Session Control এবং Session Timeout Management দুটি গুরুত্বপূর্ণ নিরাপত্তা বৈশিষ্ট্য, যা অ্যাপ্লিকেশনগুলিকে ব্যবহারকারীর সেশন পরিচালনা এবং সেশন নিরাপত্তা নিশ্চিত করতে সাহায্য করে। Spring Security এই দুটি বৈশিষ্ট্যকে সঠিকভাবে কনফিগার করতে সাহায্য করে, যাতে ব্যবহারকারীদের একাধিক সেশন তৈরি হওয়া বা অবাঞ্ছিতভাবে সেশন চলতে থাকা থেকে রক্ষা করা যায়।


1. Concurrent Session Control

Concurrent Session Control এর মাধ্যমে একটি ব্যবহারকারী একাধিক সেশনে লগইন করতে পারে কি না, তা নিয়ন্ত্রণ করা হয়। যদি আপনি চান যে একটি ব্যবহারকারী শুধুমাত্র একটিই সেশনে লগইন করতে পারবে, তাহলে Spring Security আপনাকে সেটি কনফিগার করার সুযোগ দেয়।

Concurrent Session Control কনফিগারেশন

Spring Security-তে concurrent session control কনফিগার করতে HttpSecurity ব্যবহার করা হয়, যা একাধিক সেশন বন্ধ করতে সাহায্য করে।

Step 1: Maven ডিপেনডেন্সি

Spring Security-তে Concurrent Session Control ব্যবহার করার জন্য আপনাকে প্রথমে spring-boot-starter-security ডিপেনডেন্সি প্রয়োজন।

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Step 2: Session Control কনফিগারেশন

Spring Security-তে Concurrent Session Control সক্ষম করতে SessionManagementConfigurer ব্যবহার করা হয়।

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login", "/register").permitAll() // Login ও Register পেজের জন্য কোন সেশন কন্ট্রোল প্রয়োজন নেই
                .anyRequest().authenticated() // বাকি সব অ্যাক্সেসের জন্য অথেন্টিকেশন প্রয়োজন
            .and()
            .sessionManagement()
                .maximumSessions(1) // শুধুমাত্র একটি concurrent সেশন অনুমোদিত
                .expiredUrl("/session-expired") // সেশন এক্সপায়ার হলে কোন URL তে রিডাইরেক্ট হবে
                .and()
            .invalidSessionUrl("/invalid-session"); // অবৈধ সেশনের জন্য নির্দিষ্ট URL
    }
}
ব্যাখ্যা:
  • maximumSessions(1): এক ব্যবহারকারী শুধুমাত্র একটিই সেশনে লগইন করতে পারবে।
  • expiredUrl("/session-expired"): যখন সেশন এক্সপায়ার হয়, তখন ব্যবহারকারীকে এই URL এ রিডাইরেক্ট করা হবে।
  • invalidSessionUrl("/invalid-session"): যখন অবৈধ সেশন হয় (যেমন সেশন টাইমআউট), তখন ব্যবহারকারীকে এই URL তে পাঠানো হবে।

Step 3: Session Expiry ও Invalid Session URL কনফিগারেশন

এটি অতিরিক্ত কনফিগারেশন যা সেশন এক্সপায়ার হলে বা অবৈধ হলে ব্যবহারকারীকে কোথায় রিডাইরেক্ট করা হবে তা নির্ধারণ করতে সাহায্য করবে।

@Controller
public class SessionController {

    @GetMapping("/session-expired")
    public String sessionExpired() {
        return "Your session has expired. Please log in again.";
    }

    @GetMapping("/invalid-session")
    public String invalidSession() {
        return "Invalid session. Please log in again.";
    }
}

2. Session Timeout Management

Session Timeout হল একটি নিরাপত্তা ব্যবস্থা যা সেশন নির্দিষ্ট সময় পরে স্বয়ংক্রিয়ভাবে শেষ করে দেয়। এটি একটি নির্দিষ্ট সময় পর ব্যবহারকারী যদি কোন অ্যাকশন না করেন, তবে সেশন অটোমেটিকভাবে শেষ হয়ে যাবে।

Session Timeout Management কনফিগারেশন

Spring Security তে সেশন টাইমআউট কনফিগার করার জন্য, আপনাকে HttpSecurity এর মধ্যে sessionManagement() কনফিগার করতে হবে। এখানে sessionTimeout() ব্যবহার করে আপনি সেশনের টাইমআউট নির্ধারণ করতে পারবেন।

Step 1: Session Timeout কনফিগারেশন
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login", "/register").permitAll()
                .anyRequest().authenticated()
            .and()
            .sessionManagement()
                .invalidSessionUrl("/invalid-session") // অবৈধ সেশন হলে নির্দিষ্ট URL তে রিডাইরেক্ট করবে
                .sessionFixation().newSession() // সেশন ফিক্সেশন এটাক রোধ করবে
                .maximumSessions(1) // একাধিক সেশন অনুমোদিত নয়
                .expiredUrl("/session-expired") // সেশন এক্সপায়ার হলে রিডাইরেক্ট URL
                .and()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // সেশন তৈরির নীতি
            .and()
            .logout().permitAll();
    }
}
Step 2: Session Timeout Handler

Spring Boot এ আপনি session-timeout কনফিগারেশনও করতে পারেন application.properties ফাইলের মাধ্যমে।

server.servlet.session.timeout=15m # সেশন টাইমআউট 15 মিনিট

এই কনফিগারেশনটি 15 মিনিট পর সেশন টাইমআউট হয়ে যাবে, অর্থাৎ, ব্যবহারকারী কোন কার্যকলাপ না করলে 15 মিনিট পর তাদের সেশন স্বয়ংক্রিয়ভাবে শেষ হয়ে যাবে।


Step 3: Session Timeout URL কনফিগারেশন

@Controller
public class TimeoutController {

    @GetMapping("/session-expired")
    public String sessionExpired() {
        return "Your session has expired. Please log in again.";
    }

    @GetMapping("/invalid-session")
    public String invalidSession() {
        return "Invalid session. Please log in again.";
    }
}

Concurrent Session Control এবং Session Timeout-এর সুবিধা

  1. নিরাপত্তা বৃদ্ধি:
    • একাধিক সেশন অনুমোদন না দেয়ার মাধ্যমে Session Fixation আক্রমণ থেকে সুরক্ষা পাওয়া যায়।
    • Session Timeout ব্যবহারের মাধ্যমে সেশন চুরি এবং অবৈধ অ্যাক্সেস রোধ করা হয়।
  2. ব্যবহারকারীর নিয়ন্ত্রণ:
    • ব্যবহারকারীরা কখন সেশন শেষ হবে তা সম্পর্কে অবহিত থাকে এবং সেশন পরিচালনার ক্ষেত্রে আরও সুবিধা পায়।
  3. সেশন ক্লিনআপ:
    • সেশন টাইমআউট ব্যবহারের ফলে অপ্রয়োজনীয় সেশন ক্লিনআপ হয়, যা সিস্টেমের রিসোর্স সাশ্রয় করে।

উপসংহার

Concurrent Session Control এবং Session Timeout Management দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা আপনার অ্যাপ্লিকেশনকে নিরাপদ রাখতে সহায়ক। Spring Security এই বৈশিষ্ট্যগুলো সহজে কনফিগার করতে দেয়, যাতে আপনি একাধিক সেশন প্রবাহ নিয়ন্ত্রণ করতে পারেন এবং অবাঞ্ছিত সেশনগুলি স্বয়ংক্রিয়ভাবে বন্ধ করতে পারেন। এটি বিশেষ করে নিরাপত্তা বাড়াতে এবং সিস্টেমের সম্পদ সঠিকভাবে ব্যবহৃত হতে নিশ্চিত করতে গুরুত্বপূর্ণ।

Content added By

উদাহরণ সহ Session Management

261

Session Management হল একটি গুরুত্বপূর্ণ নিরাপত্তা বৈশিষ্ট্য যা স্প্রিং সিকিউরিটিতে ব্যবহারকারীর সেশন কন্ট্রোল এবং সুরক্ষা পরিচালনা করে। এটি সেশন টাইমআউট, সেশন ফিক্সেশন, একাধিক সেশন ব্যবস্থাপনা, এবং একাধিক লগইন কন্ট্রোল করার মতো গুরুত্বপূর্ণ কাজগুলির জন্য ব্যবহৃত হয়।

স্প্রিং সিকিউরিটি দিয়ে Session Management পরিচালনা করার মাধ্যমে আপনি নিরাপত্তা নীতি প্রয়োগ করতে পারেন, যেমন:

  • সেশনের জীবনকাল নিয়ন্ত্রণ করা
  • একাধিক সেশন সীমিত করা
  • সেশন ফিক্সেশন আক্রমণ প্রতিরোধ করা

Session Management কনফিগারেশন উদাহরণ

স্প্রিং সিকিউরিটির মাধ্যমে সেশন ম্যানেজমেন্ট কনফিগার করতে হলে HttpSecurity এর sessionManagement() মেথড ব্যবহার করতে হবে। এর মাধ্যমে আপনি বিভিন্ন সেশন পলিসি কাস্টমাইজ করতে পারেন।


1. Session Timeout কনফিগারেশন

স্প্রিং সিকিউরিটি দিয়ে সেশন টাইমআউট সেট করা যেতে পারে, যাতে নির্দিষ্ট সময় পর সেশন এক্সপায়ার হয়ে যায়।

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
            .and()
            .sessionManagement()
                .invalidSessionUrl("/session-invalid")  // If session expires, redirect to this URL
                .maximumSessions(1)                     // Maximum one session per user
                .expiredUrl("/session-expired")         // If session expires, redirect to this URL
                .and()
            .and()
            .formLogin()
            .and()
            .logout()
                .permitAll();
    }
}

এখানে:

  • invalidSessionUrl("/session-invalid"): যদি সেশন এক্সপায়ার হয়, ব্যবহারকারীকে একটি নির্দিষ্ট URL-এ রিডাইরেক্ট করা হবে।
  • maximumSessions(1): প্রতিটি ব্যবহারকারীর জন্য সর্বোচ্চ একটি সেশন অনুমোদিত। এটি ব্যবহারকারীর একাধিক লগইন প্রতিরোধ করবে।
  • expiredUrl("/session-expired"): সেশন এক্সপায়ার হলে, ব্যবহারকারীকে এই URL-এ রিডাইরেক্ট করা হবে।

2. Session Fixation Protection

স্প্রিং সিকিউরিটি Session Fixation আক্রমণ প্রতিরোধ করতে sessionFixation() পদ্ধতি ব্যবহার করে। এই পদ্ধতির মাধ্যমে সেশন আইডি ফিক্সড থাকা থেকে রক্ষা করা হয়।

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .anyRequest().authenticated()
        .and()
        .sessionManagement()
            .sessionFixation().migrateSession()   // Migrate to a new session ID after login
        .and()
        .formLogin()
        .and()
        .logout()
            .permitAll();
}

এখানে migrateSession() ব্যবহার করা হয়েছে, যার মাধ্যমে ব্যবহারকারী লগইন করার পরে নতুন সেশন আইডি জেনারেট করা হয় এবং পুরনো সেশন আইডি বাতিল করা হয়। এতে সেশন ফিক্সেশন আক্রমণ থেকে রক্ষা পাওয়া যায়।


3. Multiple Sessions Per User

স্প্রিং সিকিউরিটি দিয়ে আপনি একটি ব্যবহারকারীর একাধিক সেশন সীমিত করতে পারেন। যদি আপনি চান যে একটি ব্যবহারকারী একাধিক ডিভাইসে বা ব্রাউজারে লগইন করতে না পারে, তাহলে আপনি maximumSessions() পদ্ধতি ব্যবহার করতে পারেন।

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .anyRequest().authenticated()
        .and()
        .sessionManagement()
            .maximumSessions(1)                     // Allow only one session per user
            .expiredUrl("/session-expired")         // Redirect when session expires
            .and()
        .and()
        .formLogin()
        .and()
        .logout()
            .permitAll();
}

এখানে maximumSessions(1) ব্যবহারকারীকে সর্বোচ্চ একটি সেশন আইডি অনুমোদিত করে।


4. Custom Session Management Handler

স্প্রিং সিকিউরিটির মাধ্যমে আপনি কাস্টম সেশন হ্যান্ডলিংও করতে পারেন, যেমন সেশন পরিবর্তন বা সেশন এক্সপায়ার হওয়ার পর কাস্টম রিডাইরেক্ট।

Custom Session Expired Handler:

@Component
public class CustomSessionExpiredStrategy extends SimpleRedirectInvalidSessionStrategy {

    public CustomSessionExpiredStrategy() {
        super("/session-expired");  // Redirect to this page when session expires
    }

    @Override
    protected String getTargetUrl(HttpServletRequest request) {
        return "/session-expired";
    }
}

কনফিগারেশন:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/session-expired").permitAll()
            .anyRequest().authenticated()
        .and()
        .sessionManagement()
            .invalidSessionStrategy(customSessionExpiredStrategy)  // Use custom session expired handler
        .and()
        .formLogin()
        .and()
        .logout()
            .permitAll();
}

5. Single Session Per User

যদি আপনি চান যে একটি ব্যবহারকারী একই সময়ে একাধিক ডিভাইসে লগইন করতে না পারে, তাহলে এই পদ্ধতি ব্যবহার করতে পারেন:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .anyRequest().authenticated()
        .and()
        .sessionManagement()
            .maximumSessions(1)  // Allow only one session per user
            .expiredUrl("/session-expired")  // Redirect if session expires
        .and()
        .and()
        .formLogin()
        .and()
        .logout()
            .permitAll();
}

6. Session Creation Policy

স্প্রিং সিকিউরিটিতে সেশন কিভাবে তৈরি হবে তা নিয়ন্ত্রণ করা যায় sessionCreationPolicy() এর মাধ্যমে। এটি বিশেষত RESTful APIs-এর জন্য উপকারী।

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .anyRequest().authenticated()
        .and()
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)  // No session is created for stateless applications
        .and()
        .formLogin()
        .and()
        .logout()
            .permitAll();
}

এখানে SessionCreationPolicy.STATELESS ব্যবহার করে সেশন ক্রিয়েশন নিষ্ক্রিয় করা হয়েছে।


উপসংহার

স্প্রিং সিকিউরিটিতে সেশন ম্যানেজমেন্ট ব্যবহারকারীর সেশন কন্ট্রোল ও নিরাপত্তা নিশ্চিত করতে সাহায্য করে। সেশন টাইমআউট, সেশন ফিক্সেশন প্রটেকশন, একাধিক সেশন সীমাবদ্ধকরণ এবং কাস্টম সেশন ম্যানেজমেন্ট হ্যান্ডলার ব্যবহার করে আপনার অ্যাপ্লিকেশনটির নিরাপত্তা আরও শক্তিশালী করা সম্ভব।

Content added By
Promotion

Are you sure to start over?

Loading...