[ODOP] 76 일차 - 동시 세션 제어, 세션 고정 보호, 세션 정책

💡
최신 버전에서는 아래의 방식과는 조금 다르게 권한설정을 진행한다.
아래의 설명들은 모두 구버전(2.6.7)을 기준으로 설명하고 있다

동시 세션 제어 전략

💡
상황 가정

하나의 계정으로 여러 개의 세션에 접근하고자 하는 사용자가 있다
개발자는 한 계정당 세션 허용 갯수를 1개로 지정 해 놓았다
사용자는 새로운 세션에 접근하고자 하고 이 때 사용할 수 있는 전략이다

동시 세션 제어 설정

private void sessionConfigure(HttpSecurity http) throws Exception {
    http.sessionManagement()             // 세션 관리 기능 작동
        .maximumSessions(1)              // 최대 허용 가능 세션 수, -1 : 무제한 로그인 세션 허용
        .maxSessionsPreventsLogin(true)  // 동시 로그인 차단함, false : 기존 세션 만료(default)
        .expiredUrl("/expired")          // 세션이 제한 갯수를 초과할 때 리디렉션 할 URL
    ;
}

세션 고정 보호

세션 고정 공격

0:00
/
  • 하나의 JSESSIONID 로 공격자와 사용자가 세션을 공유하는 것

이를 보호하기 위해 세션 고정 보호 기능을 제공한다

세션 고정 보호 설정

private void immovableSessionConfigure(HttpSecurity http) throws Exception {
    http.sessionManagement()
        .sessionFixation().changeSessionId() // 기본값 option:[none, migrateSession, newSession]
    ;
}

changeSessionId() [Default]

  • 서블릿 컨테이너에서 제공하는 세션 고정 보호를 사용하도록 지정
  • 세션이 인증되면 세션 ID 를 변경하고 모든 세션 속성을 유지하기 위해 서블릿 메서드 HttpServletRequest#ChangeSessionId() 가 호출

newSession()

  • 새로운 세션을 작성
  • 기존의 세션은 유지하지 않는다.

migrateSession()

  • 새로운 세션을 생성
  • 기존의 세션은 유지

none()

  • 세션 고정 보호를 비활성화
  • 세션 고정 보호를 위한 다른 메커니즘을 사용할 때 유용함
  • 예를들어 애플리케이션 컨테이너 세션 고정 보호가 이미 사용중인 경우

세션 정책

세션 정책을 적용하는 방법은 다음과 같습니다

private void sessionPolicyConfigure(HttpSecurity http) throws Exception {
    http.sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // 기본값
    ;
}

SessionCreationPolicy.Always

스프링 시큐리티가 항상 세션을 생성합니다

SessionCreationPolicy.If_Required

스프링 시큐리티가 필요 시 생성(기본값)

SessionCreationPolicy.Never

스프링 시큐리티가 생성하지 않지만 이미 존재하면 사용

SessionCreationPolicy.Stateless

스프링 시큐리티가 생성하지 않고 존재해도 사용하지 않음

JWT 같이 세션을 사용하지 않는 인증 방식을 사용할 때 설정하는 기능