일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 엔티티 그래프
- 멀티프로세서
- 운영체제
- 최소힙
- posix
- 점근적 표기법
- MSA
- jpa n+1 문제
- AVL트리
- 백준장학금
- Kruskal
- python
- JVM
- 이분탐색이란
- 백준 장학금
- heapq
- 완전이진트리
- SpringSecurity
- 자료구조
- JPA
- HTTP
- 프로세스
- 연결리스트
- 알고리즘
- 연결리스트 종류
- 힙트리
- 최대 힙
- 스케줄링
- spring
- 강화학습
- Today
- Total
KKanging
[SpringSecurity] SecurityContextFilter 코드 뜯어보기 본문
SecurityContextFilter의 역할
SecurityContextFilter은 세션 기반의 서버를 구현했을 때 사용자가 인증을 기반을 하는 요청을 보낼 때 세션 id에 해당하는 SecurityContext 를 가져오고 ContextHolder에 Load한다.
코드 뜯어보기
SecurityContextHolderFilter
GenericFilterBean을 상속 받고
SecurityContetRepository 와 SecurityContextHolderStrategy 를 참조 한다.
request에 이 FILTER를 거쳤다는 확인을 위해 값을 저장한다.
securityContextRepository로 사용자가 보낸 세션 id에 해당하는 객체를 세션 DB에서 조회후 가져온다.
Supplier은 지연된 로딩을 지원하는 문법이므로 따로 공부하면 될거 같다.
SecurityContextRepository 로 가져온 Context를 securityContextHolderStrategy 로 ContextHolder에 저장한다.
securityContextHolderStrategy 에 대해 궁금하다면
[SpringSecurity] SecurityContextHolder ,Security Context, Authentication (tistory.com)
그리고 finally로 context를 비우고 request 에 값을 삭제한다.
SecurityContextRepository
위에 설명과 같이 SecurityContextRepository로 세션에 인증 정보를 가져온다.
하지만 Session DB를 운영하는데에 여러가지 방법이 있다(메모리, rediss…)
그래서 SecurityContextRepository은 인터페이스로 구현되었고 다음과 같이 구현되어있다.
구현체들 정리
- HttpSessionSecurityContextRepository (Default)
- 서버 세션 기반 구현체
- NullSecurityContextRepository
- JWT를 구현할 때 STATELESS 로 설정하는데 쓰임
- 즉 세션을 사용하지 않을 때 사용 (아무 기능이 없음)
- RequestAttributeSecurityContextRepository
- HttpServletRequest에 값을 저장
- 커스텀 필터 등록
- 세션DB를 조회하는 로직을 커스텀할려면 다음과 같이 등록하면된다.
-
public SecurityFilterChain filterChain(HttpSecurity http) { http // ... .securityContext((securityContext) -> securityContext .securityContextRepository(new RequestAttributeSecurityContextRepository()) ); return http.build(); }
-
- DelegatingSecurityContextRepository
- 여러 로직을 적용하여 등록할 수 있게 할 수 있다.
- DelegatingSecurityContextRepository가 List로 Repository를 가지고 하나씩 탐색하여 실행한다.DelegatingSecurityContextRepository
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
// ...
.securityContext((securityContext) -> securityContext
.securityContextRepository(new DelegatingSecurityContextRepository(
new RequestAttributeSecurityContextRepository(),
new HttpSessionSecurityContextRepository()
))
);
return http.build();
}
SecurityContextPersistenceFilter
예전에 SecurityContextPersistenceFilter 를 사용했었다.
무슨 차이점이 있을까
위에 사진이 SecurityContextPersistenceFilter 로직이고
아래 사진이 SecuirtyContextFilter 이다.
차이점은 마지막 finally로 세션을 업데이트 하냐 안하냐 차이다.
만약 user의 정보를 수정하는 로직이 수행됐다면 SecuirtyContextFilter 는 업데이트 안하므로 이점을 유의해서 따로 구현하던지 해야한다.
참고 문헌
'백엔드 > SpringSecurity' 카테고리의 다른 글
[SpringSecurity] 인증 과정 뜯어보기 (0) | 2024.05.26 |
---|---|
[SpringSecurity] Cors 와 CorsFilter 뜯어보기 (0) | 2024.05.24 |
[SpringSecurity] security filter 커스텀 기초 와GenericFilterBean,OncePerRequestFilter (0) | 2024.05.22 |
[SpringSecurity] SecurityContextHolder ,Security Context, Authentication (0) | 2024.05.19 |
[SpringSecurity] Security 전체적인 아키텍처 (0) | 2024.05.17 |