쌩로그

세션 제어 필터 본문

Spring/Spring Security

세션 제어 필터

.쌩수. 2023. 5. 17. 07:59
반응형

나는 어차피 잘 될 사람이다.

어차피 잘 될 것이고, 지금도 잘 되고있고, 과거도 잘 되어왔기에,,,

목차

  1. 개요
  2. 본론
      2-1. ConcurrentSessionFilter
      2-2. SessionManagementFilter
      2-3. SessionManagementFilter와 ConcurrentSessionFilter의 세션 제어 처리 흐름
      2-4. SessionManagementFilter, ConcurrentSessionFilter가 인증으로부터 시작하여 어떤 클래스들을 거쳐 세션 제어를 하는가
          2-4-1. ConcurrentSessionControl AuthenticationStrategy
          2-4-2. ChangeSessionId AuthenticationStrategy
          2-4-3. RegisterSession AuthenticationStrategy
  3. 요약

1. 개요

제곧내이다.
SessionManagementFilterConcurrentSessionFilter
이 두 필터는 세션 제어관련 필터인데, 세션 제어가 어떻게 이 두필터를 통해서 처리되는지에 대한 내용이다.

2. 본론

2-1. ConcurrentSessionFilter

  • 매 요청마다 현재 사용자의 세션 만료 여부 체크
  • 세션이 만료되었을 경우 즉시 만료를 처리하는데, 아래의 값을 체크한다.
        - seesion.isExpired() == true 일경우
        - 로그아웃 처리
        - 즉시 오류 페이지를 응답("This session has been expired")한다.

2-2. SessionManagementFilter

  • 세션 관리
  • 동시적 세션 제어
  • 세션 고정 보호
  • 세션 생성 정

이전 포스팅의 본론 2-2~2-4의 내용이 이 Filter가 하는 내용이다.

2-3. SessionManagementFilter와 ConcurrentSessionFilter의 세션 제어 처리 흐름

이전 사용자의 세션을 만료시키는 전략으로 세션을 제어한다.
세션 허용 최대 개수는 1개이다.

  1. 어떤 사용자(이하 A)가 하나의 계정으로 인증을 시도하고 세션이 생성 된 상태이다.
  2. 다른 유저(이하 B)가 동일한 계정으로 로그인을 한다.
  3. A와 B의 세션이 만들어진다.
      - 이 때 SessionManagementFilter 의 최대 세션 허용 개수의 설정(1개)을 통해서 세션 개수가 초과된 상태이다.
  4. A가 서버로 리소스로 접근을 시도하려고하면 A의 세션은 만료된 상태이다.
      - 이 때, ConcurrentSessionFilter가 매요청마다 세션 만료 여부를 판단하는데, 판단 근거는 SessionManagementFilter에서 이전 사용자 세션 만료(session.expireNow)설정을 참조해서 판단한다.
  5. 만료가 확인되면, 즉시 로그아웃 처리를 하고, 오류 페이지를 응답한다.

2-4. SessionManagementFilter, ConcurrentSessionFilter가 인증으로부터 시작하여 어떤 클래스들을 거쳐 세션 제어를 하는가

세션 최대 허용개수는 1개로 설정한다.
동일한 계정을 A와 B가 로그인한다고 가정한다.
이전 사용자 세션을 만료하는 전략으로 세션을 처리한다고 가정한다.

  1. A가 로그인(인증)을 한다.
  2. ConcurrentSessionControl AuthenticationStrategy클래스가 인증을 시도하는 계정으로 생성된 세션이 몇개인지 확인한다. 현재 생성된 것이 없으므로 세션의 개수는 0이다. 최대 허용 개수를 넘지 않기 때문에 다음 처리를 ChangeSessionId AuthenticationStrategy클래스로 넘긴다.
  3. ChangeSessionId AuthenticationStrategy가 세션을 생성한다.
      - session.changeSessionId()의 설정을 통해 세션 고정 보호를 위해 세션 Id를 새로운 인증마다 변경한다.
  4. RegisterSession AuthenticationStrategy가 A의 세션을 등록한다. 비로소 세션의 개수가 1개가 된다.
  5. B가 인증을 시도한다. 2번에 언급했던 ConcurrentSessionControl AuthenticationStrategy 클래스를 거친다.
      - 만약, 인증 실패 전략(1개가 생성된 이후에는 생성되지 못 하도록 하는 전략)일 경우, 다른 클래스들을 거치지않고 곧바로 인증 실패응답한다
      - 세션의 최대 허용개수를 초과하므로, B의 인증성공과 동시에 A의 세션을 만료시킨다.
  6. A가 서버로의 접근을 시도하면 ConcurrentSessionFilter(처음부터 언급됨)가 사용자 1의 세션만료여부를 체크한다.(위에도 말한 거처럼 매 요청마다 세션만료 여부를 체크한다.) 이 때 SessionManagementFilter를 통해서 체크한다.
  7. A의 세션이 만료되었으므로, 오류 페이지를 응답한다.

2-4-1. ConcurrentSessionControl AuthenticationStrategy

  - 동시적 세션 제어를 처리하는 클래스
  - 인증을 시도하는 사용자가 가지고 있는 계정으로 생성된 세션이 몇 개인지를 확인하는 클래스

2-4-2. ChangeSessionId AuthenticationStrategy

  - 세션 고정 보호를 처리하는 클래스

2-4-3. RegisterSession AuthenticationStrategy

  - 세션을 등록하고 제거하는 역할을 하는 클래스


3. 요약

SessionManagementFilterConcurrentSessionFilter가 사용자의 세션 제어처리를 하는데, 각 필터에 설정된 클래스들을 통해서 매요청마다 최대 세션 허용 개수를 체크하고, 세션을 새로 생성하고 세션의 정보를 등록하는 클래스가 이미 스프링 시큐리티를 통해서 구현되어있고, 우리는 그것을 가져다가 메서드 체이닝으로 설정만 해주면 된다.

4. 끝.

쪼매 빡세다. 빡세야 공부지..
그나저나 글머리기호나 리스트에 들어가면 이탤릭체 적용이 안되서 쪼큼 킹받네.. 나름 최애 태그인데;;; 볼드체로 감싸고있음;;;
아는 사람 댓글좀...;;

여튼... 끝;

728x90
Comments