본문 바로가기
개발

[SpringBoot] Spring Security 로그인 시, 세션 유지 안되는 현상

by 1223v 2024. 9. 30.

(ver.스프링부트 3.x , 스프링 시큐리티 6)

 

문제 인식


Spring Security를 통해 세션방식 로그인 개발 진행 중,  로그인 시도 시 정상적으로 인증정보를 바인딩하고 있으나, 페이지 이동 시 인증정보가 없어지는 것을 발견했습니다.

이에 해결과정과 코드를 공유하고자 합니다.

 

기존 코드의 문제점은 다음으로 추측했었습니다.


SecurityContextPersistenceFilter란?

 

 

SecurityContextPersistenceFilter

 

 

  • SecurityContextPersistenceFilter는 Spring Security에서 매우 중요한 필터 중 하나로, HTTP 요청이 들어올 때 SecurityContext를 세션에서 복원하고, 요청이 완료되면 SecurityContext를 세션에 저장하는 역할을 합니다.
  • 이 필터는 기본적으로 SecurityContextHolder가 관리하는 인증 정보를 요청 사이에서 지속적으로 유지할 수 있도록 합니다. 만약 이 필터가 없으면, 인증 정보가 요청 간에 사라지며 세션을 통해 인증 정보를 유지할 수 없게 됩니다.

 

 

작동 방식

  1. 요청이 들어올 때: SecurityContextPersistenceFilter는 세션에서 SecurityContext를 가져와 SecurityContextHolder에 저장합니다. 이를 통해 인증 정보가 요청마다 재사용됩니다.
  2. 요청이 완료될 때: 요청이 완료되면 SecurityContext에 저장된 인증 정보를 다시 세션에 저장하거나, 인증 정보가 없으면 세션에서 제거합니다.

 

 

해결


http.addFilterBefore(new SecurityContextPersistenceFilter(), BasicAuthenticationFilter.class);

 

 

  • BasicAuthenticationFilter.class: Spring Security에서 HTTP Basic 인증을 처리하는 필터입니다. SecurityContextPersistenceFilter는 이 필터보다 먼저 실행되어, 인증이 이루어지기 전에 세션에서 SecurityContext를 복원할 수 있도록 합니다.

 

 

 

고찰


아무래도 가장 큰 요인은 "특정 필터의 순서 문제" 라고 생각합니다.

Spring Security는 기본적으로 필터 체인을 통해 보안 관련 로직을 처리합니다. 특정 필터가 올바른 순서로 실행되지 않으면 인증 정보가 요청 간에 유지되지 않을 수 있습니다. SecurityContextPersistenceFilter를 적절한 위치에 추가함으로써 인증 정보가 세션을 통해 요청 간에 지속적으로 유지되고 복원되었기 때문에 문제가 해결된 것 같습니다.

 

SecurityContextPersistenceFilter는 인증 정보를 세션에서 복원하고 저장하는 역할을 하며, 필터 체인에서 올바른 위치에 추가되지 않으면 인증 정보가 제대로 유지되지 않을 수 있습니다.

addFilterBefore()를 통해 SecurityContextPersistenceFilter를 BasicAuthenticationFilter 앞에 추가하면 인증 정보가 세션에서 올바르게 복원되어 문제가 해결됩니다.

댓글