말그대로 세션이 동시에 일어났을떄 처리 과정이다
크게 두가지로 나눌수있다.
-최대 세션을 1개로 설정해 놓을경우, 사용자가 로그인을 하고(세션저장) 사용자 2가 또 인증을 시도할경우 이전사용자 세션을 만료시키는 경우
-인증이 된상태에서(세션저장) 사용자2의 인증을 실패하는 경우
공격자의 세션(인증성공 토큰) 을 다른 사용자가 사용하게 하고 인증을 성공시키면 공격자는 사용자의 정보를 공유 할수 있다.
이점을 해결하기위해 sessionFixation().changeSessionId() 가 있다. 말그대로 요청을 할때마다 세션값이 바뀐다는 것이다.
이렇게 요청때마다 세션값을 바꾸면 남의 세션값을 사용하는 일은 없을것이다.
즉시 로그아웃 처리되며 즉시 오류페이지 처리
세션 동시접속으로 인해 그 이전의 계정 세션이 만료 처리되고 그 이전의 계정으로 로그인을 시도하면 ConcourrentSessionFIlter 가 세션 만료처리를 보고 쳉크한다. 만료되었으면 로그아웃 시키고+ 오류메세지 내보냄
지금까지 로그인, 즉 인증을 알아봤다 .이제는 권한을 주는 를 알아보자
andtMatchers(URL)을 설정해주고 .hasRole(권한) 설정한 권한이 있는 사용자만 이 페이지에 접속 가능하다는 뜻이다.
loginPage.permitAll() 로그인 페이지 같은 경우는 인증을 한유저, 하지않은 유저, 누구나 접속 가능하게 만들었다는 뜻이다.
구체적 경로가 먼저와야 한다! 왜냐하면 더큰 범위, 더 넓은 권한이 먼저 오면 해당경로에 그 권한이 없어도 접속 가능하기때문
그외에 다른 기능들도 정리 해봤다.
처음 인증안하고 (익명유저) 권한 페이지 접근시 accessDeninedExceptin 발생 -> 익명사용자 또는 remember me 사용자 인증이면 AuthnticationExcepiton 호출
맨처음 은 로그인실패 조차 받지않은 상태라 '인가' 오류가 나고 로그인 실패를 해도 익명사용자로 '인증' 이 됐기때문에 그떄서야 AuthenticatinException 이 발생한다.
Servlet Filter(왼쪽) 은 서블린 컨테이너에서 만든거라 Spring Bean(컨테이너가 다름) injection 불가
Sprig Bean 에서 Servlet Filter 를 구현한다
but 요청이오면 Servlet Filter(왼쪽이) 먼저 가로 챈다
오른쪽 SpringBean이 FilterChainProxy
-> 그걸 해결하기 위해 나온게 ‘DeglegationFilterProxy’
=> 요청(Request)을 Servlet Filter (왼) 받고 -> Del egationgFilter -> Spring Bean 순서
1.springSecurityFilterChain 의 이름으로 생성되는 필터 빈
2. DelegatingFilerProxy으로 부터 요청을 위임받고 실제 보안처리
3. 스프링 시큐리티 초기화 시 생성되는 필터들 관리
-스프링 시큐리티가 기본적으로 생성하는 필터
-설정 클래스에서 API 추가시 생성되는 필터
4. 사용자의 요청을 필터 순서대로 호출하여 전달
5. 사용자정의 필터를 생성해서 기존의 필터 전.후로 추가기능
6. 마지막 필터까지 다통과하고 인증,인가 예외가 발생하지 않으면 보안통과후 서블릿이 요청처리
=> 요청 을 DelegatingFilterProxy가 가장 먼저 받고 그걸 FilterChainProxy에 위임, FilterChainProxy는 요청을 필터들을 통과시킨후 문제가 없으면 서블릿이 요청처리 시작
다중보안 설정
httpSecurity 에서 만든 필터설정과 RequestMatcher로 url 설정한 부분이 SecurityFilterChain안에 저장된다
그 SecurityFilterChain들을 또 FilterCahinProxy 안에있는 SecurityFilterChains 변수에 저장을 한다.
FilterChainProxy가 두가지의 filterCahin이 있지만 요청이 들어올경우 RequestMacher 매칭되는 필터가 작동하도록 구성 되있다.