π Introduction
In modern web applications, security is a top priority. One popular way to secure REST APIs is by using JWT (JSON Web Token) authentication. JWT allows your API to verify usersβ identities and protect sensitive endpoints without storing session data on the server.
π 1. What is JWT?
JWT (JSON Web Token) is a compact token format that contains user information (claims) and is signed digitally.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMSIsImlhdCI6MTY4MDAwMDAwMCwiZXhwIjoxNjgwMDAzNjAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
ποΈ 2. Create a Spring Boot Project
π€ 3. Define User Model and Repository
Example
@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String username;
private String password;
private String role;
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
}
π 4. Configure Spring Security
Example
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class);
}
}
π οΈ 5. Create JWT Utility Class
Example
@Component
public class JwtUtil {
private String secret = "mySecretKey";
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10))
.signWith(SignatureAlgorithm.HS256, secret)
.compact();
}
public String extractUsername(String token) {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getSubject();
}
public boolean validateToken(String token, UserDetails userDetails) {
final String username = extractUsername(token);
return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
}
}
π 6. Implement Authentication Controller
Example
@RestController
@RequestMapping("/auth")
public class AuthController {
@Autowired private AuthenticationManager authenticationManager;
@Autowired private JwtUtil jwtUtil;
@Autowired private UserDetailsService userDetailsService;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody AuthRequest request) {
authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword()));
final UserDetails userDetails = userDetailsService.loadUserByUsername(request.getUsername());
final String token = jwtUtil.generateToken(userDetails.getUsername());
return ResponseEntity.ok(new AuthResponse(token));
}
}
π§© 7. Create JWT Filter
Example
@Component
public class JwtFilter extends OncePerRequestFilter {
@Autowired private JwtUtil jwtUtil;
@Autowired private UserDetailsService userDetailsService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
final String authHeader = request.getHeader("Authorization");
String username = null;
String token = null;
if (authHeader != null && authHeader.startsWith("Bearer ")) {
token = authHeader.substring(7);
username = jwtUtil.extractUsername(token);
}
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
if (jwtUtil.validateToken(token, userDetails)) {
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authToken);
}
}
chain.doFilter(request, response);
}
}
β
8. Test Your REST API
Example curl command
curl -H "Authorization: Bearer <your_token_here>" http://localhost:8080/api/protected
π Summary
JWT authentication in Spring Boot allows you to build secure, stateless REST APIs. By following these steps β creating a user model, configuring Spring Security, generating JWT tokens, implementing filters, and testing your endpoints β you can secure your API effectively. JWT is widely used in modern web and mobile applications because it is lightweight, secure, and scalable.