• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

스프링 시큐리티 6.0 이상에서 securityfilterchain의 requestMatcher

23.08.18 17:58 작성 23.08.21 10:02 수정 조회수 2.32k

0

강의 2-2 필터 초기화와 다중 보안 설정을 시큐리티 6.0 버전 이상으로 따라 하던 중에 다른 결과가 나와서 질문 드립니다

스크린샷 2023-08-18 오후 4.54.53.pngconfiguration은 위와 같이 설정하였고 처음에는 영상에서 처럼 Order(0)과 Order(1)을 지정 하여 실행하였습니다.

제 생각으로는 6.0이상 버전에서는 사용할 수 없는 antMacher대신 requestMatchers를 사용하여 requestMatcher가 1번첫번째 필터체인은 "admin/**" 두번 째 체인은 any request가 될 것이라고 생각했지만 디버깅 해보니 둘 다 any request가 나와 루트로 접속했을 때 첫번째 필터체인이 생성되어 루트로 가는 것이 아닌 basic login form이 나왔습니다.

스크린샷 2023-08-18 오후 5.42.01.png

그래서 디버깅 중 위와 같이 뜨는 것이 보여 애초에 등록이 잘못 된 건가 싶기도 했는데 영상에서처럼 filters를 확인해보면 첫번 째는 httpbasic와 같이 등록된 12개의 필터, 두번 째는 formlogin과 같이 등록된 14개의 필터로 각각 알맞게 등록되어 있었습니다.

어째서 두 개 모두 다 위 필터들은 정상적으로 등록이 되었는데 requestMatcher는 둘 다 any request 인걸까요? 6.0 이후 버전에서는 requestMatcher를 바꾸려면 다른 방법을 써야 하는 것일까요? 도움 주시면 감사하겠습니다 ㅠㅠ

 

답변 2

·

답변을 작성해보세요.

0

장우성님의 프로필

장우성

질문자

2023.08.26

.authorizeRequests()로 인가 설정을 시작하기전에 HttpSecurity 객체의 securityMatcher로 경로를 설정해주는 방법으로 해결했습니다. 이렇게 설정 시작전에 경로를 정해야 빈에 등록된 필터의 requestMatcher가 바뀌더라구요

제가 사용한 6.1.2 시큐리티 버전의 HttpSecuirity 클래스에는 requestMatchers가 없어서 securityMatcher를 사용해야 하는 것 같네요. 혹시 같은 문제를 겪은 사람에게 도움이 될까 싶어서 답변 남깁니다.

 

윤환님의 프로필

윤환

2023.08.27

개인적으로 REST 형식으로 로그인을 구현하고 있는데요,
궁금한 부분이 질문으로 올라와있는지 보다가 적어봐요
AntPathRequestMatcherantMatcher를 쓰시면 될 거 같습니다.

```java

authorizeHttpRequests(authorizeRequest ->
authorizeRequest
.requestMatchers(
antMatcher("/auth/**")
).hasRole("MEMBER")
.requestMatchers(
antMatcher("/h2-console/**")
).permitAll()
.anyRequest().permitAll()
)
```

저도 그 메서드는 안써보긴했지만 오히려 이 방식이 기존 방식과 동일하기도 하고
관리하는 측면에서도 더 쓸거 같습니다.

 

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.20

안녕하세요, 인프런 AI 인턴이에요. 스프링 시큐리티에서 securityFilterChain의 requestMatcher 관련하여 질문하신 것 같아요.

스프링 시큐리티 6.0 이상에서 requestMatcher를 사용할 때는 requestMatchers() 메소드 대신에 requestMatchers()를 사용해야 합니다. 그래서 다음과 같이 설정을 변경하셔야 합니다.

requestMatchers().antMatchers("admin/**").and()
  .authorizeRequests().anyRequest().authenticated().and()
  .csrf().disable();

이렇게 설정을 변경하면 첫 번째 필터 체인은 “admin/**“로 시작하는 요청에 대해서만 적용되고, 두 번째 필터 체인은 모든 요청에 대해서 적용되게 됩니다.

하지만 제가 어떤 문제가 있는지 정확히 파악하기 어렵습니다. 왜 두 개 모두 모든 요청에 대해 필터 체인의 설정이 동일하게 적용되는지 알 수 없는 상황이라서요. 개발환경이나 코드의 다른 부분을 확인해야 정확한 답변이 가능할 것 같아요.

더 자세한 도움이 필요하시다면, 구체적인 코드와 이슈가 발생한 상황을 공유해주시면 추가적으로 도움을 드릴 수 있을 거에요. 감사합니다.