- 설정 클래스 별로 보안 기능이 각각 작동( SecurityConfigu1과 SecurityConfigu2가 따로 실행되도록 지원하게 된다)
- 설정 클래스 별로 RequestMatcher 설정
- http.antMatcher("/admin/**")
- (admin으로 접근할때는 첫번째 설정클래스의 보안클래스가 실행된다 / 다른 url로 요청시 두번째 설정 클래스가 실행된다.)
- 설정클래스 별로 필터가 생성 ( 초기화 할때 각각의 필터가 초기화 된다)
- 초기회 되면서 생성되었던 필터가 SecurityFilterChain 이라는 클래스 안에 속하게된다
- antMatcher("/admin/**") 설정했던 url 정보를 RequestMacher 타입의 변수로 담긴 클래스의 객체가 생성된다(SecurityFilterChain)
- FilterChainProxy 가 각 필터들 가지고 있음
- 생성되었던 필터와 정보들을 SecurityFilterChains 라는 리스트 변수에 담긴다
- 요청에 따라 RequestMatCher와 매칭되는 필터가 작동하도록함
사용자가 admin으로 요청 하면 FilterChainProxy 가 요청을 받고 요청되어진 url 정보와 매칭을 하게된다.
현재 사용자는 admin으로 요청하엿기 때문에 SecurityConfig1이 호출된다. 만약 user로 요청을 했다면 SecurityConfig1가 호출하게 된다.
필자는 2개의 클래스를 만들었다 하나는 admin으로 요청할시 인증 방식은 httpBasice 으로 수행하는 클래스 와 두번째는 admin url를 제외하고는 어떠한 요청에도 보안기능이 작동하도록 했다.
와스를 구동하게되면 @Order on .... ㅋㅋ 이런 오류를 확인할텐데 이거는 현재 두개의 설정클래스가 있는데 순서를 정해주지 않아서 오류가 발생한거다 지금은 같은 순서이기 때문에 순서를 정해줘야한다
빈을 만드는 과정을 살펴보자
WebSecurity가 filterChainProxy를 만들때 "SecurirtyFilterChains" 를 넘겨주고 있다
그리고 첫번째 설정클래스에서는 form인증이 아닌 httpbasic을 사용했기 때문에 12개의 필터가 호출되었고
두번째 설정 클래스에서는 form인증이기 때문에 14개의 필터가 호출되었다. 왜 2개가 더있냐면 두번째 설저은 form인증이기 때문에
기본적으로 제공되는 로그인 페이지와 로그아웃 페이지가 나와야 하기 떄문에 로그인 필터와 로그아웃 필터가 호출된다.
FilterChainProxy 사용자의 요청을 받고 getFitler에서 두개의 다른 설정클래스의 필터 목록들을 가지고 있다.
그래서 현재 두개의 필터중에서 admin요청으로 처리를 하것인지 아니면 다른url요청으로 처리할지 FilterChainProxy클래스가 판단하게된다.사용자 요청에 따라 필터를 가져 오는데 여기서 그역활을 한다.
필자는 첫번째 클래스에서 어드민으로 설정을 해줬다 그러면 admin에 의해서 구동되기 때문에 if조건이 false가된다.
두번째는 어떤 요청에도 보안기능이 구동되게 했기 때문에 if조검이 true가 된다. 그렇기 떄문에 현재는 14개의 필터가 담긴 두번째 설정 필터들을 호출한다.
현재 루트 페이지는 따로 설정을해주지 안하서 유저가 접근하면 404가 보이고 admin으로 요청하면 저렇게 httpbasic을 호출 하는걸 확인할수 있다.
여기서 주의 해야할점은 Order 순서인데 만약 admin을두번째로 한다면 httpbasic 요청이 나오지 않고 바로 admin 페이지로 넘어가버린다.
왜냐면 두번째 설정클래스는 모든 요청에 의해서 접근할수 있도록 되어 있기 때문에 인증없이 그자원에 접근이 가능하다 이말은 admin도 인증 없이 가능하다는 말이다 !! 설계할때 넓은범위의 요청 방식일수록 순서를 뒤로 둬야한다.
'SpringSecurity' 카테고리의 다른 글
SpringSecurity(SecurityContextHolder,SecurityContext) (0) | 2020.11.05 |
---|---|
SpringSecurity(Authentication) (0) | 2020.11.05 |
SpringSecurity(위임필터 초기화) (0) | 2020.11.03 |
SpringSecurity(CSRF,CsrFilter) (0) | 2020.11.03 |
SpringSecurity(인증/인가 API-ExceptionTranslationFilter) (0) | 2020.11.02 |