본문 바로가기
Spring

[Spring] Spring Security - 필터를 Spring Security Filter로 갈아끼워보자!

by 어떻게말이름이히힝 2025. 1. 16.

1. SecurityConfig를 작성해준다.

addFilterBefore 구문으로 jwtFilter가 SecurityContextHolderAwareRequestFilter보다 먼저 실행된다.

jwtFilter에 /auth 로 시작하면 다음 필터로 이동하는데 이 설정대로 확인을 하게 된다.

기존에 jwtFilter가 jwt토큰에서 역할을 뽑아 확인하던 내용들은 제거하고 SecurityContextHolderAwareRequestFilter에서 처리하도록 설정했다.

@Bean
  public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http
        .csrf(AbstractHttpConfigurer::disable)  
        .httpBasic(AbstractHttpConfigurer::disable)
        .formLogin(AbstractHttpConfigurer::disable)
        .addFilterBefore(jwtFilter, SecurityContextHolderAwareRequestFilter.class)
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/auth/**").permitAll()
            .requestMatchers("/admin/users/**").hasRole("ADMIN")
            .requestMatchers("/**").hasRole("USER")
            .anyRequest().authenticated()
        )
        .build();
  }

 

2. JwtFilter를 bean으로 등록해준다.(SecurityConfig에서 JwtFilter를 등록하는 과정에서 빈 등록이 필요했다.)

>> FilterConfig도 Spring Security에서는 필터관리를 SecurityConfig에서 해줄 거기 때문에 중복 된다고 생각되어서 지웠다.

 

3. 기존에 사용하던 AuthUserArgumentResolver를 제거한다.

>> 기존에 여기서 사용하던 AuthUser 클래스를 Spring Security 방식으로 활용하기 위해 implements UserDetails 추가해준다.(getAuthorities, getPassword 메소드를 오버라이딩 해줌) 

[Spring] ArgumentResolver란? + 유저 정보 넘겨주기

 

[Spring] ArgumentResolver란? + 유저 정보 넘겨주기

ArgumentResolver란?컨트롤러로 들어온 파라미터를 가공, 수정하기 위한 것이다.HandlerMethodArgumentResolver를 구현한다. 보통 여태까지의 코드들은 컨트롤러에서 유저아이디를 꺼내왔었지만 ArgumentResolve

heehyun0221.tistory.com

 

4. WebConfig 도 제거한다.

>> 해당 내용은 AuthUserArgumentResolver를 등록하기 위함으로 2번에서 이것을 제거했기 때문에 필요없다.

 

5. JwtFilter의 상당 부분이 필요가 없어졌다.

 

기존 코드

      httpRequest.setAttribute("userId", userId);
      httpRequest.setAttribute("username", username);
      httpRequest.setAttribute("email", email);
      httpRequest.setAttribute("userRole", userRole);

      if (url.startsWith("/admin")) {
//        관리자 권한이 없는 경우 403을 반환합니다.
                if (!UserRole.ADMIN.equals(userRole)) {
                    httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "관리자 권한이 없습니다.");
                    return;
                }
        chain.doFilter(request, response);
        return;
      }

 

변경된 코드

Long userId = Long.parseLong(claims.getSubject());
String username = (String) claims.get("username");
UserRole userRole = UserRole.valueOf(claims.get("userRole", String.class));
String email = (String) claims.get("email");

 AuthUser user = new AuthUser(userId, email, username, userRole);
      
 SecurityContextHolder.getContext().setAuthentication(
          new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()));