Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

걸음마부터 달리기

[24/11/14] 시큐리티 SecurityContextHolder, SecurityContext , SecurityContextHolderFilter 흐름 본문

카테고리 없음

[24/11/14] 시큐리티 SecurityContextHolder, SecurityContext , SecurityContextHolderFilter 흐름

성추 2024. 11. 14. 21:40

일단 첫 스텝에서는 Access 토큰만 발급하는걸로 구현을 진행해보았다.

Access 토큰이 탈취 당했을때를 대비하여 만료 시간을 짧게 잡고 Access 토큰이 만료되면 Refresh 토큰으로 재발급 받는 과정으로 가야하는데 그건 다음 스텝때...

 

https://bestdevelop-lab.tistory.com/82

 

SecurityContextRepository / SecurityContextHolderFilter

SecurityContextRepository 스프링 시큐리티에서 사용자가 인증 이후 요청에 대해 계속 사용자의 인증을 유지하기 위해 사용되는 클래스Repository ⇒ 인증 상태를 유지하기 위한 저장소인증 상태의 영속

bestdevelop-lab.tistory.com

https://itvillage.tistory.com/60

 

JWT 자격 검증 시, SecurityContext는 언제 비워(clear)질까?

클라이언트 쪽에서 전송한 username과 password에 대한 인증을 처리하는 JwtAuthenticationFilter(UsernamePassworAuthenticationFilter를 확장)에서 로그인 인증에 성공한 뒤, JWT를 클라이언트 쪽에 응답으로 전달했

itvillage.tistory.com

https://velog.io/@dbfla0628/Spring-Security-3.-SecurityContextHolderFilter

 

[Spring Security] 3. SecurityContextHolderFilter

SecurityContextHolderFilter

velog.io

SecurityContextHolder는 쓰레드로컬 방식으로 같은 스레드에서는 공유함.

1) SecurityContextHolderFilter에서 현재 들어온 request와 관련하여 이전에 저장한 SecurityContext를 찾음.

이것은 SecurityContextRepository를 통하여 하나의 세션에서 공유되는 HttpSession을 통해 HttpSession에 저장되어 있는 SecurityContext를 찾아보고

2-1-1) 없다면 일단 권한 없는 빈 SecurityContext를 만들어서 SecurityContextHolder에 설정한다.

2-1-2) doFilter()로 다음필터로 감

2-1-3) 필터 쭉쭉 가다가 이제 Authentication 관련 필터인 AuthenticationFilter가 나오면 해당 필터에서 인증과정을 거친 후 SecurityContext에 Authentication 객체를 만들어서 주입함.

2-1-4) 이제 다음 request땐 이 SecurityContext와 Authentication 객체를 바로 가져다 쓰기 위해서  SecurityContextRepository를 통해 HttpSession에 저장

2-1-5) 이후 다음 필터 쭉쭉 가다가 AuthorizationFilter에서 SecurityContextHolder의 현재 SecurityContext를 조회하고, 그 안에 있는 Authentication 객체를 확인한다. 그 Authentication 객체 안에 있는 GrantedAuthority를 가져와서 체인에 걸려있던 요청된 URL과 메서드에 대한 접근 권한을 정의한 설정(예: hasRole, permitAll, 등)을 확인한다.

2-1-6-1) 만약 여기서 이제 인가의 문제(사용자 인증은 됐는데 권한이 부족할때) 가 생기면

AccessDeniedException  예외가 터져 ExceptionTranslationFilter가 AccessDeniedHandler를 호출

인증 자체가 안됐거나 인증의 문제가 생기면

AutheticationException 예외가 터져 ExceptionTranslationFilter가 AuthenticationEntryPoint에게 위임.

2-1-6-2) 제대로 인증/인가 되었을시 이제 드디어 디스패처 서블릿을 통해 스프링으로 진입한다.

 

 

2-1-2) HttpSession에 저장되어 있는 SecurityContext이 있으니까 그대로 SecurityContextHolder에 SecurityContext 주입하고 바로 다음 필터로 넘기면 그 이후는 2-1-5) 와 동일.

 

 

이후 스프링쪽에서 전부 할일 다 하고 리턴되면서 필터의 return문까지 오게 된다. 

이후에는 필터의 역순서로 하나씩 return 되면서 SecurityContextHolderFilter에서 request때 SecurityContextHolder에 넣었던 SecurityContext를 제거하고 리턴되면서 Response로 나간다.

 

이렇게 없애놔야 다음 요청때 똑같은 과정을 거칠 수 있다.

 

결국엔 커스텀 필터(Custom Authentication Filter) 를 쓸거면 

Authentication과 SecurityContext를 Holder에 넣는것뿐만 아니라 세션을 쓴다면 세션까지 넣어야한다.