springframework/시작하자SpringSecurity

10.SessionManagementFilter, ConcurrentSessionFilter

Jungsoomin :) 2020. 9. 21. 04:13

세션 제어 필터인 SessionManagementFilterConcurrentSessionFilter자세한 동작를 알아본다.

 


SessionManagementFilter .

 

  1. 세션관리 : 인증 시에 사용자의 세션정보 등록, 조회, 삭제 등세션 이력 관리

  2. 동시적 세션 제어 : 동일 계정으로 접속이 허용되는 최대 세션 수 제한

  3. 세션 고정 보호 : 인증할 때 마다 세션 쿠키를 새로 발급하여 공격자의 쿠키 조작 방지

  4. 세션 생성 정책 


ConcurrentSessionFilter .

 

  • 매 요청 마다 사용자의 세션 만료 여 체크

  • 만료되었을 경우 즉시 만료 처리시킴

session.isExpired() == true 일 경우

  • 로그아웃 처리

  • 즉시 오류 페이지 응답해 줌, "This session has bean expired"

즉, ConcurrentSessionFilter 는 SessionManagementFilter 와 함께 동시적 세션 제어를 한다.


큰 틀에서 보자 .

예는 동시적 세션제어 전략 중, 이전 사용자 세션 만료 전략.

 

  1. 사용자의 인증시도SessionManagementFilter 가 작동

  2. 최대 세션 허용 개수 초과이전 사용자 세션 만료 , session.expiredNow()

  3. 이전 사용자가 같은 계정으로 자원 접근시도

  4. ConcurrentSessionFilterSessionManagementFilter세션 만료 여부 확인, session.isExpired()

  5. 만료시 Logout 처리오류 페이지 응답 "This session has bean expired"


조금 더 자세히 .

 

ConcurrentSessionFilter SessionManagementFilter연계된 클래스들의 전반적 처리과정

 

http.sessionManagement().maximumSessions(1) 이라고 가정.

 

  1. user1인증시도 

  2. UsernamePasswordAuthenticationFilterSessionManagementFilter호출

  3. ConcurrentSessionControlAuthenticationStrategy 클래스가 session count를 확인 > 0

  4. ChangeSessionIdAuthenticationStrategy 클래스가 session.changeSessionId() 를 실행

  5. RegisterSessionAutheticationStarategy 클래스가 세션정보를 등록 > 1 하고 인증에 성공

  6. user2인증시도

  7. SessionManagementFilter 작동

  8. ConcurrentSessionControlAuthenticationStartegy 클래스가 session count 를 확인 > 1 , 즉 sessionCount == maxSessions

  9. 현재 로그인 차단 전략일 경우 SessionAuthenticationException 발생

  10. 인증실패(아마 UsernamePasswordAuthenticationFilter에서 AuthenticationFailureHandler를 작동하는 듯)

  11. 이전 사용자 세션 만료 전략일 경우 이전 세션에 대해 session.expireNow() 시키고 인증 성공(아마 UsernamePasswordAuthenticationFilter에서 AuthenticationManager > AuthenticationProvider > AuthenticationSuccessHandler 로 넘어가는 듯함)

  12. ChangeSessionIdAuthenticationStrategy session.changeSessionId()

  13. RegisterSessionAuthenticationStrategy session 정보 등록 > 2 

  14. user1다시 자원접근

  15. ConcurrentSessionFilterSessionManagementFilter session 만료여부 확인 session.isExpired()

  16. 만료확인Logout처리 (LogoutFilter > LogoutHandlerSecurityContextLogoutHandler > LogoutSuccessHandlerSimpleUrlLogoutSuccessHandler 작동인듯)

  17. 응답으로 This session has bean expired