CORS (Cross-Origin Resource Sharing) হল একটি নিরাপত্তা বৈশিষ্ট্য যা ব্রাউজারকে এক ডোমেইনের রিসোর্স অন্য ডোমেইন থেকে অ্যাক্সেস করতে অনুমতি দেয়। সাধারণত, ব্রাউজার এক ডোমেইন থেকে অন্য ডোমেইনে HTTP অনুরোধ করতে নিষিদ্ধ থাকে। CORS এই সীমাবদ্ধতা সামাল দেয় এবং ক্লায়েন্ট-সাইড অ্যাপ্লিকেশনগুলি যেমন React বা Angular, API গুলি অ্যাক্সেস করতে সক্ষম হয় যেগুলি ভিন্ন ডোমেইনে বসে।
Spring Security তে CORS কনফিগারেশন করা হয় সঠিকভাবে ক্লায়েন্ট অ্যাপ্লিকেশনকে অনুমোদন করার জন্য।
CORS সমস্যা কীভাবে সৃষ্টি হয়?
যখন একটি ওয়েব পেজ বা অ্যাপ্লিকেশন, যেটি এক ডোমেইনে থাকে (যেমন http://localhost:3000), অন্য ডোমেইন (যেমন http://localhost:8080) থেকে API কল করতে চায়, তখন CORS পলিসি বাধা দেয়। এর ফলে, API সার্ভার যদি CORS কনফিগার না থাকে, তাহলে ক্রস-অরিজিন অনুরোধটি ব্লক হয়ে যাবে।
Spring Security তে CORS কনফিগারেশন
Spring Security তে CORS কনফিগারেশনের জন্য আপনি নিচের পদক্ষেপগুলি অনুসরণ করতে পারেন:
ধাপ ১: application.properties বা application.yml এ CORS কনফিগার করুন (বেসিক কনফিগারেশন)
Spring Boot প্রজেক্টে CORS কনফিগার করতে application.properties বা application.yml ফাইল ব্যবহার করতে পারেন। উদাহরণস্বরূপ:
# application.properties
# Allow CORS from specific origins
spring.webflux.cors.allowed-origins=http://localhost:3000
এটি শুধুমাত্র Spring WebFlux অ্যাপ্লিকেশনগুলির জন্য প্রযোজ্য। তবে, যদি আপনি Spring MVC ব্যবহার করেন, তাহলে আপনাকে কনফিগারেশন ক্লাস তৈরি করতে হবে।
ধাপ ২: Spring Security কনফিগারেশনে CORS ইন্টিগ্রেশন
Spring Security তে CORS কনফিগার করতে, HttpSecurity কনফিগারেশন ক্লাসে .cors() মেথড ব্যবহার করা হয়। এটি CORS কনফিগারেশনের জন্য একটি কাস্টম CorsConfigurationSource প্রদান করে।
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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.cors() // Enable CORS support
.and()
.authorizeRequests()
.antMatchers("/api/public/**").permitAll() // Open API
.anyRequest().authenticated() // Other API require authentication
.and()
.formLogin()
.permitAll();
return http.build();
}
// CORS Configuration
@Bean
public UrlBasedCorsConfigurationSource corsConfigurationSource() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
// Allow specific origins (you can modify this to match your frontend URL)
config.addAllowedOrigin("http://localhost:3000");
config.addAllowedHeader("*");
config.addAllowedMethod("GET");
config.addAllowedMethod("POST");
config.addAllowedMethod("PUT");
config.addAllowedMethod("DELETE");
config.setAllowCredentials(true);
source.registerCorsConfiguration("/**", config);
return source;
}
}
@EnableWebSecurity: Spring Security এর কনফিগারেশন সক্রিয় করতে।cors(): CORS কনফিগারেশন সক্রিয় করে।CorsConfigurationSource: CORS এর জন্য কনফিগারেশন প্রদান করে।
এখানে http://localhost:3000 কে অনুমতি দেওয়া হয়েছে, অর্থাৎ আপনার ফ্রন্ট-এন্ড অ্যাপ্লিকেশন যদি এই ডোমেইনে থাকে, তাহলে সেটি API অ্যাক্সেস করতে পারবে।
ধাপ ৩: CORS কনফিগারেশন কাস্টমাইজ করুন
আপনি CORS কনফিগারেশন আরও কাস্টমাইজ করতে পারেন যেমন নির্দিষ্ট HTTP মেথড (GET, POST ইত্যাদি) অথবা নির্দিষ্ট হেডার অনুমতি দেওয়া, অথবা Credentials (যেমন Cookies) ব্যবহারের অনুমতি।
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
@Bean
public UrlBasedCorsConfigurationSource corsConfigurationSource() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
// Allow specific origins
config.addAllowedOrigin("http://localhost:3000");
// Allow specific headers
config.addAllowedHeader("Authorization");
config.addAllowedHeader("Content-Type");
// Allow specific methods
config.addAllowedMethod("GET");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
// Allow credentials
config.setAllowCredentials(true);
source.registerCorsConfiguration("/**", config);
return source;
}
ধাপ ৪: Controller Level CORS কনফিগারেশন
Spring Security কনফিগারেশনে গ্লোবাল CORS কনফিগারেশন করা সম্ভব হলেও, আপনি যদি Controller লেভেলে CORS কনফিগার করতে চান, তাহলে আপনি @CrossOrigin অ্যানোটেশন ব্যবহার করতে পারেন।
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
// Allow CORS for this specific endpoint
@CrossOrigin(origins = "http://localhost:3000")
@GetMapping("/api/data")
public String getData() {
return "Hello, World!";
}
}
এটি সেই নির্দিষ্ট API /api/data এ শুধুমাত্র http://localhost:3000 থেকে CORS অনুমতি দেয়।
ধাপ ৫: CORS এবং CSRF এর সম্পর্ক
CORS এবং CSRF (Cross-Site Request Forgery) দুটি আলাদা নিরাপত্তা বিষয় হলেও, এগুলি একসাথে কাজ করতে পারে। যখন আপনি CORS সক্রিয় করেন, তবে নিশ্চিত করুন যে আপনি CSRF পলিসি ঠিকভাবে কনফিগার করেছেন। বিশেষত, Spring Security-তে CSRF ডিফল্টভাবে সক্ষম থাকে, কিন্তু যখন আপনি CORS চালু করেন তখন আপনাকে CSRF নিষ্ক্রিয় করতে হতে পারে (বিশেষত যখন আপনি স্টেটলেস অ্যাপ্লিকেশন ব্যবহার করছেন)।
http
.cors() // Enable CORS support
.and()
.csrf().disable() // Disable CSRF for stateless apps
.authorizeRequests()
.anyRequest().authenticated();
উপসংহার
- CORS কনফিগার করা প্রয়োজন যখন আপনার Spring Boot অ্যাপ্লিকেশনকে ক্রস-অরিজিন ক্লায়েন্ট (যেমন Angular বা React) থেকে অ্যাক্সেস করা হবে।
- Spring Security-তে CORS কনফিগার করার জন্য
@EnableWebSecurityএবংHttpSecurityকনফিগারেশন ব্যবহার করা হয়। - আপনি চাইলে CORS কনফিগারেশন কাস্টমাইজ করে, নির্দিষ্ট অরিজিন, হেডার, মেথড এবং ক্রেডেনশিয়ালস অনুমোদন করতে পারেন।
- CORS কনফিগারেশন সহ CSRF সতর্কতার সাথে পরিচালনা করা উচিত।
এইভাবে আপনি আপনার Spring Security অ্যাপ্লিকেশনে CORS কনফিগার করতে পারেন।
CORS (Cross-Origin Resource Sharing) হলো একটি নিরাপত্তা বৈশিষ্ট্য যা ব্রাউজারকে অনুমতি দেয় বা নিষিদ্ধ করে যে একটি ওয়েব পেজ অন্য একটি ডোমেইন থেকে রিসোর্স (যেমন API) অ্যাক্সেস করতে পারে। এটি মূলত এক ডোমেইন থেকে অন্য ডোমেইনে HTTP অনুরোধ পাঠানোর নিরাপত্তা নিয়ন্ত্রণ করে।
CORS কি?
CORS একটি ওয়েব নিরাপত্তা পদ্ধতি যা ওয়েব পেজগুলিকে অন্য ডোমেইন থেকে রিসোর্স অ্যাক্সেস করতে অনুমতি দেয়। এটি HTTP হেডারগুলির মাধ্যমে কাজ করে এবং ব্রাউজারকে জানায় কোন ডোমেইন (অথবা ওয়েব অ্যাপ্লিকেশন) অন্য ডোমেইন থেকে রিসোর্স (যেমন, API) অ্যাক্সেস করতে পারবে এবং কোন পদ্ধতি (GET, POST, PUT, DELETE ইত্যাদি) ব্যবহার করতে পারবে।
যখন ব্রাউজারের একটি ওয়েব পেজ একটি ডোমেইন থেকে আরেকটি ডোমেইনে অনুরোধ পাঠায়, তখন এটি CORS নীতি অনুসরণ করে। যদি CORS অনুমতি না দেয়, তবে ব্রাউজার একটি CORS error দেখাবে, যা প্রায়ই "No 'Access-Control-Allow-Origin' header is present on the requested resource" এর মতো একটি ত্রুটি হতে পারে।
CORS এর কাজের মূলনীতি:
- Same-Origin Policy (SOP):
ব্রাউজারের Same-Origin Policy অনুযায়ী, একটি ওয়েব পেজ সাধারণত শুধুমাত্র একই ডোমেইন, প্রোটোকল, এবং পোর্ট থেকে রিসোর্স অ্যাক্সেস করতে পারে। তবে CORS এই সীমাবদ্ধতা লঙ্ঘন করতে সাহায্য করে, অর্থাৎ, একটি ওয়েব পেজ অন্য ডোমেইন থেকে রিসোর্স অ্যাক্সেস করতে পারবে যদি CORS সঠিকভাবে কনফিগার করা থাকে। - Preflight Request:
যদি একটি ক্লায়েন্ট (যেমন, ব্রাউজার) কোনো পদ্ধতি ব্যবহার করতে চায় যা নিরাপত্তার জন্য ঝুঁকি তৈরি করতে পারে (যেমন, PUT বা DELETE), তাহলে ব্রাউজার প্রথমে একটি preflight request পাঠায়। এটি সার্ভারকে জানায় যে আসল অনুরোধের আগে কিছু নির্দিষ্ট পদ্ধতি অনুমোদিত কিনা। সার্ভার যদি অনুমতি দেয়, তবে আসল অনুরোধ পাঠানো হয়। - HTTP Headers:
CORS কনফিগারেশন মূলত কয়েকটি HTTP হেডারের মাধ্যমে কাজ করে:Access-Control-Allow-Origin: কোন ডোমেইনকে রিসোর্স অ্যাক্সেস করতে অনুমতি দেয়া হচ্ছে।Access-Control-Allow-Methods: কোন HTTP মেথড (GET, POST, PUT, DELETE) অনুমোদিত।Access-Control-Allow-Headers: কোন হেডার অনুমোদিত।Access-Control-Allow-Credentials: এটি ব্রাউজারকে বলে যে ক্রেডেনশিয়াল (যেমন কুকি) পাঠানোর অনুমতি দেওয়া হবে কিনা।Access-Control-Max-Age: এটি preflight request-এর জন্য সঞ্চিত সময় নির্ধারণ করে, যাতে পরবর্তী অনুরোধগুলির জন্য preflight চেক করার প্রয়োজন না হয়।
CORS কেন গুরুত্বপূর্ণ?
CORS গুরুত্বপূর্ণ কারণ এটি ওয়েব অ্যাপ্লিকেশনগুলির মধ্যে নিরাপত্তা নিশ্চিত করতে সাহায্য করে, বিশেষত যখন আপনি একাধিক ডোমেইন (বা API) থেকে রিসোর্স অ্যাক্সেস করার চেষ্টা করেন। CORS মূলত পরবর্তী কারণে গুরুত্বপূর্ণ:
- নিরাপত্তা:
CORS ওয়েব পেজগুলিকে একই উৎস নীতি (Same-Origin Policy) অনুসরণ করতে সাহায্য করে। এটি নিশ্চিত করে যে একটি ওয়েব অ্যাপ্লিকেশন অপরিচিত বা ক্ষতিকর উৎস থেকে রিসোর্স অ্যাক্সেস করতে পারবে না। যদি CORS সঠিকভাবে কনফিগার না করা হয়, তবে এটি Cross-Site Request Forgery (CSRF) আক্রমণ বা Cross-Site Scripting (XSS) আক্রমণের জন্য ঝুঁকি তৈরি করতে পারে। - API অ্যাক্সেস:
অনেক আধুনিক ওয়েব অ্যাপ্লিকেশন একটি বা একাধিক API সেবা ব্যবহার করে। CORS এটি নিশ্চিত করে যে শুধুমাত্র অনুমোদিত ডোমেইন বা ক্লায়েন্ট অ্যাপ্লিকেশনগুলি সেই API-কে অ্যাক্সেস করতে পারে। - ব্রাউজারের নিরাপত্তা:
ব্রাউজার নিজেই CORS নীতি কার্যকর করে, এটি সঠিকভাবে কনফিগার করা না হলে, ক্ষতিকর স্ক্রিপ্টগুলিকে অন্য ডোমেইনের API বা রিসোর্স অ্যাক্সেস করতে বাধা দেয়। - বহু ডোমেইন ব্যবস্থাপনা:
যদি আপনার অ্যাপ্লিকেশনটি Microservices architecture ব্যবহার করে থাকে এবং আপনার API গুলি বিভিন্ন ডোমেইন থেকে আসে, তাহলে CORS সঠিকভাবে কনফিগার করা প্রয়োজন। এটা বিভিন্ন সার্ভিস বা ডোমেইনের মধ্যে নিরাপদ যোগাযোগ নিশ্চিত করতে সাহায্য করে।
স্প্রিং সিকিউরিটিতে CORS কনফিগারেশন
স্প্রিং সিকিউরিটিতে CORS কনফিগারেশন করার জন্য, আপনি @EnableWebSecurity এবং WebSecurityConfigurerAdapter ব্যবহার করতে পারেন। এখানে একটি সাধারণ উদাহরণ দেওয়া হলো:
CORS কনফিগারেশন উদাহরণ
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // Allow all endpoints
.allowedOrigins("http://localhost:3000") // Allowed origin (e.g., React app)
.allowedMethods("GET", "POST", "PUT", "DELETE") // Allowed methods
.allowedHeaders("*") // Allow all headers
.allowCredentials(true) // Allow credentials like cookies
.maxAge(3600); // Cache preflight response for 1 hour
}
}
স্প্রিং সিকিউরিটি CORS কনফিগারেশন
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.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.cors()
.and()
.authorizeRequests()
.antMatchers("/**").permitAll() // Allow public access to all endpoints
.anyRequest().authenticated();
}
@Bean
public CorsConfig corsConfig() {
return new CorsConfig();
}
}
এখানে cors() মেথডটি স্প্রিং সিকিউরিটিতে CORS কনফিগারেশন সক্রিয় করতে ব্যবহৃত হয়।
উপসংহার
CORS (Cross-Origin Resource Sharing) একটি গুরুত্বপূর্ণ নিরাপত্তা বৈশিষ্ট্য যা ওয়েব অ্যাপ্লিকেশনগুলিকে একাধিক ডোমেইন বা API থেকে রিসোর্স অ্যাক্সেসের অনুমতি দেয় বা নিষেধ করে। এটি ব্রাউজারের মাধ্যমে কার্যকরী হয় এবং Cross-Site Request Forgery (CSRF) এবং Cross-Site Scripting (XSS) আক্রমণ থেকে সুরক্ষা প্রদান করে। স্প্রিং সিকিউরিটি এবং স্প্রিং MVC এর সাহায্যে সহজেই CORS কনফিগারেশন করা যায়, যা নিরাপদ এবং কার্যকর অ্যাপ্লিকেশন ডিজাইন করার জন্য অপরিহার্য।
CORS (Cross-Origin Resource Sharing) হল একটি নিরাপত্তা বৈশিষ্ট্য যা ওয়েব ব্রাউজারকে একটি ডোমেন থেকে অন্য ডোমেনে রিসোর্স (যেমন, API কল) অ্যাক্সেস করতে বাধা দেয়, তবে কিছু নির্দিষ্ট কনফিগারেশন বা অনুমতি দেয়ার মাধ্যমে এটি কার্যকর করা যায়। Spring Security তে CORS কনফিগারেশন করার মাধ্যমে আপনি কীভাবে এক ডোমেনের ক্লায়েন্ট অন্য ডোমেনে অবস্থান করা API-এর সাথে নিরাপদে যোগাযোগ করতে পারে তা নিয়ন্ত্রণ করতে পারেন।
Step 1: Spring Security-এ CORS কনফিগারেশন
Spring Security তে CORS কনফিগার করার জন্য আপনি WebSecurityConfigurerAdapter বা SecurityFilterChain ব্যবহার করতে পারেন।
Option 1: CORS কনফিগারেশন SecurityConfig ক্লাসের মধ্যে
Spring Security তে CORS কনফিগারেশন করতে HttpSecurity এবং CorsConfigurationSource ব্যবহার করা হয়।
package com.example.config;
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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and() // Enable CORS for the application
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Define public paths
.anyRequest().authenticated() // Define paths that need authentication
.and()
.formLogin().permitAll() // Enable form login
.and()
.logout().permitAll(); // Enable logout
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.setAllowCredentials(true); // Allow credentials (cookies, headers, etc.)
corsConfig.addAllowedOrigin("*"); // Allow all origins, you can restrict to specific origins
corsConfig.addAllowedHeader("*"); // Allow all headers, you can restrict to specific headers
corsConfig.addAllowedMethod("*"); // Allow all methods (GET, POST, etc.)
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig); // Apply CORS configuration to all endpoints
return source;
}
}
Explanation:
- cors(): এটি Spring Security-এর মধ্যে CORS সক্রিয় করার জন্য ব্যবহৃত হয়।
- CorsConfigurationSource: এটি CORS কনফিগারেশন ফাইল তৈরি করতে সাহায্য করে যেখানে আপনি অনুমোদিত উত্স (origins), পদ্ধতি (methods), এবং শিরোনাম (headers) কনফিগার করতে পারেন।
- setAllowCredentials(true): এটি ব্রাউজারে credentials (cookies) পাঠানোর অনুমতি দেয়।
Option 2: CORS কনফিগারেশন WebSecurityConfigurerAdapter ছাড়া
যদি আপনি Spring Boot 2.4 বা তার পরবর্তী সংস্করণ ব্যবহার করেন, তবে SecurityFilterChain পদ্ধতিতে CORS কনফিগারেশন করতে পারেন:
package com.example.config;
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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.cors().and() // Enable CORS
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Public API endpoints
.anyRequest().authenticated(); // Secure API endpoints
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.setAllowCredentials(true); // Allow credentials
corsConfig.addAllowedOrigin("https://example.com"); // Allow specific origins
corsConfig.addAllowedHeader("*"); // Allow all headers
corsConfig.addAllowedMethod("*"); // Allow all HTTP methods
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig); // Apply configuration to all endpoints
return source;
}
}
Step 2: CORS Configuration Breakdown
setAllowCredentials(true):- এটি ব্রাউজারে cookies, authorization headers, বা TLS client certificates পাঠানোর অনুমতি দেয়। যদি এটি
falseথাকে, তবে credentials পাঠানো সম্ভব হবে না।
- এটি ব্রাউজারে cookies, authorization headers, বা TLS client certificates পাঠানোর অনুমতি দেয়। যদি এটি
addAllowedOrigin("*"):- এটি সমস্ত উত্স (origins) থেকে রিকুয়েস্ট গ্রহণ করতে দেয়। আপনি যদি শুধুমাত্র কিছু নির্দিষ্ট উত্স অনুমোদিত করতে চান, তবে এটি পরিবর্তন করতে পারেন, যেমন:
corsConfig.addAllowedOrigin("https://example.com")।
- এটি সমস্ত উত্স (origins) থেকে রিকুয়েস্ট গ্রহণ করতে দেয়। আপনি যদি শুধুমাত্র কিছু নির্দিষ্ট উত্স অনুমোদিত করতে চান, তবে এটি পরিবর্তন করতে পারেন, যেমন:
addAllowedMethod("*"):- এটি সমস্ত HTTP পদ্ধতি (GET, POST, PUT, DELETE, ইত্যাদি) অনুমোদিত করে। আপনি যদি কিছু নির্দিষ্ট HTTP পদ্ধতি সীমাবদ্ধ করতে চান, তবে আপনি এখানে পরিবর্তন করতে পারেন, যেমন:
corsConfig.addAllowedMethod("GET")।
- এটি সমস্ত HTTP পদ্ধতি (GET, POST, PUT, DELETE, ইত্যাদি) অনুমোদিত করে। আপনি যদি কিছু নির্দিষ্ট HTTP পদ্ধতি সীমাবদ্ধ করতে চান, তবে আপনি এখানে পরিবর্তন করতে পারেন, যেমন:
addAllowedHeader("*"):- এটি সমস্ত হেডারকে অনুমোদিত করে। আপনি যদি নির্দিষ্ট হেডার ব্যবহার করতে চান, তবে সেগুলি এখানে উল্লেখ করতে হবে।
Step 3: Controller এর মধ্যে CORS কনফিগারেশন
Spring MVC Controller-এ নির্দিষ্টভাবে CORS কনফিগারেশন করতে, আপনি @CrossOrigin অ্যানোটেশন ব্যবহার করতে পারেন।
package com.example.controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@CrossOrigin(origins = "https://example.com") // Allow CORS for a specific origin
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
এখানে, @CrossOrigin অ্যানোটেশনটি GET /hello এন্ডপয়েন্টে CORS অনুমতি দেয় এবং এটি শুধুমাত্র https://example.com থেকে রিকুয়েস্ট গ্রহণ করবে।
Step 4: Testing CORS
CORS কনফিগারেশন সফলভাবে কাজ করছে কিনা তা নিশ্চিত করার জন্য আপনি ফ্রন্টএন্ড থেকে API কল করতে পারেন এবং ব্রাউজারের ডেভেলপার কনসোল চেক করতে পারেন।
Example of a CORS Error (If Not Configured Properly):
Access to XMLHttpRequest at 'http://localhost:8080/api/data' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Successful CORS Configuration Response:
- HTTP Response Header:
Access-Control-Allow-Origin: *
উপসংহার
Spring Security তে CORS কনফিগারেশন করার মাধ্যমে আপনি বিভিন্ন উৎস (origins) থেকে আপনার অ্যাপ্লিকেশনের রিসোর্স অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। এটি নিরাপত্তা বৃদ্ধি করে এবং শুধুমাত্র নির্দিষ্ট উৎস থেকে অনুরোধ অনুমোদিত করতে সহায়ক। CORS কনফিগারেশন Spring Security-এর HTTP সিকিউরিটি কনফিগারেশন বা @CrossOrigin অ্যানোটেশন দ্বারা সহজেই সম্পাদন করা যায়।
CORS (Cross-Origin Resource Sharing) হল একটি নিরাপত্তা বৈশিষ্ট্য যা এক ওয়েব পৃষ্ঠাকে অন্য ডোমেইন থেকে রিসোর্স অ্যাক্সেস করার অনুমতি দেয়। সাধারণত, ব্রাউজার বিভিন্ন ডোমেইন থেকে প্রাপ্ত রিকোয়েস্টকে সীমাবদ্ধ রাখে। CORS নীতির মাধ্যমে আপনি API বা ওয়েব অ্যাপ্লিকেশনের রিসোর্স গুলোকে নির্দিষ্ট ডোমেইন বা উৎস থেকে অ্যাক্সেস করার অনুমতি দিতে পারেন।
Spring Security-তে CORS কনফিগারেশন করতে দুটি সাধারণ পদ্ধতি রয়েছে:
- Global CORS Configuration (Spring Security Configuration থেকে)
- Custom CORS Filter (একটি কাস্টম ফিল্টার তৈরি করে)
CORS Configuration Spring Security-তে:
Step 1: Global CORS Configuration:
Spring 5 এবং Spring Boot 2.4 এর পর থেকে CORS কনফিগারেশন করার জন্য Spring Security-তে CorsConfigurationSource এবং CorsFilter ব্যবহার করা হয়।
1. Spring Security Configuration Class তৈরি:
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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.cors.CorsFilter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and() // Enable CORS
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Open endpoints
.anyRequest().authenticated(); // All other requests need authentication
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); // Allow cookies to be sent
config.addAllowedOrigin("http://localhost:3000"); // Allow specific origin (for example, frontend app)
config.addAllowedHeader("*"); // Allow all headers
config.addAllowedMethod("GET"); // Allow GET method
config.addAllowedMethod("POST"); // Allow POST method
source.registerCorsConfiguration("/**", config); // Apply to all endpoints
return new CorsFilter(source);
}
}
ব্যাখ্যা:
config.setAllowCredentials(true): ক্লায়েন্ট সাইড থেকে কুকি বা ক্রেডেনশিয়ালস পাঠানোর অনুমতি দেয়।config.addAllowedOrigin("http://localhost:3000"): শুধুমাত্রhttp://localhost:3000থেকে রিকোয়েস্ট অনুমোদিত। আপনি এখানে আপনার প্রয়োজন অনুসারে ডোমেইন বা ওয়েব অ্যাপ্লিকেশনের ইউআরএল দিতে পারেন।config.addAllowedMethod("GET"): GET এবং POST এর মতো HTTP মেথড অনুমোদিত। অন্য মেথডগুলোর জন্যও অনুমতি দিতে পারেন।
Step 2: Spring Boot Application Class
Spring Boot Application ক্লাসে @SpringBootApplication অ্যানোটেশন যোগ করুন এবং সিস্টেম চালু করুন।
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
এখন, আপনার অ্যাপ্লিকেশনটি http://localhost:8080 চালু হয়ে যাবে, এবং CORS কনফিগারেশনটি http://localhost:3000 থেকে আগত রিকোয়েস্ট অনুমোদন করবে।
Custom CORS Filter তৈরি:
CORS Filter তৈরি করার মাধ্যমে আপনি সম্পূর্ণ কাস্টমাইজড CORS পলিসি সেট করতে পারবেন। এটি বিশেষত প্রয়োজনে দরকার হয়, যেখানে আপনি API রিকোয়েস্টের ভিত্তিতে CORS কনফিগারেশন পরিবর্তন করতে চান।
Step 1: Custom CORS Filter Class
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class CustomCorsFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, javax.servlet.http.HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
response.addHeader("Access-Control-Allow-Origin", "*"); // Allow all origins, change to specific domain if needed
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_OK);
} else {
filterChain.doFilter(request, response);
}
}
}
ব্যাখ্যা:
response.addHeader("Access-Control-Allow-Origin", "*"): সমস্ত উৎস থেকে আসা রিকোয়েস্ট অনুমোদিত।Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS সহ সমস্ত HTTP মেথড অনুমোদিত।OPTIONSরিকোয়েস্ট হলে শুধুমাত্রSC_OK(200) স্ট্যাটাস কোড পাঠানো হয়। এটা CORS প্রিপ-flight রিকোয়েস্টের জন্য প্রয়োজন।
Step 2: Custom Filter Register করা
Spring Boot অ্যাপ্লিকেশন ক্লাসে এই ফিল্টারটি রেজিস্টার করুন।
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean<CustomCorsFilter> corsFilter() {
FilterRegistrationBean<CustomCorsFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new CustomCorsFilter());
bean.addUrlPatterns("/api/*"); // Apply filter to your API URLs
return bean;
}
}
ব্যাখ্যা:
addUrlPatterns("/api/*"): এই কাস্টম CORS ফিল্টারটি/api/*URL প্যাটার্নের সমস্ত রিকোয়েস্টে কাজ করবে।FilterRegistrationBeanSpring Boot ফিল্টার রেজিস্টার করার জন্য ব্যবহার করা হয়।
Step 3: Application Configuration
Spring Boot Application ক্লাসে @SpringBootApplication অ্যানোটেশন যোগ করুন এবং সিস্টেম চালু করুন।
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
এখন আপনার কাস্টম CORS ফিল্টারটি আপনার API রিকোয়েস্টে কাজ করবে।
উপসংহার:
- Global CORS Configuration: যদি আপনার অ্যাপ্লিকেশনটি একটি সুনির্দিষ্ট রিসোর্স সেটের জন্য CORS কনফিগার করতে চান তবে Spring Security-তে CORS কনফিগারেশন করা একটি সহজ এবং উপযুক্ত পদ্ধতি।
- Custom CORS Filter: যদি আপনি আরও কাস্টমাইজড সিকিউরিটি এবং বিশেষ ধরনের CORS নীতি প্রয়োগ করতে চান, তবে একটি কাস্টম CORS ফিল্টার তৈরি করা প্রয়োজন।
CORS কনফিগারেশন সঠিকভাবে ব্যবহৃত হলে, এটি Cross-Origin রিকোয়েস্টগুলোকে সুরক্ষিতভাবে পরিচালনা করতে সাহায্য করে এবং আপনার API বা ওয়েব অ্যাপ্লিকেশনকে নিরাপদ রাখে।
CORS (Cross-Origin Resource Sharing) হল একটি নিরাপত্তা বৈশিষ্ট্য যা ব্রাউজারকে এক ডোমেইনের ওয়েব পেজ থেকে অন্য ডোমেইনের রিসোর্স অ্যাক্সেস করার অনুমতি দেয়। এটি নিরাপত্তার জন্য ব্যবহৃত হয় এবং একাধিক ডোমেইন থেকে রিসোর্স অ্যাক্সেস সীমিত করার জন্য ব্রাউজার কর্তৃক প্রয়োগ করা হয়।
যেমন, যদি আপনার Frontend অ্যাপ্লিকেশন একটি ডোমেইনে থাকে এবং Backend অন্য ডোমেইনে চলে, তাহলে CORS প্রসেসের মাধ্যমে আপনার Backend API-র রিসোর্স Frontend-কে অ্যাক্সেস করতে অনুমতি দেয়।
Spring Security তে CORS Management
Spring Security তে CORS কনফিগার করার জন্য আপনাকে HttpSecurity কনফিগারেশনের মধ্যে cors() ফাংশন ব্যবহার করতে হয়। Spring Boot-এ CORS কনফিগারেশন বেশ সহজ এবং এটি অনেক ধরণের কনফিগারেশন প্রদান করে।
CORS কনফিগারেশন পদ্ধতি
Spring Security তে CORS কনফিগার করার জন্য কিছু সাধারণ উপায় রয়েছে:
- Global CORS Configuration (অ্যাপ্লিকেশন সবার জন্য CORS কনফিগারেশন)
- Controller-Level CORS Configuration (নির্দিষ্ট কন্ট্রোলারের জন্য CORS কনফিগারেশন)
1. Global CORS Configuration
Global CORS Configuration ব্যবহার করে পুরো অ্যাপ্লিকেশনের জন্য CORS পলিসি সেট করা হয়।
Global CORS Configuration উদাহরণ:
WebConfig.java বা SecurityConfig.java ক্লাসে CORS কনফিগারেশন করা যেতে পারে:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // Allow CORS on all endpoints
.allowedOrigins("http://localhost:3000", "http://example.com") // Allow specific origins
.allowedMethods("GET", "POST", "PUT", "DELETE") // Allowed HTTP methods
.allowedHeaders("Authorization", "Content-Type") // Allowed headers
.allowCredentials(true); // Allow cookies
}
}
Explanation:
addMapping("/**"): সমস্ত এন্ডপয়েন্টে CORS অনুমতি দেওয়া হচ্ছে।allowedOrigins("http://localhost:3000"): যেই Origins থেকে রিকোয়েস্ট আসবে সেগুলোকে অনুমতি দেওয়া হয়েছে। এটি সাধারণত Frontend অ্যাপ্লিকেশনের URL হয়।allowedMethods(...): যেই HTTP মেথডগুলো অনুমোদিত হবে।allowedHeaders(...): রিকোয়েস্ট হেডারগুলোর অনুমতি দেওয়ার জন্য।allowCredentials(true): ব্রাউজারের সাথে ক্রেডেনশিয়ালস (যেমন কুকিজ) পাঠানোর অনুমতি দেওয়া হয়।
2. Controller-Level CORS Configuration
এটি নির্দিষ্ট কন্ট্রোলার বা মেথডের জন্য CORS কনফিগারেশন দেয়। যদি আপনি কেবল নির্দিষ্ট কন্ট্রোলারের জন্য CORS কনফিগারেশন করতে চান তবে আপনি @CrossOrigin অ্যানোটেশন ব্যবহার করতে পারেন।
Controller-Level CORS Configuration উদাহরণ:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin(origins = "http://localhost:3000") // Specific CORS Configuration
public class MyController {
@GetMapping("/api/data")
public String getData() {
return "CORS enabled for this endpoint!";
}
}
Explanation:
@CrossOrigin(origins = "http://localhost:3000"): এই কন্ট্রোলার এবং এর সমস্ত মেথডের জন্য CORS কনফিগারেশন দেয়া হয়েছে। এখানে শুধু নির্দিষ্ট একটি Origin-কে অনুমতি দেওয়া হয়েছে।
3. Spring Security CORS Configuration
Spring Security-তে CORS কনফিগারেশন করার জন্য HttpSecurity-তে cors() ফাংশন ব্যবহার করা হয়।
Spring Security CORS Configuration উদাহরণ:
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
.csrf().disable() // Disable CSRF if needed (For stateless API)
.cors().and() // Enable CORS support
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/**").permitAll() // Allow access to /api/**
.anyRequest().authenticated() // Other requests need authentication
);
return http.build();
}
}
Explanation:
cors().and(): এখানে Spring Security-তে CORS কনফিগারেশন সক্রিয় করা হয়েছে। এটিWebMvcConfigurerদ্বারা কনফিগার করা@Configurationক্লাসের CORS কনফিগারেশন ব্যবহার করবে।csrf().disable(): যদি এটি stateless অ্যাপ্লিকেশন হয়, যেমন REST API, তাহলে CSRF নিরাপত্তা নিষ্ক্রিয় করা যেতে পারে।
4. CORS এবং Credentials (Cookies)
Credentials (যেমন, কুকি বা HTTP Authentication Header) পাঠানোর সময় CORS পলিসির কিছু অতিরিক্ত কনফিগারেশন প্রয়োজন হতে পারে।
Example:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("Authorization", "Content-Type")
.allowCredentials(true); // Enable sending credentials (cookies)
}
}
Explanation:
allowCredentials(true): যদি আপনি ব্রাউজার থেকে কুকি বা অন্যান্য ক্রেডেনশিয়ালস পাঠাতে চান, তবে আপনাকে এই কনফিগারেশনটি করতে হবে। CORS কনফিগারেশনে এটিtrueকরতে হবে এবংallowedOrigins()সঠিকভাবে কনফিগার করতে হবে।
CORS Error Handling
যদি CORS পলিসি সঠিকভাবে কনফিগার না করা হয়, তবে আপনি ব্রাউজারে নিম্নলিখিত ত্রুটি দেখতে পারেন:
Access to XMLHttpRequest at 'http://localhost:8080/api/data' from origin 'http://localhost:3000' has been blocked by CORS policy
এটি সাধারণত CORS কনফিগারেশন সঠিকভাবে না করা হলে ঘটে। এই ধরনের সমস্যা এড়াতে, আপনি নিশ্চিত করুন যে:
allowedOrigins()সঠিকভাবে কনফিগার করা হয়েছে।allowedMethods()সঠিক HTTP মেথডগুলোর অনুমতি দেওয়া হয়েছে।allowCredentials(true)সঠিকভাবে সেট করা হয়েছে যদি আপনার অ্যাপ্লিকেশন কুকি ব্যবহার করে।
উপসংহার:
Spring Security তে CORS কনফিগারেশন অত্যন্ত গুরুত্বপূর্ণ, বিশেষত যদি আপনার অ্যাপ্লিকেশন বিভিন্ন ডোমেইনে কাজ করে। আপনি CORS কনফিগারেশন Global বা Controller-level এ করতে পারেন, এবং Spring Security-তে এটি খুব সহজে ইন্টিগ্রেট করা যায়। CORS এর মাধ্যমে আপনি নিরাপদে আপনার ফ্রন্টএন্ড এবং ব্যাকএন্ড অ্যাপ্লিকেশনের মধ্যে যোগাযোগ নিশ্চিত করতে পারবেন।
Read more