(ver.스프링부트 3.x , 스프링 시큐리티 6)
문제 인식
Spring Security를 통해 세션방식 로그인 개발 진행 중, 로그인 시도 시 정상적으로 인증정보를 바인딩하고 있으나, 페이지 이동 시 인증정보가 없어지는 것을 발견했습니다.
이에 해결과정과 코드를 공유하고자 합니다.
기존 코드의 문제점은 다음으로 추측했었습니다.
SecurityContextPersistenceFilter란?
SecurityContextPersistenceFilter
- SecurityContextPersistenceFilter는 Spring Security에서 매우 중요한 필터 중 하나로, HTTP 요청이 들어올 때 SecurityContext를 세션에서 복원하고, 요청이 완료되면 SecurityContext를 세션에 저장하는 역할을 합니다.
- 이 필터는 기본적으로 SecurityContextHolder가 관리하는 인증 정보를 요청 사이에서 지속적으로 유지할 수 있도록 합니다. 만약 이 필터가 없으면, 인증 정보가 요청 간에 사라지며 세션을 통해 인증 정보를 유지할 수 없게 됩니다.
작동 방식
- 요청이 들어올 때: SecurityContextPersistenceFilter는 세션에서 SecurityContext를 가져와 SecurityContextHolder에 저장합니다. 이를 통해 인증 정보가 요청마다 재사용됩니다.
- 요청이 완료될 때: 요청이 완료되면 SecurityContext에 저장된 인증 정보를 다시 세션에 저장하거나, 인증 정보가 없으면 세션에서 제거합니다.
해결
http.addFilterBefore(new SecurityContextPersistenceFilter(), BasicAuthenticationFilter.class);
- BasicAuthenticationFilter.class: Spring Security에서 HTTP Basic 인증을 처리하는 필터입니다. SecurityContextPersistenceFilter는 이 필터보다 먼저 실행되어, 인증이 이루어지기 전에 세션에서 SecurityContext를 복원할 수 있도록 합니다.
고찰
아무래도 가장 큰 요인은 "특정 필터의 순서 문제" 라고 생각합니다.
Spring Security는 기본적으로 필터 체인을 통해 보안 관련 로직을 처리합니다. 특정 필터가 올바른 순서로 실행되지 않으면 인증 정보가 요청 간에 유지되지 않을 수 있습니다. SecurityContextPersistenceFilter를 적절한 위치에 추가함으로써 인증 정보가 세션을 통해 요청 간에 지속적으로 유지되고 복원되었기 때문에 문제가 해결된 것 같습니다.
SecurityContextPersistenceFilter는 인증 정보를 세션에서 복원하고 저장하는 역할을 하며, 필터 체인에서 올바른 위치에 추가되지 않으면 인증 정보가 제대로 유지되지 않을 수 있습니다.
addFilterBefore()를 통해 SecurityContextPersistenceFilter를 BasicAuthenticationFilter 앞에 추가하면 인증 정보가 세션에서 올바르게 복원되어 문제가 해결됩니다.
'개발' 카테고리의 다른 글
[React] 음원, 녹음 동시 작업 실행 시, 녹음 품질 저하 문제 해결 및 고찰 (0) | 2024.09.23 |
---|---|
단위테스트 적응기 1편 (1) | 2024.07.16 |
인증 방식 선택에 대한 고민과 고찰 (Session vs Token)[Feat. 레디베리] (1) | 2024.07.03 |
Redis로 RT 마이그레이션 적용기 및 유닛테스트 (0) | 2024.03.14 |
[React] 검색 디바운싱(Debouncing) 적용 (0) | 2024.01.13 |
댓글