Spring Security :: JwtFilter 인증 계층

hyunjoon park·2024년 1월 18일
1

Spring Security

목록 보기
4/12

JwtFilter 인증 계층을 추가하여 보자

JwtFilter 클래스를 만든다

JwtFilter

@RequiredArgsConstructor
public class JwtFilter extends OncePerRequestFilter {

    private final UserService userService;
    private final String secretKey;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // UserId 토큰에서 꺼내기
        String userId = "";

        // 권환부여
        UsernamePasswordAuthenticationToken authenticationToken =
                new UsernamePasswordAuthenticationToken(userId, null, List.of(new SimpleGrantedAuthority("USER")));

        // Detail을 넣어줍니다
        authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
        SecurityContextHolder.getContext().setAuthentication(authenticationToken);

        filterChain.doFilter(request, response);
    }
}

JwtFilter 클래스를 만들고 OncePerRequestFilter를 상속받는다

OncePerRequestFilter -> HTTP Request의 한번의 요청에 대해 한번만 실행하는 Filter이다

불필요한 로직이 실행되는 것을 방지

@RequiredArgsConstructor어노테이션을 사용하여
UserService, secretKey를 받아온다


SecurityConfig

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    private final UserService userService;

    @Value("${jwt.secret}")
    private String secretKey;

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeRequests(
                        auth -> auth
                                .requestMatchers(
                                        HttpMethod.POST,
                                        "/api/auth/signUp",
                                        "/api/auth/login"
                                ).permitAll()
                                .requestMatchers(HttpMethod.POST, "/**").authenticated()
                                .anyRequest().permitAll()
                )
                .csrf(AbstractHttpConfigurer::disable)
                .httpBasic(AbstractHttpConfigurer::disable)
                .formLogin(AbstractHttpConfigurer::disable)
                .cors(Customizer.withDefaults())
                .addFilterBefore(new JwtFilter(userService, secretKey), UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }
}

UserService를 @RequiredArgsConstructor어노테이션을 사용하여 의존성 주입을 해주고

.addFilterBefore()

안에 자신이 만든 jwtFilter 클래스와 UsernamePasswordAuthenticationFilter 를 넣어 Filter를 추가해준다


.requestMatchers(HttpMethod.POST, "/**").authenticated()

다음과 같이 token 인증을 해야하는 uri 경로의 요청 경로를 열어준 것이다

profile
Backend Developer

0개의 댓글