inflearn logo
강의

講義

知識共有

Websocket/STOMP チャット サービス (spring、vue、redis)

JWTトークン生成

시큐리티 필터 설정 질문입니다!

11

du123kim9307

投稿した質問数 2

2

안녕하세요, Spring Security 필터 등록 방식에 대해 질문이 있습니다.

현재 이전까지 저는 Security 필터를 아래처럼 new로 직접 생성해서 사용하고 있습니다.

LoginFilter loginFilter = new LoginFilter(authenticationManager, loginSuccessHandler, loginFailureHandler);

@Component를 달아 Bean으로 등록하면 Spring이 Security 필터체인과 별개로 기본 서블릿 필터체인에도 자동 등록해버려서 필터가 두 번 실행되는 문제가 있기 때문입니다.

혹시 최신 Spring Boot 버전에서는 이 문제가 개선되었나요? 아니면 @Component + 생성자 주입 방식을 안전하게 사용할 수 있는 방법이 따로 있는지 궁금합니다.

spring-boot websocket stomp-websocket pubsub vue-3

回答 1

0

bradkim

안녕하세요~! 동욱님.


security코드 자체는 과거 스프링부트 2점대에서 쓰던 방식에서 3점대부터는 크게 변경되었습니다.


그거 외에 혹시 생성자 주입부분과 new 부분을 비교하는 부분관련해서는 제가 질문의 의도를 정확하게 이해하지 못했습니다. 과거에 쓰시던 코드와 현재 쓰려고 하는 부분을 정확하게 비교해서 명시해주시면, 한번 확인 해보도록 하겠습니다.


감사합니다.

0

du123kim9307

안녕하세요, 추가 질문 드립니다.

강사님 코드를 보면 @Component 와 생성자 주입 방식을 사용하고 계신데, 저는 이전까지 프로젝트를 해오면서 new로 직접 생성하는 방식을 사용했습니다.

 

강사님 방식 (@Component + 생성자 주입)

@Component
public class JwtAuthFilter extends GenericFilter { ... }

@RequiredArgsConstructor
public class SecurityConfigs {
    private final JwtAuthFilter jwtAuthFilter;
    http.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
}

 

제가 쓰던 방식 (new로 직접 생성)

JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter(jwtService);
http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);

제가 알기로는 Filter에 @Component를 달면 Spring Boot가 서블릿 메인 필터체인에도 자동 등록하기 때문에, Security Filter Chain에 별도로 추가했을 경우 필터가 중복 실행될 수 있는 것으로 이해하고 있습니다.

관련 내용을 찾아보던 중 아래 자료들을 확인했습니다.

스프링 부트 깃헙 잇슈

https://github.com/spring-projects/spring-boot/issues/31142

Spring 시큐리티 공식문서

https://docs.spring.io/spring-security/reference/servlet/architecture.html?utm_source=chatgpt.com#servlet-filters-bean-registration

 

image.png

 

이게 해결이 되었는지.. 제가 잘 못 알고 있었는지.. 모르겠어서 질문 남겼습니다!

 

 

 

1

bradkim

아 질문해주신 내용 이해 했습니다. 저도 찾아보니, 현재버전에 security의 @Componet관련하여 말씀해주신 문제가 존재합니다.


다만,

JwtAuthFilter에서 GenericFilter를 상속 받고 있는데, GenericFilter는 내부적으로 Spring의 빈 등록 감지에서 제외되는 처리가 되어 있어서 이중 등록이 발생하지 않습니다.


그런데 결론적으로 @Component를 제외하고 new로 객체를 만드는것이 더 깔끔한 코드가 될것 같습니다.


지적해주신대로 코드를 변경하시는게 더 좋을것 같습니다~!

1

du123kim9307

아 이해했습니다 감사합니다!!!

제가 이전에 했던 방식은 GenericFilter 대신 OncePerRequestFilter 를 상속받아서 사용을 하였는데 두 방식의 차이점도 찾아보고 상황에 맞게 사용하겠습니다!

강의가 싱크가 안맞는것 같아요..

0

9

1

ERD 질문

0

74

2

StompHandler 관한 질문

0

95

2

리프레시 토큰은 알아서 구현하면 되는건가요??

0

91

2

cors, csrf 직접 구현

0

71

1

JWT 필터구현

0

117

2

강의 잘듣고 있습니다. 혹시 다음 강의 계획은 없으신가요?

0

64

1

STOMP 동작 과정 질문

0

56

1

chain.doFilter()

0

47

1

자바 21로 소스 작성해도 되나요?

0

68

2

메시지 브로커 선택에 관한 질문

0

73

2

WebSocket과 Spring Security 질문

0

91

2

추가 커스텀 구현 질문 있습니다.

0

67

2

connect와 동시에 구독하는데 구독 검증이 꼭 필요한가요?

0

104

2

저도 동일한 질문인데

0

93

3

token이 필요한 엔드포인트에 의도적으로 토큰 누락시 대처

0

76

2

수업자료가 왜 다 나눠져있나요?

0

85

2

메시지 전송 시 검증

0

70

2

JWT 생성 시 subject 설정에 대한 질문

0

180

3

StompHandler 질문 있습니다.

0

91

2

앱 서비스일 경우

0

93

2

웹소켓 서버 재배포시 고려해야 할 상황 질문

0

126

2

배포 오류 질문

0

133

2

/connect 경로에 대한 토큰 검증의 필요성

0

90

1