Spring Security : 동시 세션 제어

    이 글은 인프런 정수원님의 강의를 복습하며 작성한 글입니다. 

     

    동시세션 제어 

    동시세션이란 동일한 계정으로 접속했을 때 만들어지는 세션을 의미한다.  즉, A,B라는 사용자가 각각 C라는 계정으로 접속했을 때 A,B 사용자들을 위한 세션이 각각 만들어진다. 이런 세션들을 동시세션이라고 한다. 동시세션을 제어하는 것은 중요한 일이다. 

    동시세션이 생긴다는 것은 동시에 여러 사람이 동일한 계정으로 접속할 수 있는 것을 의미한다. 따라서 동일 계정에서 동시에 사용할 수 있는 사람을 하나만으로 설정하고 싶다면, 동시세션을 제어해야한다. 

     

    동시세션 제어 전략

    • 이전 사용자 세션 만료 전략
    • 현재 사용자 인증 실패 전략 

    동시 세션 전략은 위와 같이 두 가지의 전략이 있다. 아래에서 좀 더 자세히 살펴보도록 한다. 

     

    이전 사용자 세션 만료 전략 

    1. 사용자1이 먼저 서버에 로그인 요청한다.
    2. 서버는 세션을 생성해서 응답한다. 
    3. 사용자2가 세션에 로그인 요청을 한다
    4. 사용자2에게 세션을 만들어 응답해준다. 그리고 사용자1의 세션을 만료시킨다.
    5. 사용자1이 자원 접근 요청을 보낸다. 서버는 사용자1의 세션이 만료된 것을 확인하고, 세션을 만료시키고 예외를 발생시킨다. 

    이전 사용자 세션 만료 전략은 동일 계정으로 누군가 로그인 했을 때, 이전에 사용하던 사용자의 세션을 만료시켜 접근하지 못하도록 한다. 그리고 현재 인증 요청한 사용자의 계정은 인증 및 세션을 생성해준다. 

     

    현재 사용자 인증 실패 전략

    1. 사용자 1이 로그인 요청을 한다. 서버는 인증 처리 및 세션을 만들어 사용자1에게 내려준다.
    2. 사용자 2가 로그인 요청을 한다. 이 때, 서버는 동일 계정으로 로그인 한 것을 확인한다. 
    3. 서버는 사용자2에게 인증 예외를 발생시켜준다. 

    현재 사용자 인증 실패 전략은 이미 동일 계정으로 접속하고 있는 사람이 있을 경우, 현재 인증 요청한 사용자의 인증 과정에서 인증 예외를 발생시키는 전략이다. 따라서, 이전 사용자만 계속 사용할 수 있다. 

     

    동시세션제어 API → WebSeuciryConfigurerAdapater에서 등록

    • http.sessionManagement() : 세션 관리 기능 설정. 동시 세션 제어 외에 여러 기능 설정 가능
    • sessionManagement() : 세션 관리 기능 제공
    • maximumSessions() : 최대 허용 가능 세션 수 설정. "-1"로 설정할 경우 무제한 로그인 세션 허용 
    • maxSessionsPreventsLogin() : 동시 로그인 차단함 기능 동작.
      • true : 현재 사용자 인증 실패
      • false : 이전 사용자 세션 만료
    • invalidSessionUrl("/invalid") : 세션이 유효하지 않을 경우 리다이렉트 할 페이지
    • expiredUrl("/expired") : 세션이 만료되었을 경우 리다이렉트 할 페이지 

    동시 세션 제어는 HttpSecurity 객체의 sessionManagement() 메서드를 이용해 설정할 수 있다. sessionManagement 메서드는 동시 세션 제어 외에도 다양한 형태의 세션 관련 기능을 제공한다. 

     

    실습 → 현재 사용자 인증 실패 전략

    http
            .sessionManagement()
            .maximumSessions(1)
            .maxSessionsPreventsLogin(true);

    다음과 같이 코드를 설정한다. 이 때, 최대 동시 접속 세션은 '1'개로 설정되고, 최대 동시 세션에 도달했을 때 대응하는 값은 True를 했다. True를 하게 되면 나중에 접속하는 사용자가 인증이 실패하는 구조다.

    두번째 사용자 인증 실패

     

    첫번째 사용자는 User 계정을 Edge 브라우저로 로그인 했다. 두번째 사용자는 User 계정을 Chrome 브라우저로 로그인했다. 두번째 사용자가 로그인하는 시점에 "Maximum Session of 1"이라는 경고 문구가 뜨며 로그인이 되지 않는 것을 확인할 수 있다. 즉, 현재 사용자의 인증 실패가 발생한다. 

     

     

    실습 → 이전 사용자 세션 만료 전략 

    http
            .sessionManagement()
            .maximumSessions(1)
            .maxSessionsPreventsLogin(false);

    최대 동시 세션을 1로 설정하고, maxSessionsPreventsLogin을 False로 설정한다. 이렇게 설정할 경우, 이전 사용자의 세션이 만료된다. 

    첫번째 세션 만료

    첫번째 사용자 로그인, 두번째 사용자 로그인, 그리고 첫번째 사용자가 다시 localhost:8080으로 접근했을 때 위와 같이 세션이 만료되었다는 문구가 뜨는 것을 확인할 수 있다. 

    댓글

    Designed by JB FACTORY