[Spring Security] 동시 세션 제어, 세션 고정 보호, 세션 정책

식빵·2022년 8월 9일
0
post-thumbnail

이 시리즈에 나오는 모든 내용은 인프런 인터넷 강의 - [ 스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security ] - 에서 기반된 것입니다. 그리고 여기서 인용되는 PPT 이미지 또한 모두 해당 강의에서 가져왔음을 알립니다.




🥝 동시 세션 제어


한명의 사용자를 위한 최대 세션의 개수를 어떻게 제어할 때 필요한 개념이다.
쉽게 얘기해서 중복 로그인에 대한 처리를 위한 것이다.
스프링 시큐리티에서는 이러한 동시 세션 제어를 2가지 방식으로 지원한다.


🥥 2가지 방식

1. 이전 사용자 세션 만료 방식

  • 사용자1가 로그인
  • 사용자2가 같은 아이디로 로그인
  • 이때 최대 허용 세션개수가 1개로 설정되어 있으면?
    • 사용자1이 갖던 세션이 만료
    • 사용자2는 계속 해당 아이디로 접속 유지

2. 현재 사용자 인증 실패 방식

  • 사용자1가 로그인
  • 사용자2가 같은 아이디로 로그인
  • 이때 최대 허용 세션개수가 1개로 설정되어 있으면?
    • 사용자1은 로그인 상태 유지
    • 사용자2는 인증 예외 발생



🥥 API 사용 및 코드 추적

API로 설정을 해보고, 실제 동작하는 필터 코드를 확인해보자.

// 동시 세션 제어
http.sessionManagement()
    //.invalidSessionUrl("/invalid") // 세션 유요하지 않을 때 이동할 페이지
    .maximumSessions(1)
    .maxSessionsPreventsLogin(true) // 현재 사용자 인증 실패 방식 설정
    // ** (false : 이전 사용자 세션 만료 / true : 현재 사용자 인증 실패) **
    // .expiredUrl("/expired") // 세션이 만료된 경우 이동할 페이지
    
    // invalidSessionUrl 과 expiredUrl 둘 다 설정된 경우
    // invalidSessionUrl 이 우선순위를 갖는다고 함...
;




🥝 세션 고정 보호


  • 공격자가 사용자의 컴퓨터에 자신의 세션 쿠키를 저장시킴
  • 사용자는 해당 세션 쿠키를 갖고 로그인 + 성공
  • 이 이후로 공격자도 같은 세션을 사용함으로 사용자의 정보를 맘대로 조회

이런 일을 방지하기 위해서 사용자가 로그인을 하면 WebApp 에서 새로운 세션 아이디를
제공하는 것을 우리는 세션 고정보호라고 한다.


🥥 API 사용법

http.sessionManagement()
    .sessionFixation()
    .changeSessionId();
    // .migrateSession()
    // .newSession()
    // .none()
  • changeSessionId 방식(기본값)
    • 사용자 인증 성공 시, 세션자체는 그대로 두고 세션 아이디만 변경
    • 기존 세션의 속성값들을 보존
    • 서블릿 3.1 이상에서 기본값
  • migrateSession 방식
    • 새로운 세션 생성 + 세션 아이디 새로 발급
    • 기존 세션의 속성값들 보존
    • 서블릿 3.1 미만에서 기본값
  • newSession 방식
    • 새로운 세션 생성 + 세션 아이디 새로 발급
    • 기존 세션의 속성값들 모두 사라짐
  • none 방식:
    • 세션 고정 보호 안 함




🥝 세션 정책


  • SessionCreateionPolicy.Always: 스프링 시큐리티가 항상 세션 생성
  • SessionCreateionPolicy.If_Required: 스프링 큐리티가 필요시 생성(기본값)
  • SessionCreateionPolicy.Never: 스프링 시큐리티가 생성 X but 존재하면 사용
  • SessionCreateionPolicy.Stateless: 스프링 시큐리티가 생성 X and 존재해도 사용 X

JWT로만 인증을 하는 경우라면 SessionCreateionPolicy.Stateless 를 사용하면 된다.




🥝 참고 링크

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글