본문 바로가기

SpringSecurity

SpringSecurity(세션제어API)

반응형

ConcurrentSessionControlAuthenticationStrategy.java

이클래스에서 처음으로 받아서 세션의 카운트 수를 가져온다 현재는 처음으로 인증을 시도하기 때문에 세션 count는 0이 되겠다

allowedSessions을 확인해보면 최대 세션 갯수를 알수 있다.

Config.calss

필자는 최대 세션갯수를 1로 설정해주었다.  그러면 아직 최대갯수 범위에 충족 하기 때문에 별다른일을 하지 않는다( false가아니라 true)

 

 

CompositeSessionAuthenticationStrategy.java

세션 고정보호 인데 사용자가 인증할때 쿠키값을 변경시키고 세션을 새로 생성하는 클래스이다. 

delegate.onAuthentication을 확인해보면 ChangeSessionIdAuthentication == 기본값 을 확인할수가 있다 

 

ChangeSessionIdAuthentication.java

applicationEventPublisher.publishEvent(new SessionFixationProtectionEvent(auth,originalSessionId, newSession.getId()));

를 보면 이전사용자의 세션아이디와 새로생성된 세션아이디로 변경한다 

 

RegisterSessionAuthenticationStrategy.java

sessionRegistry.registerNewSession(request.getSession().getId(),

그다음에 delegate(CompositeSessionAuthenticationStrategy.java)가 RegisterSessionAuthenticationStrategy 클래스에게 세션정보를 등록하러 간다 

 

 

SessionRegistryImpl.java method = public void  registerNewSession (String sessionId ,  Object principal) 

sessionIds.put을 통해서  Session정보를 저장한다 여기에는 유저객체 정보,세션아이디, 현재날짜 를 등록한다

 

 

 

 

 

ConcurrentSessionControlAuthenticationStrategy.java

허용된 세션을 초과 하게 되면 

exceptionIfMaximumExceeded <-maxSessionsPreventsLogin(true);

 현재 true니까 인증예외를 발생시켜서 현재 사용자의 인증을 실패하게끔 처리한다

throw new SessionAuthenticationException(messages.getMessage)

 

AbstractAuthenticationProcessingFilter.java

 

인증예외가 발생하고 AbstractAuthenticationProcessingFilter(인증필터에서)

unsuccessfulAuthentication(request, response, failed);

받아서 SecurityContext에서 객체를 초기화하고  

failureHandler.onAuthenticationFailure(request, response, failed);

여기서 실패 처리를 하게 된다 그러면 현재 사용자의 세션이 생성이 되지 않는다 

 

 

 

 

Config.calss

fasle로 두고 두번째 방법을 하게되면 처음에 사용했던 api로직처리는 비슷하지만 다른곳이 있다.

ConcurrentSessionControlAuthenticationStrategy.java   method = protected void allowableSessionsExceeded

sessions.sort(Comparator.comparing(SessionInformation::getLastRequest));

 

위에보면 널값일때 처리 하도록 했지만 두번째 방법은 널값이 아니라 현재사용자와 이전 사용자도 인증에 성공한 상태이다 그러면 널값이 아니고 이전 사용자의 세션이 만료처리가 되어야 하기 때문에 이구문을 통해 수행한다

 

 

ConcurrentSessionFilter.java

이필터는 매요청마다 현재 사용자의 세션만료 여부를 체크 하는데 

sessionRegistry.getSessionInformation(session
					.getId());

.SessionRegistryImpl.java
ConcurrentSessionFilter.java

ConcurrentSessionFilter.java여기서 현재 사용자의 세션정보를 얻어 온다

그리고 현재 사용자가 이전에 이미 session.expired를 통해서 만료된적이 있다  

 

ConcurrentSessionFilter.java

 

현재 사용자는 오류 메시지와 함께 로그아웃 처리 될것이다. 

반응형