Advanced Reading time: ~3 min

Common Implementations

JWT, OAuth2, session vs stateless, CSRF, CORS

Common Implementations

Session, JWT, and OAuth2 bring different trade-offs around state, scalability, and integration.

1. Definition

A session-based solution is straightforward and uses server-side state. JWT is common for stateless APIs, but token lifecycle and key management make it more complex. OAuth2 is an identity delegation protocol, not merely a token format.

2. Core Concepts

What happens underneath

A session-based solution is straightforward and uses server-side state. JWT is common for stateless APIs, but token lifecycle and key management make it more complex. OAuth2 is an identity delegation protocol, not merely a token format.

When it is useful

Session, JWT, and OAuth2 bring different trade-offs around state, scalability, and integration. In interviews, highlight common use cases and the related Spring annotations.

What interviewers ask

Common questions cover Common Implementations trade-offs, debugging, and production pitfalls.

3. Practical Usage

  • Use Common Implementations when the problem truly calls for it.
  • Look at configuration and annotations together because both shape runtime behavior in Spring.
  • During debugging always inspect startup logs, the bean graph, and active profiles.
  • Prefer small components with clear responsibilities.
  • In interviews, mention the production trade-off, not only the annotation name.

4. Code Examples

The following example demonstrates Common Implementations with real Spring annotations.

import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
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
class ResourceServerConfig {
    @Bean
    SecurityFilterChain apiSecurity(HttpSecurity http) throws Exception {
        return http
                .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
                .oauth2ResourceServer(oauth2 -> oauth2.jwt(jwt -> jwt.jwtAuthenticationConverter(new JwtAuthenticationConverter())))
                .build();
    }
}

With JWT, stateless does not mean no state exists anywhere; revocation and refresh often still require state.

5. Trade-offs

  • Convention vs explicit configuration — Spring speeds development through convention, but sometimes explicit control is required for predictable behavior.
  • Fast development vs transparency — Less boilerplate is good, but too much framework magic can make debugging harder.
  • Abstraction vs control — Higher abstraction accelerates development, but you still need to understand low-level behavior.

6. Common Mistakes

  • Memorizing annotations without understanding runtime behavior.
  • Changing defaults without understanding the consequences.
  • Keeping oversized components with weak boundaries.
  • Ignoring logs and diagnostic tooling.
  • Not aligning the test strategy with the specific layer.

7. Senior-level Insights

  • A senior Spring engineer also looks at which proxy, bean post-processor, or filter is active under the hood.
  • Most hard bugs are not about annotation names but about lifecycle and ordering.
  • In production thinking, startup time, memory, observability, and rollback strategy all matter.

8. Glossary

  • Common Implementations: A Spring concept or mechanism related to this topic.
  • Bean: An object managed by Spring.
  • Proxy: An intermediate object that can add behavior.
  • Configuration: Properties or bean definitions that shape runtime behavior.
  • Context: The current application container state in Spring.

9. Cheatsheet

  • Session, JWT, and OAuth2 bring different trade-offs around state, scalability, and integration.
  • Understand the underlying lifecycle.
  • In interviews, mention the trade-off, not just the annotation.
  • For production bugs, start with logs, bean graph, and active profiles.
  • The simplest working solution is often the best one.

🎮 Games

8 questions