이 글은 정수원님의 Infrean 강의를 학습한 내용을 정리하여 작성합니다.
인증 API - SessionManagementFilter
1. 세션 관리
- 인증 시 사용자의 세션정보를 등록, 조회, 삭제 등의 세션 이력을 관리한다.
2. 동시적 세션 제어
- 동일 계정으로 접속이 허용되는 최대 세션 수를 제한한다.
3. 세션 고정 보호
- 인증 할 때마다 세션 쿠키를 새로 발급하여 공격자의 쿠키 조작을 방지한다.
4. 세션 생성 정책
- Always
- If-Required
- Never
- Stateless
인증 API - ConcurrentSessionFilter
- SessionManagementFilter와 연계해 동시적 세션 제어를 처리한다.
- 매 요청 마다 현재 사용자의 세션 만료 여부를 체크한다.
- 세션이 만료되었을 경우 즉시 만료 처리
- session.isExpired() == true 인 경우
- 로그아웃을 수행한다.
- 즉시 오류 페이지를 응답한다. "This session has been expired"
- session.isExpired() == true 인 경우
인증 API - SessionManagementFilter, ConcurrentSessionFilter
- 최대 세션 허용 개수는 한 개라 가정한다.
- 동시 세션 제어 전략 중 이전 사용자 세션 만료 방식을 사용한다.
- 특정 사용자가 이전 사용자와 동일한 계정으로 인증을 시도해 세션을 생성한다. (최대 세션 허용 개수 초과)
- session.expireNow() 메소드를 호출해 이전 사용자의 세션을 만료시킨다.
- 이전 사용자가 서버에 접근한다.
- 이전 사용자는 세션이 만료된 사용자다.
- ConcurrentSessionFilter는 사용자의 세션이 만료되었는지 매번 검사한다. (session.isExpired())
- SessionManagementFilter 안에서 이전 사용자 세션 만료 설정을 참조한다.
- 세션이 만료되었다면 로그아웃(Logout)을 처리하고 오류 페이지를 응답한다.
- 사용자1과 사용자2가 동일한 계정으로 로그인을 수행한다.
- 최대 허용 가능 세션 수는 한 개라 가정한다.
- 사용자1 GET /login
- UsernamePasswordAuthenticationFilter
- 인증을 처리하는 필터
- 우선 ConcurrentSessionControlAutheticationStrategy를 호출한다.
- ConcurrentSessionControlAuthenticationStrategy
- 동시적 세션 제어 처리
- 사용자의 계정으로 생성된 세션 count를 확인한다. (session count 0)
- session count가 0이므로 무사히 통과한다.
- ChangeSessionIdAuthenticationStrategy
- 세션 고정 보호를 처리
- 기본값은 session.changeSessionId()
- 인증을 처리하면 새로운 JSESSIONID를 발급한다.
- RegisterSessionAuthenticationStrategy
- 사용자의 세션을 등록하고 제정한다.
- 사용자1의 세션 정보가 저장된다.
- session count가 1로 변경된다. (최대 세션 허용 개수 1개)
- UsernamePasswordAuthenticationFilter
- 사용자2 GET /login
- ConcurrentSessionControlAuthenticationStrategy
- 현재 사용자1이 로그인을 수행해 session count 값이 1인 상태이다.
- 현재 세션 개수와 허용 가능 최대 세션 개수가 동일하다. (sessionCount == maxSessions)
- 두 가지 전략
- 이전 사용자 세션 만료
- 현재 사용자 인증 실패
- 두 가지 전략
- 현재 사용자 인증 실패 전략인 경우 SessionAuthenticationException 인증 예외를 발생시킨다. (인증 실패)
- 이전 사용자 세션 만료 전략인 경우 session.expireNow() 메소드를 호출해 사용자1의 세션을 만료시킨다. (사용자2 인증 성공)
- ChangeSessionIdAuthenticationStrategy
- RegisterSessionAuthenticationStrategy
- 사용자2의 세션 정보가 저장된다.
- session count가 2로 변경된다. (최대 세션 허용 개수 1개)
- 사용자2의 세션 정보가 저장된다.
- ConcurrentSessionControlAuthenticationStrategy
- 사용자1 GET /home
- ConcurrentSessionFilter
- 사용자1의 세션 만료 여부를 검사한다.
- session.isExpired() 값이 true인 경우 로그아웃을 수행하고 오류 페이지를 응답한다.
- 사용자1의 세션 만료 여부를 검사한다.
- ConcurrentSessionFilter
'스프링 시큐리티 > 스프링 시큐리티 기본 API 및 Filter 이해' 카테고리의 다른 글
예외 처리 및 요청 캐시 필터: ExceptionTranslationFilter, RequestCacheAwareFilter (0) | 2023.01.27 |
---|---|
권한설정과 표현 (0) | 2023.01.27 |
동시 세션 제어, 세션 고정 보호, 세션 정책 (0) | 2023.01.11 |
익명 사용자 인증 필터: AnonymousAuthenticationFilter (0) | 2023.01.11 |
Remember Me 인증 필터: RememberMeAuthenticationFilter (0) | 2023.01.10 |