이클래스에서 처음으로 받아서 세션의 카운트 수를 가져온다 현재는 처음으로 인증을 시도하기 때문에 세션 count는 0이 되겠다
allowedSessions을 확인해보면 최대 세션 갯수를 알수 있다.
필자는 최대 세션갯수를 1로 설정해주었다. 그러면 아직 최대갯수 범위에 충족 하기 때문에 별다른일을 하지 않는다( false가아니라 true)
세션 고정보호 인데 사용자가 인증할때 쿠키값을 변경시키고 세션을 새로 생성하는 클래스이다.
delegate.onAuthentication을 확인해보면 ChangeSessionIdAuthentication == 기본값 을 확인할수가 있다
applicationEventPublisher.publishEvent(new SessionFixationProtectionEvent(auth,originalSessionId, newSession.getId()));
를 보면 이전사용자의 세션아이디와 새로생성된 세션아이디로 변경한다
sessionRegistry.registerNewSession(request.getSession().getId(),
그다음에 delegate(CompositeSessionAuthenticationStrategy.java)가 RegisterSessionAuthenticationStrategy 클래스에게 세션정보를 등록하러 간다
sessionIds.put을 통해서 Session정보를 저장한다 여기에는 유저객체 정보,세션아이디, 현재날짜 를 등록한다
허용된 세션을 초과 하게 되면
exceptionIfMaximumExceeded <-maxSessionsPreventsLogin(true);
현재 true니까 인증예외를 발생시켜서 현재 사용자의 인증을 실패하게끔 처리한다
throw new SessionAuthenticationException(messages.getMessage)
인증예외가 발생하고 AbstractAuthenticationProcessingFilter(인증필터에서)
unsuccessfulAuthentication(request, response, failed);
받아서 SecurityContext에서 객체를 초기화하고
failureHandler.onAuthenticationFailure(request, response, failed);
여기서 실패 처리를 하게 된다 그러면 현재 사용자의 세션이 생성이 되지 않는다
fasle로 두고 두번째 방법을 하게되면 처음에 사용했던 api로직처리는 비슷하지만 다른곳이 있다.
sessions.sort(Comparator.comparing(SessionInformation::getLastRequest));
위에보면 널값일때 처리 하도록 했지만 두번째 방법은 널값이 아니라 현재사용자와 이전 사용자도 인증에 성공한 상태이다 그러면 널값이 아니고 이전 사용자의 세션이 만료처리가 되어야 하기 때문에 이구문을 통해 수행한다
이필터는 매요청마다 현재 사용자의 세션만료 여부를 체크 하는데
sessionRegistry.getSessionInformation(session
.getId());
ConcurrentSessionFilter.java여기서 현재 사용자의 세션정보를 얻어 온다
그리고 현재 사용자가 이전에 이미 session.expired를 통해서 만료된적이 있다
현재 사용자는 오류 메시지와 함께 로그아웃 처리 될것이다.
'SpringSecurity' 카테고리의 다른 글
SpringSecurity(인증/인가 API-ExceptionTranslationFilter) (0) | 2020.11.02 |
---|---|
SringSecurity(기본API & Filter이해) (0) | 2020.11.01 |
SpringSecurity(세션제어 Filter) (0) | 2020.10.31 |
SpringSecurity(세션 정책) (0) | 2020.10.30 |
SpringSecurity(세션 고정 보호정책) (0) | 2020.10.30 |