error

[error] JWT + CookieFilter 순환 종속성 에러

멋진놈 2024. 12. 6. 11:23
728x90

# 에러 내용

┌─────┐

| jwtCookieFilter defined in file [D:\2024\sso\build\classes\java\main\com\jwt\sso\example\sso\global\JwtCookieFilter.class]

↑           

| securityConfig defined in file [D:\2024\sso\build\classes\java\main\com\jwt\sso\example\sso\global\SecurityConfig.class] └─────┘

 

jwt + oauth2 + cookie(jwt filter)를 이용한 기능을 구현하다가 위와 같은 에러가 나왔다.

즉 순환 종속성 에러이다.

 

=> 순환 종속성은 두 클래스가 서로 종속될 때 발생한다고 한다. 예를 들어 클래스 A에는 클래스 B가 필요하고 클래스 B에도 클래스 A가 필요할 때를 말하는 것이다.

 

 

# 에러 코드

아래와 같이 cookie를 통해서, jwt의 token 검증 하는게 있고, 아래 해당 filter를 이용해서 api의 /menu에서 인증을 통해서 값을 허용 시키는 기능이 있을때 에러가 났다.

    @Component
public class JwtCookieFilter extends OncePerRequestFilter {

        private final JwtDecoder jwtDecoder;

        public JwtCookieFilter(JwtDecoder jwtDecoder) {
            this.jwtDecoder = jwtDecoder;
        }

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

            Cookie[] cookies = request.getCookies();
            if (cookies != null) {

            }
        }
    }

 

@Configuration
public class SecurityConfig {    private final JwtCookieFilter jwtCookieFilter; 

    public SecurityConfig(JwtCookieFilter jwtCookieFilter) {
        this.jwtCookieFilter = jwtCookieFilter;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/menu").authenticated() // /menu는 인증 필요
                .anyRequest().permitAll()) // 그 외의 요청은 허용
            .addFilterBefore(jwtCookieFilter, UsernamePasswordAuthenticationFilter.class) // 커스텀 필터 추가
            .oauth2ResourceServer(oauth2 -> oauth2.jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthenticationConverter())))
            .csrf(csrf -> csrf.disable()); // CSRF 비활성화
        return http.build();
    }

 

 

 

# 해결 :

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/menu").authenticated()
                .anyRequest().permitAll())
            .addFilterBefore(new JwtCookieFilter(jwtDecoder()), UsernamePasswordAuthenticationFilter.class) // 직접 객체 생성
            .oauth2ResourceServer(oauth2 -> oauth2.jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthenticationConverter())))
            .csrf(csrf -> csrf.disable());
        return http.build();
    }

 

위와 같이 수정.

 

# 수정한 내용 

1. 제거 

public SecurityConfig(JwtCookieFilter jwtCookieFilter) {
    this.jwtCookieFilter = jwtCookieFilter;
}

 

2. 직접 객체로 생성

.addFilterBefore(jwtCookieFilter, UsernamePasswordAuthenticationFilter.class) 

 

=> 

.addFilterBefore(new JwtCookieFilter(jwtDecoder()), UsernamePasswordAuthenticationFilter.class)

 

3.  jwtCookieFilter 쪽은 그대로 놔둠.

 

 

위에 처럼 진행시 정상적으로 순환 종속성 에러 안나고, 쿠키를 이용한 JWT이 정상적으로 검증되어서 받아 왔다.