inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 시큐리티 OAuth2

RSA 검증 기능 구현 - JwtAuthorizationRsaFilter

JwtAuthorizationFilter에 대한 질문입니다!

208

literate_t

작성한 질문수 68

0

안녕하세요.

테스트를 하다 보니까 (결과적으론 저의 실수인데요) 토큰을 검증하는 로직이 두 번 실행되는 겁니다. Mac 방식과 Rsa 방식 둘 다요. OAuth2ResourceServer에서 분명 addFilterBefore()에서는 하나의 필터만 넣어주었는데 말이죠.

궁금해서 찾아보니 OAuth2ResourceServer에서 Mac방식과 RSA 방식 모두를 Bean으로 만들어서 그런 거였습니다. addFilter에 넣은 커스텀 필터만 동작하는 줄 알았지만, OncePerRequestFilter를 상속하면 빈으로 만드는 것만으로도 필터 목록에 추가되더라고요. 확인해 보니 가장 마지막에 추가되는 것 같습니다. 여기서 질문입니다!

addFilterBefore() 등의 함수로 커스텀 필터의 위치를 지정하하면서, 설정에서 MAC과 RSA의 bean을 둘 다 살리면서 동작하는 방법은 없는 걸까요~? GenericFilterBean을 상속하게 해서 구현해도 addFilter 없이도 동작을 하니까 아래처럼 두 Bean 모두 살아있으면 검증을 두 번 하게 되네요.

  @Bean
  public JwtAuthorizationMacFilter jwtAuthorizationMacFilter(OctetSequenceKey octetSequenceKey)
      throws JOSEException {
    return new JwtAuthorizationMacFilter(new MACVerifier(octetSequenceKey.toSecretKey()));
  }

  @Bean
  public JwtAuthorizationRsaFilter jwtAuthorizationRsaFilter(RSAKey rsakey) throws JOSEException {
    return new JwtAuthorizationRsaFilter(new RSASSAVerifier(rsakey.toRSAPublicKey()));
  }

java spring spring-boot oauth

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.
님의 질문에 답변드립니다.

JwtAuthorizationFilter가 두 번 실행되는 문제는 하나의 필터만 명시하는 것이 아니라, 두 가지 방식의 JwtAuthorizationFilter가 모두 스프링 시큐리티 필터 체인에 등록되어 있기 때문에 발생합니다. 스프링 시큐리티의 필터 체인은 OncePerRequestFilter를 상속한 필터에 대해 해당 필터가 빈으로 등록되어 있는 경우 자동으로 필터 체인에 포함시키기 때문입니다.

addFilterBefore() 등의 함수로 특정한 위치에 커스텀 필터를 지정하는 것은 가능하지만, 두 방식의 필터를 동시에 유지하면서 중복 실행을 방지하려면 별도의 로직을 구현해야 합니다. 예를 들어, 하나의 필터에서 조건에 따라 MAC 방식과 RSA 방식 중 하나를 선택하여 실행하게 하는 방법이 있을 수 있습니다.

예를 들어 아래처럼 단일 필터에서 내부적으로 조건에 따라 검증 방식을 결정하도록 구현할 수 있습니다.

@Bean
public Filter registrationFilter() {
  return new OncePerRequestFilter() {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
      
      try {
        // MAC 검증 로직 수행
        // RSA 검증 로직 수행
        // 어떤 검증 방식을 사용할지 결정하는 로직
        // ex) 토큰 형식을 확인하고 MAC이면 MAC 검증, RSA면 RSA 검증을 수행
      } catch (AuthenticationException e) {
        // 검증 실패 처리
        return;
      }

      // 계속해서 필터 체인을 수행
      filterChain.doFilter(request, response);
    }
  }
}

해당 로직을 구현하면 하나의 필터에서 두 가지 방식의 토큰 검증 로직을 분기 처리할 수 있으며, 중복 실행 문제를 해결할 수 있습니다.

예시에 나와 있는 것처럼 JwtAuthorizationMacFilterJwtAuthorizationRsaFilter 두 컴포넌트 모두를 빈으로 등록하는 대신에, 하나의 빈으로 통합하여 그 안에서 조건에 따라 다른 검증 로직을 실행하는 방식으로 변경해야 할 것입니다.

authorization-server 라이브러리 질문이 있습니다.

0

75

1

loadUser 중 Missing attribute 'preferred_username' in attributes 에러 발생

0

76

2

JWT 조회 에 대한 질문

0

70

1

password grant 방식 에러 응답

0

88

3

FormLoginConfigure에서 생성하는 필터

0

76

2

현업에서 springboot를 3.5.5 를 사용해서 공부중인데...

0

282

2

Jdbc 관련 강의 및 깃헙 문의

0

77

1

OAuth2AuthorizedClient 이해 및 활용 강의 내용 질문

0

208

1

UserInfo 엔드포인트 요청 실습

0

73

1

RFC 문서에서의 AccessToken 발급 방식 궁금한점

0

150

1

강의자료.zip 를 다운로드 받았는데 압축이 풀리지 않습니다. 확인 부탁드려요

0

139

2

OIDC SSO 관련 질문 입니다.

0

130

1

AuthenticationEntryPoint 강의 누락 문의

0

121

1

cors설정방법

0

115

1

jwt decoder 토큰 검증 시 질문

0

221

1

클라이언트에서 userinfo 엔드포인트 호출 시 질문

0

184

2

JOSE 구성요소의 api에 관한 질문

0

140

2

스프링 부트 3버전으로 따라가시는 분들 참고하세요

1

527

1

CustomOAuth2AuthenticationFilter 구현 중 질문

0

145

2

AuthenticationManager 생성시점

0

117

1

FormLogin과 Oauth2Client 둘 중 사용하는 시점

0

127

1

postman userinfo 엔드포인트 질문

0

135

2

강의 수강신청하고 듣기 전입니다 질문있습니다.

0

113

1

인증 코드를 통해 발급 받은 토큰의 관리

0

198

1