Securing Enterprise REST APIs with Spring Security 6 & Stateless JWT Authentication
A step-by-step guide to configuring stateless JWT security, refresh token rotation, custom security filters, and role-based authorization in Spring Boot 3.
Securing Enterprise REST APIs with Spring Security 6 & Stateless JWT Authentication
Security is non-negotiable in production enterprise applications. In modern microservices and React single-page application (SPA) architectures, stateless JWT (JSON Web Token) authentication is the industry standard.
Spring Security 6 (introduced with Spring Boot 3) removed many deprecated configuration adapters like WebSecurityConfigurerAdapter. In this article, I will walk you through setting up a modern, security-hardened JWT authentication filter from scratch.
Key Architecture Overview
- Authentication Endpoint (
/api/auth/login): Validates credentials, issues short-lived Access Token (15 mins) and HTTP-Only Refresh Token (7 days). - JwtAuthenticationFilter: Intercepts incoming HTTP requests, validates the
Authorization: Bearer <token>header, and populates theSecurityContextHolder. - SecurityFilterChain Configuration: Defines public vs authenticated endpoints using method-chaining Lambda DSL.
1. Implementing the SecurityFilterChain Bean
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
private final JwtAuthenticationFilter jwtAuthFilter;
private final AuthenticationProvider authenticationProvider;
public SecurityConfig(JwtAuthenticationFilter jwtAuthFilter, AuthenticationProvider authenticationProvider) {
this.jwtAuthFilter = jwtAuthFilter;
this.authenticationProvider = authenticationProvider;
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.cors(Customizer.withDefaults())
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/auth/**", "/swagger-ui/**", "/v3/api-docs/**").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
Conclusion
With Spring Security 6, writing clean, maintainable, and stateless security configurations is straightforward. By combining Spring Security with JWT tokens, we build robust APIs ready for horizontal scaling!
Written by Nilesh Kotkar
Software Engineer & DevOps Engineer specializing in Spring Boot microservices, high-throughput APIs, Docker containerization, and CI/CD pipelines.
More Articles You Might Like
Optimizing PostgreSQL Queries in Spring Boot Applications for 60% Faster API Response Times
Learn practical database indexing techniques, N+1 query elimination with Spring Data JPA entity graphs, and connection pool tuning that slashed response times by 60%.
Building Resilient Microservices with Spring Cloud, Eureka & Resilience4j Circuit Breakers
How to decouple monolithic Java backend services into scalable microservices using Spring Cloud API Gateway, service discovery, and Resilience4j circuit breaking.
