seok의 패치노트
[Security] SessionManagementFilter, ConcurrentSessionFilter - 동시세션 제어 본문
[Security] SessionManagementFilter, ConcurrentSessionFilter - 동시세션 제어
석석's 2021. 12. 29. 21:38https://oneseok.tistory.com/74
[Security] 동시세션 제어
프로젝트를 하다보면 같은 유저에 대해 동시접속에 대한 고민을 하게된다. 동시접속이 가능하게 해줘야하나? 아니면 기기당 하나 ??.. 이것도 아니면 그냥 무조건 하나만 접속가능하게 해야하나
oneseok.tistory.com
시큐리티를 공부하면서 동시세션 제어를 어떻게 처리하는지 알아보는 시간이 있었다 이번시간에는 이 동시세션제어 가어떻게 이루어지는지 관련 필터에 대해 알아볼 것 이다.
관련 필터로는 SessionManagementFilter 와 ConcurrentSessionFilter 가 있다.
ConcurrentSessionFiter
- SessionManagementFilter 와 연계하여 동시세션 제어 역활을 담당한다.
- 매 요청마다 현재 사용자의 세션 만료 여부를 체크함
- 세션이 만료되었을 경우 즉시 만료 처리
- session.isExpired() 의 결과값이 true 일 경우 사용자의 로그아웃 처리 및 즉시 오류페이지 응답을 처리한다.
동시세션 전략에서 이전사용자 세션만료 로직 순서
- 유저에 최대 세션개수를 1개로 정해두고 동시세션관련 전략을 이전사용자 세션만료로 설정해두었고 이미 해당유저에 대한 세션이 존재한다고 설정해보자.
- 같은 사용자가 로그인을 또 했을때 SessionManagementFilter 에서 먼저 동시세션전략을 확인후 session.expireNow()를 호출한다.(이미 최대허용 세션개수인 1개를 넘어섰기 때문이다.)
- ConcurrentSessionFiter 에서 SessionManagementFilter의 session.expireNow()가 설정되있는 것을 확인후 session.isExpired()의 결과값으로 true를 리턴하며 로그아웃 처리 및 오류페이지 응답을 수행한다.
같은 사용자 id를 가진 user1 , user2가 있다고 쳐보자
먼저 user1이 인증을 통해 세션을 얻은 상태에서 user2가 인증처리를 하였을때 동시로그인 차단 전략과 이전세션 만료 전략에 따라 각각 어떻게 움직이는지 확인해보자!!!
1. user1 이 인증처리를 시도한다
- UsernamePasswordAuthenticationFilter가 동작하여 인증을 시도한다
- UsernamePasswordAuthenticationFilter 가 ConcurrentSessionControlAuthentiCationStrategy 를 호출한다.
- ConcurrentSessionControlAuthentiCationStrategy 가 하는 일은 해당 유저의 세션수가 얼마나 있는지 count를 세는 역활을 한다.
2. ChangeSessionIdAuthenticationStarategy 가 호출되어 세션아이디를 새로 생성한다!!
3. RegisterSessionAuthenticationStrategy 가 호출되어 해당 유저의 세션을 등록한 후 인증성공 처리가 된다.
4. user2가 같은 id로 인증을 시도한다.
- UsernamePasswordAuthenticationFilter가 동작하여 인증을 시도한다
- UsernamePasswordAuthenticationFilter 가 ConcurrentSessionControlAuthentiCationStrategy 를 호출한다.
- ConcurrentSessionControlAuthentiCationStrategy 세션을 count해보니 최대세션수인 1개에 도달했다 판단한다.
* 동시 로그인 차단 전략 일경우
- SessionAUthenticationException(인증예외)을 호출하여 예외를 발생시키고 종료된다.
* 기존세션 만료 전략 일 경우
- session.expireNow() 를 통해 user1(이전사용자) 의 세션을 만료시키는 전략을 설정하고 인증에 성공한다
그후 위에 user1의 인증처리처럼 세션ID를 새로발급받고 세션을 등록한다.
- 세션이 만료된 user1이 웹페이지에 요청을 하게되면 ConcurrentSessionFiter 가 동작하여 SessionManagementFilter의 session.expireNow()를 보고 session.isExpired() 를 통해 세션을 만료시키고 로그아웃 처리및 오류페이지로 응답을 준다.
'Spring > Security' 카테고리의 다른 글
[Security] csrf Filter (0) | 2022.01.02 |
---|---|
[Security] ExceptionTranslationFilter (0) | 2021.12.29 |
[Security] 고정세션 보호 - 고정세션 공격방어! (0) | 2021.12.28 |
[Security] 동시세션 제어 (0) | 2021.12.28 |
[Security] AnonymouseFilter - Guest 유저를 위함 (0) | 2021.12.28 |