<aside> 💡

진행 순서

  1. 의존성 설치
  2. SecurityFilterChain설정 빈 등록
  3. UserDetails 구현
  4. UserDetailsService 구현
  5. JWT 유틸리티(생성, 검증, 토큰에서 추출) 클래스 구현
  6. 로그인 및 회원가입 API 구현
  7. JWT 기반 인증 적용

extra. 인메모리 사용법

</aside>

formLogin은 로그인은 기본적으로 UsernameAndPasswordAuthenticationFilter를 사용하였다. 본 게시물에서는 UsernameAndPasswordAuthenticationFilter앞에 커스텀JWT인증필터를 만들어 JWT 인증을 구현해본다.

✅ JWT 기반 로그인 흐름

1. 의존성 설치

 // Jwt 관련 의존성
    implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
    runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' // for JSON processing

2. SecurityFilterChain설정 빈 등록

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    private final JwtAuthenticationFilter jwtAuthenticationFilter;
    private final AuthenticationProvider authenticationProvider;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(AbstractHttpConfigurer::disable) // JWT를 사용할 경우 CSRF 비활성화
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 세션을 사용하지 않음
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/login", "/register").permitAll() // 인증 없이 접근 가능
                .anyRequest().authenticated() // 나머지 요청은 인증 필요
            )
            .authenticationProvider(authenticationProvider)
            .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); // JWT 필터 적용

        return http.build();
    }
}

3. UserDetails 구현