세션 관리(5/13)

dev.hyjang·2024년 6월 15일

스프링 시큐리티

목록 보기
6/6

동시 세션 제어

  • 사용자가 동시에 여러 세션을 생성하는 것을 관리
  • 사용자의 인증 후 활성화된 세션의 수가 설정된 maximumSession 값과 비교하여 제어 여부를 결정
  1. 사용자 세션 강제 만료
  2. 사용자 인증 시도 차단
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
	http.sessionManagement(session -> session
    .invalidSessionUrl(/invalidSessionUrl”) // 이미 만료된 세션으로 요청을 하는 사용자를 특정 엔드포인트로 리다이렉션 할 Url 을 지정한다
    .maximumSessions(1) // 사용자당 최대 세션 수를 제어한다. 기본값은 무제한 세션을 허용한다
    .maxSessionsPreventsLogin(true) // true 이면 최대 세션 수(maximumSessions(int))에 도달했을 때 사용자의 인증을 방지한다
// false(기본 설정)이면 인증하는 사용자에게 접근을 허용하고 기존 사용자의 세션은 만료된다
.expiredUrl("/expired") // 세션을 만료하고 나서 리다이렉션 할 URL 을 지정한다
 );
 	return http.build();
}

세션 고정 보호

  • 악의적인 공격자가 사이트에 접근하여 세션을 생성한 다음 다른 사용자가 같은 세션으로 로그인하도록 유도하는 위험
  • 스프링 시큐리티는 사용자가 로그인할 때 새로운 세션을 생성하거나 세션 ID를 변경하여 자동 대응

세션 고정 보호 전략

  • changeSessionId() : 기존 세션을 유지하면서 세션 ID만 변경하여 인증 과정에서 세션 고정 공격을 방지하는 방식이다. 기본 값으로 설정되어 있다
  • newSession() : 새로운 세션을 생성하고 기존 세션 데이터를 복사하지 않는 방식이다(SPRINGSECURITY 로 시작하는 속성은 복사한다)
  • migrateSession() : 새로운 세션을 생성하고 모든 기존 세션 속성을 새 세션으로 복사한다
  • none() : 기존 세션을 그대로 사용한다

세션 정책

  • 인증된 사용자에 대한 세션 생성 정책을 설정하여 어떻게 세션을 관리할지 결정할 수 있으며 이 정책은 SessionCreationPolicy 로 설정

세션 생성 정책 전략

  1. SessionCreationPolicy. ALWAYS
  • 인증 여부에 상관없이 항상 세션을 생성한다
  • ForceEagerSessionCreationFilter 클래스를 추가 구성하고 세션을 강제로 생성시킨다
  1. SessionCreationPolicy. NEVER
  • 스프링 시큐리티가 세션을 생성하지 않지만 애플리케이션이 이미 생성한 세션은 사용할 수 있다
  1. SessionCreationPolicy. IF_REQUIRED
  • 필요한 경우에만 세션을 생성한다. 예를 들어 인증이 필요한 자원에 접근할 때 세션을 생성한다
  1. SessionCreationPolicy. STATELESS
  • 세션을 전혀 생성하거나 사용하지 않는다
  • 인증 필터는 인증 완료 후 SecurityContext 를 세션에 저장하지 않으며 JWT 와 같이 세션을 사용하지 않는 방식으로 인증을 관리할 때 유용할 수 있다
  • SecurityContextHolderFilter 는 세션 단위가 아닌 요청 단위로 항상 새로운 SecurityContext 객체를 생성하므로 컨텍스트 영속성이 유지되지 않는다
  1. STATELESS 설정에도 세션이 생성될 수 있다
  • 스프링 시큐리티에서 CSRF 기능이 활성화 되어 있고 CSRF 기능이 수행 될 경우 사용자의 세션을 생성해서 CSRF 토큰을 저장하게 된다
  • 세션은 생성되지만 CSRF 기능을 위해서 사용될 뿐 인증 프로세스의 SecurityContext 영속성에 영향을 미치지는 않는다

SessionManagementFilter & ConcurrentSessionFilter

  • 요청이 시작된 이후 사용자가 인증되었는지 감지하고, 인증된 경우에는 세션 고정 보호 메커니즘을 활성화하거나 동시 다중 로그인을 확인하는 등 세션 관련 활동을 수행하기 위해 설정된 세션 인증 전략(SessionAuthenticationStrategy)을 호출하는 필터 클래스
  • 스프링 시큐리티 6 이상에서는 SessionManagementFilter 가 기본적으로 설정 되지 않으며 세션관리 API 를 설정을 통해 생성할 수 있음

ConcurrentSessionFilter

  • 각 요청에 대해 SessionRegistry에서 SessionInformation 을 검색하고 세션이 만료로 표시되었는지 확인하고 만료로 표시된 경우 로그아웃 처리를 수행한다(세션 무효화)
  • 각 요청에 대해 SessionRegistry.refreshLastRequest(String)를 호출하여 등록된 세션들이 항상 '마지막 업데이트' 날짜/시간을 가지도록 한다
profile
낭만감자

0개의 댓글