인프런 커뮤니티 질문&답변

로시츠키님의 프로필 이미지

작성한 질문수

스프링 시큐리티

4) 웹 기반 인가처리 DB 연동 - FilterInvocationSecurityMetadataSource (1)

질문입니다

20.05.20 15:37 작성

·

1.2K

2

1.

RequestMatcher matcher = entry.getKey();

 if (matcher.matches(request)) ~

해당 부분이 어떤 흐름인지는 대충알겠는데

확실하게 하고 싶어서요

RequestMap에 담긴 key값과 FiltetInvocation의 요청정보

를 matches()메소드로 비교하기 위해서RequestMatcher타입의 객체에 담는다 라고 생각하면 될까요?

2.

RequestMatcher

AntPathRequestMatcher

아키텍쳐 관점에서 설명 한번 부탁드립니다ㅜ

.antMatchers()나 mvcMatchers() 이런거랑은 관계 없는건가요?

이번에도 잘 부탁드립니다

답변 1

7

정수원님의 프로필 이미지
정수원
지식공유자

2020. 05. 20. 17:30

먼저 1번 질문에 대한 답입니다.

RequestMap 은 자원정보와 권한정보를 매핑한 데이터들을 담고 있습니다.

가령 /user 자원에 접근하기 위해 필요한 권한이 ROLE_USER 라고 한다면

RequestMap 의 key : value 는 /user : ROLE_USER 가 됩니다.

requestMap.put(new AntPathRequestMatcher("/user"), List(new SecurityConfig("ROLE_USER")));

여기서 스프링 시큐리티가 현재 클라이언트가 접근하는 자원이 /user 인지 아닌지 판별하기 위해 사용하는 클래스가RequestMatcher 인터페이스를 구현한 AntPathRequestMatcher 이고 matches 메소드가 사용되어 집니다.

그렇다면 스프링 시큐리티가 인가처리를 하기 위해 결국 필요로 하는것은 현재 사용자가 접근하고자 하는 자원에 설정된 권한정보를 얻는 것인데 만약 클라이언트가 /user 자원을 요청했다면 request 객체에는 /user 정보가 있을 것이고 스프링 시큐리티는 이 request 객체를 FiltetInvocation 에 저장합니다.
그리고 추후 인가처리 시 사용자의 요청정보를 구할 때 
FiltetInvocation 에 저장된 request 객체를 참조해서 구하게 됩니다.

그래서 if (matcher.matches(request)) 구문은 RequestMap 에 key 값으로 저장된 AntPathRequestMatcher(/user) 와 FiltetInvocation 에 저장된 request(/user) 를 matches 통해 서로 비교한 후 url 정보가 일치한다면 RequestMap 의 url 정보에 해당하는 ROLE_USER  권한 정보를 가져 올 수 있는 것입니다.

// AntPathRequestMatcher 에 설정된 자원정보와 클라이언트의 요청정보(request)에 저장된 url 정보가 일치하는지 비교
if
(matcher.matches(request)) {
result = entry.getValue()
; // 서로의 정보가 일치한다면 권한정보를 반환함
break;
}

즉 AntPathRequestMatcher 에 /user 와 같은 자원정보를 설정하는 것은 현재 클라이언트가 요청한 url 정보들 중에서 AntPathRequestMatcher 에서 설정한 자원정보와 일치하는 값을 찾고 그 값에 해당하는 권한정보를  구해서 인가처리를 하기 위한 설계라고 보시면 됩니다.

로시츠키 님이 생각하신 부분이 맞습니다.

2번 질문에 대한 답은 1번과 공통적인 부분이 많습니다.

다만 RequestMatcher 와 AntPathRequestMatcher 는 아키텍처 관점에서 바라보기보다는 RequestMatcher 를 구현한 구현체들의 역할과 특징들을 하나씩 파악하시면 될 것 같습니다.

가령 

AntPathRequestMatcher 는 AntPathRequestMatcher 에 설정한 자원정보와 클라이언트가 요청한 자원정보를 서로 비교해서 참인지 거짓인지 알려주는 기능을 하는 클래스이고

AndRequestMatcher 클래스는 여러 AntPathRequestMatcher 클래스들을 사용해서 matches 한 결과 중에서 하나라도 거짓일 경우 거짓을 반환하는 클래스이고

OrRequestMatcher 클래스는 여러 AntPathRequestMatcher 클래스들을 사용해서 matches 한 결과 중에서 하나라도 참일 경우 참을 반환하는 클래스 입니다

이 외에도 RequestMatcher 인터페이스를 구현한 구현체는 여러개 있고 각 특징에 따른 matches 기능을 수행하고 있습니다.

http.antMatchers("/user","/login") 과 같은 기능도 결국 위의 AntPathRequestMatcher 와 OrRequestMatcher 와 같은 클래스를 활용하여 현재 사용자가 요청하는 url 정보와 SecurityConfig 의 인가정책에 설정된 자원들("/user","/login")과 일치하는지 비교하기 위한 API 라고 보시면 됩니다.

즉 http.antMatchers("/user","/login") 는 대략 다음과 같이 초기화 시 설정이 이루어지고 있다고 보시면 됩니다.

List<RequestMatcher> matchers = Arrays.asList( AntPathRequestMatcher("/user"), AntPathRequestMatcher("/login") )

OrRequestMatcher orMatcher = new OrRequestMatcher(matchers);

...

...

List<RequestMatcher> matchers = orMatcher .getMatchers();

for(RequestMatcher matcher : matchers){

boolean isMatcher = matcher.matches(request); // 요청 url 정보와 일치하는 설정정보가 존재하는지 검사

}

if(isMatcher){ 

// 일치한다면 요청에 따른 권한 정책 검사

 ...

....

}

가능하시면 직접 소스를 디버깅 하면서 추적하시면 더 이해가 잘 되실 거라 생각합니다.