spring-security + JWT 이용 로그인(2) - spring-security 설정

홍현기·2025년 3월 31일
0

앞서

전에 spring-security 란 무엇인가 또 로그인 아키텍처 순서에 대해 알아보았다. 이번엔 코드를 작성하여 구현해 보도록 하자. 전에 만들어 놓았던 JWT 생성 코드또한 같이 사용할 예정이다.


의존성 추가

dependencies {
	...

    implementation 'org.springframework.boot:spring-boot-starter-security'

    ...
}
  • 스프링 시큐리티를 사용하기 위해 위 코드를 추가해 의존성을 추가함

패키지 및 클래스 추가

  • config 패키지 추가
  • JWT필터인 JwtAuthenticationFilter 클래스 추가
  • spring-security 관련설정인 SecurityConfig 클래스 추가

JwtAuthenticationFilter

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {

        //TODO 로직구현 필요

        chain.doFilter(request, response);
    }
}
  • 해당 클래스는 API요청시 JWT을 검사하는 용도로 사용하기 위해 생성했음.
  • OncePerRequestFilter: Spring Framework에서 제공하는 Filter 클래스의 한 종류로, 한 요청에 대해 필터가 한 번만 실행되도록 보장하는 기능을 제공
  • OncePerRequestFilter 상속 받아 doFilterinternal 구현
  • chain.doFilter(request, response): 요청이 들어올시 해당 구문을 통해 통과 시킴, 지금은 모든 요청 통과

SecurityConfig

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtAuthenticationFilter jwtAuthenticationFilter) throws Exception {
        http
                .csrf(csrf -> csrf.disable())
                .authorizeHttpRequests(authz -> authz
                        .requestMatchers("/login").permitAll()
                        .anyRequest().authenticated()
                )
                .sessionManagement(session -> session
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                );

        // JWT 필터 등록
        http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  • SecurityConfig 클래스는 Spring Security의 설정을 정의함 해당 설정에는 HTTP 보안 설정, JWT 필터, 인증관리, 비밀번호 인코더 포함되어 있음

1. @Configuration 및 @EnableWebSecurity

  • @Configuration: 이 클래스가 Spring의 구성 클래스임을 나타냄
  • @EnableWebSecurity: Spring Security의 웹 보안 기능을 활성화 또한 이 어노테이션을 사용하면 Spring Security의 설정이 적용됨

2. securityFilterChain 메서드

  • @Bean: 컨테이너에 등록
  • 매개변수:
    • HttpSecurity: HTTP 요청에 대한 보안 설정을 구성하는 객체
    • JwtAuthenticationFilter: 사용자 정의 JWT 인증 필터
  • csrf(csrf -> csrf.disable()): CSRF 보호를 비활성화 한다.
    • 이유: JWT는 클라이언트 측에 저장되는 토큰임 따라서 서버는 세션 상태를 유지하지 않으므로 CSRF 공격의 위험이 적음, CSRF는 주로 쿠키 기반인증에서 문제가 되기때문에 CSRF 보호를 비활성화하는 것이 일반적이다.근데 뭐.. 상황에 따라 활성해 주기도 한다.(거의없다.)
  • authorizeHttpRequests(authz -> authz...): 요청에 대한 권한을 설정
    • requestMatchers("/login").permitAll(): /login 경로는 인증 없이 접근할 수 있음
    • anyRequest().authenticated(): 다른 모든 요청은 인증이 필요함
  • sessionManagement(session -> ...): 세션 관리를 상태 없는 방식으로 설정
    • SessionCreationPolicy.STATELESS: 세션을 사용하지 않는다는 의미, JWT를 사용하는 경우 서버는 클라이언트 측에서 관리되는 JWT를 사용하여 인증을 처리하므로 서버에서 세션을 생성할 필요가 없음

3. authenticationManager 메서드

  • @Bean: 컨테이너에 등록
  • AuthenticationConfiguration: Spring Security의 인증 설정을 가져오는 객체
  • authenticationConfiguration.getAuthenticationManager()를 호출하여 AuthenticationManager를 반환

4. authenticationManager 메서드

  • @Bean: 컨테이너에 등록
  • BCryptPasswordEncoder를 사용하여 비밀번호를 암호화

마치며

이와 같이 JWT 인증 및 spring-security 설정을 해보았다. 이후엔 이를 활용하여 직접적인 로그인기능을 구현해 보도록 하자.

0개의 댓글