JWT helps keep API communication safe and lets servers know who is talking without asking for passwords every time.
Why JWT matters for APIs in Spring Boot
Start learning this pattern below
Jump into concepts and practice - no test required
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VySWQiLCJleHAiOjE2MzAwMDAwMDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
A JWT has three parts separated by dots: header, payload, and signature.
The payload holds user info and expiration time.
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
String token = Jwts.builder() .setSubject("userId") .setExpiration(new Date(System.currentTimeMillis() + 86400000)) .signWith(SignatureAlgorithm.HS256, secretKey.getBytes()) .compact();
This simple Java example using JJWT (common in Spring Boot) creates a JWT token for user "user123" that expires in 1 hour and prints it.
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class JwtExample { private static final String secretKey = "mySecretKey"; public static String createToken(String userId) { return Jwts.builder() .setSubject(userId) .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1 hour .signWith(SignatureAlgorithm.HS256, secretKey.getBytes()) .compact(); } public static void main(String[] args) { String token = createToken("user123"); System.out.println("Generated JWT Token:"); System.out.println(token); } }
Keep your secret key safe; if someone else gets it, they can create fake tokens.
Tokens expire to keep your app secure and force users to re-authenticate.
JWTs let your API trust requests without storing session info on the server.
JWTs help APIs know who is making requests safely and quickly.
They let users log in once and keep using the app without repeated logins.
JWTs keep your API stateless and secure by carrying user info inside the token.
Practice
Solution
Step 1: Understand JWT's role in user identification
JWT carries user identity information inside the token, so the server does not need to keep session data.Step 2: Recognize security benefits
This stateless approach improves security and scalability by avoiding server-side session storage.Final Answer:
It securely identifies users without storing session data on the server. -> Option CQuick Check:
JWT = stateless secure user ID [OK]
- Thinking JWT stores passwords inside the token
- Believing JWT replaces HTTPS
- Assuming JWT encrypts API responses automatically
Solution
Step 1: Recall standard JWT header format
The standard way to send JWTs is in the Authorization header with the Bearer scheme.Step 2: Match the correct syntax
"Authorization: Bearer <token>" is the correct and widely accepted format.Final Answer:
Authorization: Bearer <token> -> Option BQuick Check:
JWT header = Authorization: Bearer [OK]
- Using non-standard header names like Token or Auth-Token
- Omitting the Bearer prefix
- Adding extra words like JWT-Authorization
@GetMapping("/profile")
public ResponseEntity<String> getProfile(@RequestHeader("Authorization") String authHeader) {
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
return ResponseEntity.status(401).body("Unauthorized");
}
String token = authHeader.substring(7);
// Assume validateToken returns false if token invalid
if (!jwtService.validateToken(token)) {
return ResponseEntity.status(401).body("Unauthorized");
}
return ResponseEntity.ok("User profile data");
}Solution
Step 1: Check handling of missing or malformed Authorization header
The code returns 401 Unauthorized if the header is missing or does not start with "Bearer ".Step 2: Check token validation logic
If the token is invalid, the method also returns 401 Unauthorized.Final Answer:
Returns 401 Unauthorized if JWT is missing or invalid. -> Option DQuick Check:
Missing/invalid JWT = 401 Unauthorized [OK]
- Assuming it returns 200 OK without JWT
- Expecting exceptions instead of 401 response
- Thinking it returns 500 error on invalid token
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String authHeader = req.getHeader("Authorization");
if (authHeader != null && authHeader.startsWith("Bearer ")) {
String token = authHeader.substring(7);
if (jwtService.validateToken(token)) {
SecurityContextHolder.getContext().setAuthentication(null);
}
}
chain.doFilter(request, response);
}Solution
Step 1: Analyze authentication setting logic
The code sets authentication to null even when the token is valid, which means no user is authenticated.Step 2: Understand correct behavior
It should set a valid Authentication object to represent the logged-in user, not null.Final Answer:
It sets authentication to null instead of a valid Authentication object. -> Option AQuick Check:
Valid token must set Authentication, not null [OK]
- Ignoring that authentication is set to null
- Thinking substring without null check causes error here
- Assuming chain.doFilter order is wrong
- Believing header name is incorrect
Solution
Step 1: Understand stateless authentication with JWT
JWT tokens carry user info and are sent by clients with each request, so the server does not store session data.Step 2: Compare with other methods
Storing sessions or sending credentials every time breaks statelessness or security best practices.Final Answer:
Generate a JWT after login containing user info, send it to client, and require it in Authorization header for each request. -> Option AQuick Check:
JWT = stateless secure token per request [OK]
- Using server sessions instead of JWT for statelessness
- Sending credentials on every request
- Switching between JWT and sessions inconsistently
